模擬實現進程調度——采用高優先數優先和先來服務算法
進程調度算法:采用最高優先數優先的調度算法(即把處理機分配給優先數最高的進程)和先來先服務算法。 每個進程有一個進程控制塊
進程調度算法:采用最高優先數優先的調度算法(即把處理機分配給優先數最高的進程)和先來先服務算法。
每個進程有一個進程控制塊( PCB)表示。進程控制塊可以包含如下信息:進程名、優先數、到達時間、需要運行時間、已用CPU時間、進程狀態等等。
進程的優先數及需要的運行時間可以事先人為地指定(也可以由隨機數產生)。進程的到達時間為進程輸入的時間。
進程的運行時間以時間片為單位進行計算。每個進程的狀態可以是就緒 W(Wait)、運行R(Run)、或完成F(Finish)三種狀態之一。
就緒進程獲得 CPU后都只能運行一個時間片。用已占用CPU時間加1來表示。
如果運行一個時間片后,進程的已占用 CPU時間已達到所需要的運行時間,則撤消該進程,如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續運行,此時應將進程的優先數減1(即降低一級),然后把它插入就緒隊列等待CPU。每進行一次調度程序都打印一次運行進程、就緒隊列、以及各個進程的 PCB,以便進行檢查。重復以上過程,直到所要進程都完成為止。
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #define getpch(type) (type*)malloc(sizeof(type))
- struct pcb /* 定義進程控制塊PCB */
- {
- char name[10];
- char state;
- int super;
- int ntime;
- int rtime;
- struct pcb* link;
- }*ready = NULL, *p;
- typedef struct pcb PCB;
- sort() /* 建立對進程進行優先級排列函數*/
- {
- PCB *first, *second;
- int insert = 0;
- if ((ready == NULL) || ((p->super) > (ready->super))) /*優先級最大者,插入隊首*/
- {
- p->link = ready;
- ready = p;
- }
- else /* 進程比較優先級,插入適當的位置中*/
- {
- first = ready;
- second = first->link;
- while (second != NULL)
- {
- if ((p->super) > (second->super)) /*若插入進程比當前進程優先數大,*/
- { /*插入到當前進程前面*/
- p->link = second;
- first->link = p;
- second = NULL;
- insert = 1;
- }
- else /* 插入進程優先數最低,則插入到隊尾*/
- {
- first = first->link;
- second = second->link;
- }
- }
- if (insert == 0) first->link = p;
- }
- }
- input() /* 建立進程控制塊函數*/
- {
- int i, num;
- printf("\n 請輸入進程數?");
- scanf("%d", &num);
- for (i = 0; i < num; i++)
- {
- printf("\n 進程號No.%d:\n", i);
- p = getpch(PCB);
- printf("\n 輸入進程名:");
- scanf("%s", p->name);
- printf("\n 輸入進程優先數:");
- scanf("%d", &p->super);
- printf("\n 輸入進程運行時間:");
- scanf("%d", &p->ntime);
- printf("\n");
- p->rtime = 0; p->state = 'w';
- p->link = NULL;
- sort(); /* 調用sort函數*/
- }
- }
- int space()
- {
- int l = 0; PCB* pr = ready;
- while (pr != NULL)
- {
- l++;
- pr = pr->link;
- }
- return(l);
- }
- disp(PCB * pr) /*建立進程顯示函數,用于顯示當前進程*/
- {
- 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() /* 建立進程查看函數 */
- {
- PCB* pr;
- printf("\n **** 當前正在運行的進程是:%s", p->name); /*顯示當前運行進程*/
- disp(p);
- pr = ready;
- printf("\n ****當前就緒隊列狀態為:\n"); /*顯示就緒隊列狀態*/
- while (pr != NULL)
- {
- disp(pr);
- pr = pr->link;
- }
- }
- destroy() /*建立進程撤消函數(進程運行結束,撤消進程)*/
- {
- printf("\n 進程 [%s] 已完成.\n", p->name);
- free(p);
- }
- running() /* 建立進程就緒函數(進程運行時間到,置就緒狀態*/
- {
- (p->rtime)++;
- if (p->rtime == p->ntime)
- destroy(); /* 調用destroy函數*/
- else
- {
- (p->super)--;
- p->state = 'w';
- sort(); /*調用sort函數*/
- }
- }
- main() /*主函數*/
- {
- 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 按任一鍵繼續......");
- ch = getchar();
- }
- printf("\n\n 進程已經完成.\n");
- ch = getchar();
- }
責任編輯:售電衡衡
免責聲明:本文僅代表作者個人觀點,與本站無關。其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關內容。
我要收藏
個贊
-
權威發布 | 新能源汽車產業頂層設計落地:鼓勵“光儲充放”,有序推進氫燃料供給體系建設
2020-11-03新能源,汽車,產業,設計 -
中國自主研制的“人造太陽”重力支撐設備正式啟運
2020-09-14核聚變,ITER,核電 -
探索 | 既耗能又可供能的數據中心 打造融合型綜合能源系統
2020-06-16綜合能源服務,新能源消納,能源互聯網
-
新基建助推 數據中心建設將迎爆發期
2020-06-16數據中心,能源互聯網,電力新基建 -
泛在電力物聯網建設下看電網企業數據變現之路
2019-11-12泛在電力物聯網 -
泛在電力物聯網建設典型實踐案例
2019-10-15泛在電力物聯網案例
-
權威發布 | 新能源汽車產業頂層設計落地:鼓勵“光儲充放”,有序推進氫燃料供給體系建設
2020-11-03新能源,汽車,產業,設計 -
中國自主研制的“人造太陽”重力支撐設備正式啟運
2020-09-14核聚變,ITER,核電 -
能源革命和電改政策紅利將長期助力儲能行業發展
-
探索 | 既耗能又可供能的數據中心 打造融合型綜合能源系統
2020-06-16綜合能源服務,新能源消納,能源互聯網 -
5G新基建助力智能電網發展
2020-06-125G,智能電網,配電網 -
從智能電網到智能城市