抢占式优先级调度算法是什么意思


系统把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。

 

 本教程操作环境: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 }
View Code

输出实例

输入:

 

 输出:

 

 

 

 

 

 以上就是抢占式优先级调度算法是什么意思的详细内容。(拼多多培训


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM