模擬實(shí)現(xiàn)進(jìn)程調(diào)度——采用高優(yōu)先數(shù)優(yōu)先和先來(lái)服務(wù)算法
進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來(lái)先服務(wù)算法。
每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊( PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。
進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。
進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。每個(gè)進(jìn)程的狀態(tài)可以是就緒 W(Wait)、運(yùn)行R(Run)、或完成F(Finish)三種狀態(tài)之一。
就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來(lái)表示。
如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待CPU。每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #define getpch(type) (type*)malloc(sizeof(type))
- struct pcb /* 定義進(jìn)程控制塊PCB */
- {
- char name[10];
- char state;
- int super;
- int ntime;
- int rtime;
- struct pcb* link;
- }*ready = NULL, *p;
- typedef struct pcb PCB;
- sort() /* 建立對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)排列函數(shù)*/
- {
- PCB *first, *second;
- int insert = 0;
- if ((ready == NULL) || ((p->super) > (ready->super))) /*優(yōu)先級(jí)最大者,插入隊(duì)首*/
- {
- p->link = ready;
- ready = p;
- }
- else /* 進(jìn)程比較優(yōu)先級(jí),插入適當(dāng)?shù)奈恢弥?/
- {
- first = ready;
- second = first->link;
- while (second != NULL)
- {
- if ((p->super) > (second->super)) /*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)大,*/
- { /*插入到當(dāng)前進(jìn)程前面*/
- p->link = second;
- first->link = p;
- second = NULL;
- insert = 1;
- }
- else /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊(duì)尾*/
- {
- first = first->link;
- second = second->link;
- }
- }
- if (insert == 0) first->link = p;
- }
- }
- input() /* 建立進(jìn)程控制塊函數(shù)*/
- {
- int i, num;
- printf("\n 請(qǐng)輸入進(jìn)程數(shù)?");
- scanf("%d", &num);
- for (i = 0; i < num; i++)
- {
- printf("\n 進(jìn)程號(hào)No.%d:\n", i);
- p = getpch(PCB);
- printf("\n 輸入進(jìn)程名:");
- scanf("%s", p->name);
- printf("\n 輸入進(jìn)程優(yōu)先數(shù):");
- scanf("%d", &p->super);
- printf("\n 輸入進(jìn)程運(yùn)行時(shí)間:");
- scanf("%d", &p->ntime);
- printf("\n");
- p->rtime = 0; p->state = 'w';
- p->link = NULL;
- sort(); /* 調(diào)用sort函數(shù)*/
- }
- }
- int space()
- {
- int l = 0; PCB* pr = ready;
- while (pr != NULL)
- {
- l++;
- pr = pr->link;
- }
- return(l);
- }
- disp(PCB * pr) /*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/
- {
- printf("\n qname \t state \t super \t ndtime \t runtime \n");
- printf("|%s\t", pr->name);
- printf("|%c\t", pr->state);
- printf("|%d\t", pr->super);
- printf("|%d\t", pr->ntime);
- printf("|%d\t", pr->rtime);
- printf("\n");
- }
- check() /* 建立進(jìn)程查看函數(shù) */
- {
- PCB* pr;
- printf("\n **** 當(dāng)前正在運(yùn)行的進(jìn)程是:%s", p->name); /*顯示當(dāng)前運(yùn)行進(jìn)程*/
- disp(p);
- pr = ready;
- printf("\n ****當(dāng)前就緒隊(duì)列狀態(tài)為:\n"); /*顯示就緒隊(duì)列狀態(tài)*/
- while (pr != NULL)
- {
- disp(pr);
- pr = pr->link;
- }
- }
- destroy() /*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/
- {
- printf("\n 進(jìn)程 [%s] 已完成.\n", p->name);
- free(p);
- }
- running() /* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)*/
- {
- (p->rtime)++;
- if (p->rtime == p->ntime)
- destroy(); /* 調(diào)用destroy函數(shù)*/
- else
- {
- (p->super)--;
- p->state = 'w';
- sort(); /*調(diào)用sort函數(shù)*/
- }
- }
- main() /*主函數(shù)*/
- {
- int len, h = 0;
- char ch;
- input();
- len = space();
- while ((len != 0) && (ready != NULL))
- {
- ch = getchar();
- h++;
- printf("\n The execute number:%d \n", h);
- p = ready;
- ready = p->link;
- p->link = NULL;
- p->state = 'R';
- check();
- running();
- printf("\n 按任一鍵繼續(xù)......");
- ch = getchar();
- }
- printf("\n\n 進(jìn)程已經(jīng)完成.\n");
- ch = getchar();
- }
責(zé)任編輯:售電衡衡
-
權(quán)威發(fā)布 | 新能源汽車產(chǎn)業(yè)頂層設(shè)計(jì)落地:鼓勵(lì)“光儲(chǔ)充放”,有序推進(jìn)氫燃料供給體系建設(shè)
2020-11-03新能源,汽車,產(chǎn)業(yè),設(shè)計(jì) -
中國(guó)自主研制的“人造太陽(yáng)”重力支撐設(shè)備正式啟運(yùn)
2020-09-14核聚變,ITER,核電 -
探索 | 既耗能又可供能的數(shù)據(jù)中心 打造融合型綜合能源系統(tǒng)
2020-06-16綜合能源服務(wù),新能源消納,能源互聯(lián)網(wǎng)
-
新基建助推 數(shù)據(jù)中心建設(shè)將迎爆發(fā)期
2020-06-16數(shù)據(jù)中心,能源互聯(lián)網(wǎng),電力新基建 -
泛在電力物聯(lián)網(wǎng)建設(shè)下看電網(wǎng)企業(yè)數(shù)據(jù)變現(xiàn)之路
2019-11-12泛在電力物聯(lián)網(wǎng) -
泛在電力物聯(lián)網(wǎng)建設(shè)典型實(shí)踐案例
2019-10-15泛在電力物聯(lián)網(wǎng)案例
-
新基建之充電樁“火”了 想進(jìn)這個(gè)行業(yè)要“心里有底”
2020-06-16充電樁,充電基礎(chǔ)設(shè)施,電力新基建 -
燃料電池汽車駛?cè)雽こ0傩占疫€要多久?
-
備戰(zhàn)全面電動(dòng)化 多部委及央企“定調(diào)”充電樁配套節(jié)奏
-
權(quán)威發(fā)布 | 新能源汽車產(chǎn)業(yè)頂層設(shè)計(jì)落地:鼓勵(lì)“光儲(chǔ)充放”,有序推進(jìn)氫燃料供給體系建設(shè)
2020-11-03新能源,汽車,產(chǎn)業(yè),設(shè)計(jì) -
中國(guó)自主研制的“人造太陽(yáng)”重力支撐設(shè)備正式啟運(yùn)
2020-09-14核聚變,ITER,核電 -
能源革命和電改政策紅利將長(zhǎng)期助力儲(chǔ)能行業(yè)發(fā)展
-
探索 | 既耗能又可供能的數(shù)據(jù)中心 打造融合型綜合能源系統(tǒng)
2020-06-16綜合能源服務(wù),新能源消納,能源互聯(lián)網(wǎng) -
5G新基建助力智能電網(wǎng)發(fā)展
2020-06-125G,智能電網(wǎng),配電網(wǎng) -
從智能電網(wǎng)到智能城市
-
山西省首座電力與通信共享電力鐵塔試點(diǎn)成功
-
中國(guó)電建公司公共資源交易服務(wù)平臺(tái)摘得電力創(chuàng)新大獎(jiǎng)
-
電力系統(tǒng)對(duì)UPS的技術(shù)要求