系统把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。
本教程操作环境:windows7系统、C++17版本、Dell G3电脑。
抢占式优先权调度算法
在这种方式下,系统把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。
具体代码:

1 #include #include #include using namespace std;using std::cout;struct PCB 2 3 { // 进程名 4 5 string name; // 到达时间 6 7 int arrivetime; // 运行时间 8 9 int runtime; 10 11 // 仍需运行时间 12 13 int resttime; // 开始时间 14 15 int starttime; // 完成时间 16 17 int endtime; // 运行次数 18 19 int runcount; // 周转时间 20 21 int zhouzhuangtime; // 带权周转时间(周转时间/运行时间) 22 23 double weightzhouzhuangtime; // 优先级(静态) 24 25 int priority; 26 27 28 29 PCB *next; 30 31 };// 进程数int num_process;// 记录所有进程的总时间int totaltime;// 记录所有进程的总带权周转时间double weighttotaltime; 32 33 34 35 PCB *createPCB() 36 37 { int i; // 定义队首、队尾 38 39 PCB *head, *rear; // 初始化 40 41 head = rear = NULL; // 临时指针变量 42 43 PCB *p; cout<<"请输入进程数量:"; cin>>num_process; for(i = 0; i < num_process; i++) 44 45 { // 初始化一个空间给进程 46 47 p = new PCB; cout<<"请依次输入第"<>p->name>>p->priority>>p->arrivetime>>p->runtime; 48 49 p->resttime = p->runtime; 50 51 p->runcount = 1; 52 53 totaltime += p->runtime; 54 55 p->starttime = 0; 56 57 p->endtime = 0; 58 59 p->zhouzhuangtime = 0; 60 61 p->weightzhouzhuangtime = 0; 62 63 p->next = NULL; // 存入链表中 64 65 if(rear == NULL) 66 67 { 68 69 head = p; 70 71 rear = p; 72 73 } else 74 75 { 76 77 rear->next = p; 78 79 rear = p; 80 81 } 82 83 84 85 } return head; 86 87 }// 链表插入排序PCB *insertSort(PCB *head) 88 89 { /* 90 91 1、先在原链表中以第一个节点为一个有序链表,其余节点为待定节点; 92 93 2、从待定节点中取节点,插入到有序链表中相应位置; 94 95 3、实际上只有一条链表,在排序中,实际只增加了一个用于指向剩下需要排序节点的头指针。 96 97 */ 98 99 PCB *first;// 为原链表剩下用于直接插入排序的节点头指针 100 101 PCB *t; // 临时指针变量:要插入的节点 102 103 PCB *p; // 临时指针变量:要插入的位置 104 105 PCB *q; // 临时指针变量:指向原链表 106 107 108 109 first = head->next; 110 111 head->next = NULL; // 只含有一个节点的链表的有序链表 112 113 114 115 while(first != NULL) // 遍历剩下的无序链表 116 117 { // 无序节点在有序链表中找插入位置p 118 119 for(t = first, q = head; (q != NULL) && (q->arrivetime < t->arrivetime); p = q, q = q->next); // 无序链表中的节点离开,以便插入到有序链表中 120 121 first = first->next; if(q == head)// 插入在第一个节点之前 122 123 { 124 125 head = t; 126 127 } else// p是q的前驱 128 129 { 130 131 p->next = t; 132 133 } 134 135 t->next = q;// 完成插入动作 136 137 } return head; 138 139 }// 获取当前时间段内的进程数量int getCurrentNumOfProcess(PCB *head, int time) 140 141 { int count = 0; 142 143 PCB *t;// 临时指针变量,指向链表 144 145 t = head; while(t != NULL && t->arrivetime <= time) 146 147 { 148 149 count++; 150 151 t = t->next; 152 153 } return count; 154 155 }// 删除当前节点PCB* deletePCB(PCB *head, PCB *t) 156 157 { 158 159 PCB *p, *q; 160 161 p = head; 162 163 q = p->next; // 删除节点是头节点 164 165 if(t == head) 166 167 { 168 169 head = head->next; 170 171 } else 172 173 { while(q != t)// 跳出循环之后q为该节点,p为前一节点 174 175 { 176 177 p = p->next; 178 179 q = p->next; 180 181 } if(t->next == NULL)// 删除节点是尾节点 182 183 p->next = NULL; else 184 185 p->next = q->next; 186 187 } // 删除 188 189 free(t); return head; 190 191 }// 在头节点后的count个节点中选择优先数最大的返回PCB *findMaxPriority(PCB *head, int count) 192 193 { int max; 194 195 PCB *p, *q, *f; 196 197 q = head; 198 199 max = q->priority; 200 201 f = q; while(count > 0) 202 203 { if(q->priority > max) 204 205 { 206 207 max = q->priority; 208 209 f = q; 210 211 } 212 213 count--; 214 215 q =q->next; 216 217 } return f; 218 219 220 221 }/* 222 223 输出a时间内的特定输出格式,当某一时间段内没有进程工作时,进程名称为0 224 225 进程名称.进程工作时间,进程与进程间以|分隔 226 227 输入:1 3 2 8 228 229 2 2 1 7 230 231 3 6 3 12 232 233 输出:[0.1|2.1|1.1|3.12|1.7|2.6|0.172] 234 235 */void print(vector vec_output, int a) 236 237 { for(int i = 0; i < vec_output.size(); i++) 238 239 { cout<<"******************************************"< 240 } // 输出周转时间信息,只有进程结束了才输出 241 242 int i; for(i = 0; i < vec_output.size()-1; i++) 243 244 { bool flag = true; for(int j = i+1; j < vec_output.size(); j++) 245 246 { if(vec_output[j].name == vec_output[i].name) 247 248 { 249 250 flag = false; break; 251 252 } 253 254 } if(flag) 255 256 { cout<<"进程"< 257 } 258 259 } cout<<"进程"< 260 cout<<"平均周转时间:"< 0) 261 262 { cout<<"0."< 263 } if(vec_output[vec_output.size() - 1].endtime < a) 264 265 { for(int i = 0; i < vec_output.size(); i++) 266 267 { cout< 268 if(i+1 < vec_output.size() && vec_output[i].endtime != vec_output[i+1].starttime) 269 270 { cout<<"0."< 271 } 272 273 } cout<<"0."< 274 } else if(vec_output[vec_output.size() - 1].endtime == a) 275 276 { for(int i = 0; i < vec_output.size()-1; i++) 277 278 { cout< 279 if(i+1 < vec_output.size() && vec_output[i].endtime != vec_output[i+1].starttime) 280 281 { cout<<"0."< 282 } 283 284 } cout< 285 } else 286 287 { for(int i = 0; i < vec_output.size(); i++) 288 289 { if(vec_output[i].endtime <= a) 290 291 { cout< 292 if(i+1 < vec_output.size() && vec_output[i].endtime != vec_output[i+1].starttime) 293 294 { cout<<"0."< 295 } 296 297 } else 298 299 { cout< 300 } 301 302 } 303 304 } 305 306 }void PCB_MAIN(PCB *head) 307 308 { 309 310 head = insertSort(head); int time = 0;// 模拟时间变量 311 312 int count;// 当前时间内运行的进程数量 313 314 PCB *q; vector vec_out;//输出 315 316 PCB temp; while(head != NULL) 317 318 { 319 320 count = getCurrentNumOfProcess(head, time); if(count == 0) 321 322 time++; else 323 324 { /************************************************************************/ 325 326 /* 抢占式 */ 327 328 /************************************************************************/ 329 330 // 找出优先数最大的线程 331 332 q = findMaxPriority(head, count); if(q->runcount == 1)// 该进程第一次运行 333 334 { 335 336 q->starttime = time; // 输出信息 337 338 temp = *q; 339 340 temp.endtime = 0; 341 342 temp.next = NULL; if(vec_out.size() != 0 && vec_out[vec_out.size()-1].endtime == 0) 343 344 { 345 346 vec_out[vec_out.size()-1].endtime = temp.starttime; 347 348 } 349 350 vec_out.push_back(temp); 351 352 } 353 354 ++time; 355 356 ++q->runcount; 357 358 --q->resttime; if(q->resttime == 0)// 该进程运行结束 359 360 { // 记录结束时间 361 362 q->endtime = time; // 计算周转时间 363 364 q->zhouzhuangtime = time - q->arrivetime; // 计算带权周转时间 365 366 q->weightzhouzhuangtime = q->zhouzhuangtime/(double)q->runtime; 367 368 weighttotaltime += q->weightzhouzhuangtime; // 输出信息 369 370 temp = *q; 371 372 temp.starttime = 0; 373 374 temp.next = NULL; if(vec_out[vec_out.size()-1].name == temp.name) 375 376 { 377 378 vec_out[vec_out.size()-1].endtime = temp.endtime; 379 380 vec_out[vec_out.size()-1].zhouzhuangtime = temp.zhouzhuangtime; 381 382 vec_out[vec_out.size()-1].weightzhouzhuangtime = temp.weightzhouzhuangtime; 383 384 } else 385 386 { 387 388 temp.starttime = vec_out[vec_out.size()-1].endtime; 389 390 vec_out.push_back(temp); 391 392 } // 删除该进程 393 394 //deletePCB(q); 395 396 head = deletePCB(head, q); 397 398 } 399 400 } 401 402 } // 输出200时间单位内的执行顺序 403 404 print(vec_out, 200); 405 406 }int main() 407 408 { 409 410 PCB *head = NULL; 411 412 head = createPCB(); 413 414 PCB_MAIN(head); return 0; 415 416 }
输出实例
输入:
输出:
以上就是抢占式优先级调度算法是什么意思的详细内容。(拼多多培训)