模擬進程調(diào)度算法課程設(shè)計(20210426143513)_第1頁
模擬進程調(diào)度算法課程設(shè)計(20210426143513)_第2頁
模擬進程調(diào)度算法課程設(shè)計(20210426143513)_第3頁
模擬進程調(diào)度算法課程設(shè)計(20210426143513)_第4頁
模擬進程調(diào)度算法課程設(shè)計(20210426143513)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、課程概述11 設(shè)計構(gòu)想程序能夠完成以下操作:創(chuàng)建進程:先輸入進程的數(shù)目,再一次輸入每個進程的進程名、 運行總時間和優(yōu)先級,先到達的先輸入;進程調(diào)度:進程創(chuàng)建完成后就選擇進程調(diào)度算法,并 單步執(zhí)行,每次執(zhí)行的結(jié)果都從屏幕上輸出來。1.2.需求分析在多道程序環(huán)境下,主存中有著多個進程,其數(shù)目往往多于處理機數(shù)目,要使這多個進程能夠 并發(fā)地執(zhí)行,這就要求系統(tǒng)能按某種算法,動態(tài)地把處理機分配給就緒隊列中的一個進程,使 之執(zhí)行。分配處理機的任務(wù)是由處理機調(diào)度程序完成的。由于處理機是最重要的計算機資源, 提高處理機的利用率及改善系統(tǒng)必(吞吐量、響應(yīng)時間),在很大程度上取決于處理機調(diào)度性 能的好壞,因而,處理

2、機調(diào)度便成為操作系統(tǒng)設(shè)計的中心問題之一。本次實驗在VC+6.0環(huán)境下 實現(xiàn)先來先服務(wù)調(diào)度算法,短作業(yè)優(yōu)先調(diào)度算法,高優(yōu)先權(quán)調(diào)度算法,時間片輪轉(zhuǎn)調(diào)度算法和 多級反饋隊列調(diào)度算法。13理論依據(jù)為了描述和管制進程的運行,系統(tǒng)為每個進程定義了一個數(shù)據(jù)結(jié)構(gòu)一一進程控制塊PCB(Process Control Block) ,PCB中記錄了操作系統(tǒng)所需的、用于描述進程的當前情況以及控制進 程運行的全部信息,系統(tǒng)總是通過PCB對進程進行控制,亦即,系統(tǒng)是根據(jù)進程的PCB而不是 任何別的什么而感知進程的存在的,PCB是進程存在的惟一標志。本次課程設(shè)計用結(jié)構(gòu)體 Process代替PCB的功能。1.4.課程任務(wù)一

3、、用C語言(或C+)編程實現(xiàn)操作模擬操作系統(tǒng)進程調(diào)度子系統(tǒng)的基本功能;運用多種算 法實現(xiàn)對進程的模擬調(diào)度。二、通過編寫程序?qū)崿F(xiàn)進程或作業(yè)先來先服務(wù)、高優(yōu)先權(quán)、按時間片輪轉(zhuǎn)、短作業(yè)優(yōu)先、多級 反饋隊列調(diào)度算法,使學生進一步掌握進程調(diào)度的概念和算法,加深對處理機分配的理 解。三、實現(xiàn)用戶界面的開發(fā)15 功能模塊分析:1、進程概念:進程是被獨立分配資源的最小單位。進程是動態(tài)概念,必須程序運行才有 進程的產(chǎn)生。2、進程的狀態(tài)模型:(1) 運行:進程已獲得處理機,當前處于運行狀態(tài)。(2) 就緒:進程已經(jīng)準備好,一旦有處理器就可運行。3、處理機調(diào)度:在多道程序設(shè)計系統(tǒng)中,內(nèi)存中有多道程序運行,他們相互爭奪

4、處理機 這一重要的資源。處理機調(diào)度就是從就緒隊列中,按照一定的算法選擇一個進程并將處 理機分配給它運行,以實現(xiàn)進程并發(fā)地執(zhí)行。4、進程調(diào)度算法的功能:記錄系統(tǒng)中所有進程的執(zhí)行情況選擇占有處理機的進程進行進程的上下文切換5、進程調(diào)度的算法:(1) 先來先服務(wù)算法:如果早就緒的進程排在就緒隊列的前而,遲就緒的進程排在就緒 隊列的后面,那么先來先服務(wù)總是把當前處于就緒隊列之首的那個進程調(diào)度到運 行狀態(tài)。(2) 優(yōu)先數(shù)算法:即進程的執(zhí)行順序由高優(yōu)先級到低優(yōu)先級。系統(tǒng)或用戶按某種原則為 進程指定一個優(yōu)先級來表示該進程所享有的確調(diào)度優(yōu)先權(quán)。該算法核心是確定進 程的優(yōu)先級。(3) 時間片輪轉(zhuǎn)算法:固定時間片

5、,每個進程在執(zhí)行一個時間片后,輪到下一進程執(zhí) 行,知道所有的進程執(zhí)行完畢。處理器同一個時間只能處理一個任務(wù)。處理器在 處理多任務(wù)的時候,就要看請求的時間順序,如果時間一致,就要進行預(yù)測。挑 到一個任務(wù)后,需要若干步驟才能做完,這些步驟中有些需要處理器參與,有些 不需要(如磁盤控制器的存儲過程)。不需要處理器處理的時候,這部分時間就 要分配給其他的進程。原來的進程就要處于等待的時間段上。經(jīng)過周密分配時 間,宏觀上就象是多個任務(wù)一起運行一樣,但微觀上是有先后的,就是時間片輪 換。(4) 多級反饋隊列法:又稱反饋循環(huán)隊列或多隊列策略,主要思想是將就緒進程分為 兩級或多級,系統(tǒng)相應(yīng)建立兩個或多個就緒進

6、程隊列,較高優(yōu)先級的隊列一般分 配給較短的時間片。處理器調(diào)度先從高級就緒進程隊列中選取可占有處理器的進 程,只有在選不到時,才從較低級的就緒進程隊列中選取。(5) 短作業(yè)優(yōu)先法:對短進程優(yōu)先調(diào)度的算法,它是從后備隊列中選擇一個或者若干個 進程,將處理機分配給它,使它立即執(zhí)行并一直執(zhí)行到完成,或發(fā)生某事件而被 阻塞放棄處理機時再重新調(diào)度。設(shè)計方案2.1 先來先服務(wù)調(diào)度2.1.1. 算法思想先來先服務(wù)調(diào)度算法的思想是按照進程進入就緒隊列的先后順序調(diào)度并分配處理機執(zhí)行。 先來先服務(wù)調(diào)度算法是一種不可搶占的算法,先進入就緒隊列的進程,先被處理機運行。一旦 一個進程占有了處理機,它就一直運行下去,直到該

7、進程完成工作或者因為等待某事件而不能 繼續(xù)運行時才釋放處理機。2.1.2. 算法流程圖圖1先來先服務(wù)算法流程圖2.1.3.程序代碼#include #include #include typedef struct nodename, run-cputime, run-starttime, run-needtime, run-state); /* 輸出執(zhí)行的進程的信息 */ p=ready;whilefp != NULL) name, p-cputime, p-starttime, p needtime, p-state); /*輸出就緒進程的信息*/ p=p-next;p=finish; wh

8、ile(p != NULL)printf( %-10s%-10d%-10s%-10d %cn p-name, p-cputime,p-starttime, pneedtim巳 p-state); /* 輸出結(jié)束隊列的信息 */ p=p-next;getchar(); /*使用getcharO函數(shù)可以讓輸出時停留畫面,等待人按回車繼續(xù)*/void insertfPCB *q)/*插入新進程,把進程按進程到來時間大小排序PCB *pl/s,*r;int b;s二q;/*指針s指向新要插入的進程*/pl=ready; /*指針pl指向原來的進程隊列的隊首*/ r=pl; /*使用 指針r是指向pl前

9、而的進程*/ b=l;while(pl!=NULL)&b) if(strcmp(pl-starttime,s-starttime)O r=pl; pl=p next; /*新進程的開始時間大,則pl指向下一個進程繼續(xù)比else b=0;if(r!=pl)next=s; s-next=pl; /*新進程找到位置,插在r和pl之間*/ elsenext二pl; ready二s;/*新進程的開始時間按最小,插在隊首,并修改就緒隊首void create0name); /* 輸入進程名 */ scanf(%d&p-needtime); /* 輸入進程要求運 行時間 */ scanf(%s/p-star

10、ttime); /輸入進程開始時間 p-cputime=O; pstateW; /*表示就緒隊列中未在隊首先執(zhí)行,但也是就緒狀態(tài)*/ if (ready!=NULL)insert(p); /*就緒隊首不為NULL ,插入新進程*/else/*否則先插在側(cè)“前*/pnext=ready; ready二p;W);printff Display is going to start:IVprintQ;getcharQ;run=ready; /*隊列排好,run指向就緒隊列隊首*/ ready=ready-next; /*ready指向下一 個進程*/ rimstate=R; /*隊首進程的狀態(tài)為就緒7

11、void FCFS0while (run != NULL) cputime+ru n needtime;runneedtime=O; run-next=finish; finish = run; run-state=E; run = NULL; iffready != NULL) (run = ready; run-state=R; ready=readynext; print。;void mainQprintf(,rPlease enter the total number of PCB:nir); scanf(n%dr&N);create0;/*模擬創(chuàng)建進程,并輸入相關(guān)信息*/FCFSQ;

12、 /*先來先服務(wù)調(diào)度算法*/2丄4 測試結(jié)果及說明首先輸入進程個數(shù)(為5個),這里命名為ABCDE,然后分別輸入運行時間和開始時間所有進程都在隊列中,并都處于等待狀態(tài)其中一個進程執(zhí)行完畢所有進程都執(zhí)行完畢2.2優(yōu)先級調(diào)度2.2.1. 算法思想進程的執(zhí)行順序由高優(yōu)先級到低優(yōu)先級,系統(tǒng)或用戶按某種原則為進程指定一個優(yōu)先級來表示該進程所享有的確調(diào)度該算法核心是確定進程的優(yōu)先 優(yōu)先權(quán)級。2.2.2. 算法流程圖圖2優(yōu)先級調(diào)度流程圖2.2.3. 程序代碼#include #include #include typedef struct node char name10; /* int prio; /*

13、int cputime; /* int needtime; /* char state; /* struct node *next; /* PCB;PCB *ready/run*finish; int N;進程名*/ 優(yōu)先數(shù)*/ 占用cpu時間*/ 要求運行時間*/ 狀態(tài)*/指針*/void prt() /* namelrun-cputimelrun-need time,ru prio,run-state;/*輸出執(zhí)行的進程的信息*/p=ready;while(p!二 NULL)printff %-10s%-10d%-10d%-10d %cnp-namelp-cputimelp-needtim

14、e, p-prio;p-state); /*輸出就緒進程的信息*/p=pnext; p=finish;while(p!二NULL) printfC %-10s%-10d%-10d%lOd %cn;p-namelp-cputimelp-needtim e,pprio,pstate); /* 輸出結(jié)束隊 列的信息*/p=pnext;getchar(); /*使用getcharf)函數(shù)可以讓輸出時停留ill面,等待人按回 車繼續(xù)*/void insert(PCB *q) /*插入新進程,把進程按優(yōu)先數(shù)大小排序*/ PCB *pl *s/r;int b;s二q; /*指針s指向新要插入的進程*/pl二

15、ready; /*指針pl指向原來的進程隊列的隊背*/r=pl; /*枝用指針r是指向pl前面的進程*/b二1;while(pl!二 NULL)&b) if(pl-prio=s-prio r=pl;pl=pl-next;小,則pl指向下一個進程/*新進程的優(yōu)先數(shù)新進程找 繼續(xù)比 */ elseb二0;翡上pl)r-nextnegl;/*pl之到位置,插在和新進程的 else snext二pl; remdy二s; /* 首,并優(yōu)先數(shù)最大,插在隊修改就緒隊首ready指針*/void create (J PCB *p;int i;ready二NULL; run二NULL; finish=NULL;

16、 printffPlease enter the name and time and priority of PCB:nJ;/*輸入進程名、運彳亍時間和優(yōu)先級*/ for(i二0;ivN;i+)p=(PCB *)malloc(sizeof(PCB); /* 為薪進程開辟空間 */ scanf(%sr,/p-name); /* 輸入錘程名 */scanf(%d,&p-needtime); /*輸入進程要求運行時間*/ scanf(%d&p-prio; /* 輸入進程優(yōu)先數(shù) */ p-cputime=O; p-state=fWr; /*表示就緒隊列中未在隊首先執(zhí)行,但也是就緒狀態(tài)就緒隊首不為NUL

17、L,插入新*/ if (ready!二NULL) insertfp; /* 進程else p-next=ready; ready=p; /* printff Displ睹員誨 NSL15術(shù)更/ ); 廣廠 1111 Xa 廠、1v-v r n II I TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT y*%1 y-% I I 1 V*! 1 Vy CJ f| T/*隊列排好,run指向就緒隊列隊首*/ ready=ready-next; /*ready指向下 一個進程,這樣當進程執(zhí)行時如果優(yōu)先數(shù)小于其他的進程,應(yīng)該先進 行優(yōu)先數(shù)最大的進程run-

18、state=rRf; /*隊首進程的狀態(tài)為就緒*/ void prioQ while(run!=NULLrun-cputime=run-cputime+1;/*run needtime 二 ru n needtimel;runprio二runpriol; /* if(run-needtime=O) /* run-next=finish;finish=run; run-state=rEr; run二NULL; if (ready!二NULL)運行一次cpu占用時間加一 /* 7運行一次要求運行時間減一 V 運行一次優(yōu)先數(shù)減一 */若要求運 行時間為0時*/*退岀隊列*/為結(jié)束進程的隊/*fini

19、s列*/修改狀態(tài)為結(jié)束*/釋放runh指軒*/*創(chuàng)建新就緒隊列的頭指針*/ run=ready; runstmte二R; ready=ready-next; elseif(ready!二 NULL)& (run-prioprioJ/*隊首進程的優(yōu)先數(shù)比它下一個小,且下一個進程不為NULL時執(zhí) 行*/ run-state=,Wr;run-next=NULL; /*隊首進程退出進程隊列*/在進程隊列insert(run); /*中重新插入原來的隊首進程*/重新置run=ready; /*就緒隊列的頭指針*/run-state=,R,;ready=readynext; prt(); void mai

20、nQ printffPlease enter the total number of PCB:n; scanf(n%d,&N);create(); /*模擬創(chuàng)建進程,并輸入相關(guān)信息7 prio(; /*優(yōu)先數(shù)調(diào)度算 法*/224.測試結(jié)果及說明優(yōu)先級調(diào)度算法運行情況如圖1,圖2,圖3,圖4所示圖1輸入進程塊的圖2輸入每個進程的名稱、時間、優(yōu)先級圖3.輸入所有的進程的相關(guān)信息圖4所有進程調(diào)度算法完成2.3 時間片輪轉(zhuǎn)調(diào)度2.3.1. 算法思想所有就緒進程按先來先服務(wù)的原則排成一個隊列,將新來的進程 加到就緒對列的末尾,每當執(zhí)行進程調(diào)度時,總是把處理機分配給 隊首的進程,各進程占用CPU的時間片相

21、同。也就是說CPU的處理 時間劃分成一個個相同的時間片,就緒隊列的所有進程輪流運行一個 時間片。當一個時間片結(jié)束時,如果運行進程用完它的時間片后還 未完成,就強迫運行進程讓出CPU,就把它送回到就緒隊列的末尾, 等待下一次調(diào)度。同時,進程調(diào)度又去選擇就緒隊列中的隊首進程, 分配給它一時間片,以投入運行。直至所有的進程運行完畢。2.3.2. 算法流程圖2.3.3. 程序代碼#inelude #include #include typed efstruct node char name10; /* 進程名 */int count;/*計數(shù)器,判斷是否二時間片的大小*/int eputime; in

22、t need佈占;曲朋曲t劇 struct node *next; */ /* 要求運行時間*/*狀態(tài)=7/*指針*/PCB;PCB *ready,*run/finish/tail; /* 就緒執(zhí)行結(jié)束 尾指針 */ int N,round;void prt() /*輸出函數(shù),可以方便看到進程執(zhí)行的演*/示name/run-cputime/run-needti me/run-state); /* 輸出執(zhí)行的進程的信息 */ p=ready;while(p!二 NULL)name/p-cputime/p-needtime/p-state);/*輸岀就緒進程的信息*/p=p-next;p=fini

23、sh;while(p!二 NULL)name,p-cputime/p-needtime/p- state); /*輸出結(jié)束隊列的信息*/p=p-next;getcharO;void insert(PCB *q) /*在隊尾插入新的進程*/PCB *p;p 二 ready;while(p-next!=NULL) next;tail=p;tail-next=q; q-next=NULL;void create0name); /* 輸入進程名 */scanf(,%d,&p-needtime; /* 輸入進程要求運行時間 */ p-cputime=O; pstateW/*表示就緒隊列中未在隊首先執(zhí)行,

24、但也是就緒狀態(tài)*/if (ready!二NULL) insert(p); /* 就緒隊首不為 NULL ,插入新進程 */ elsepnext=re3dy; ready=p; tail=p;printffDisplay is going to start:W);PM;getcharO;run=ready; /*隊列排好,run指向就緒隊列隊首*/ ready=ready-next; /*ready指向下一個 進程*/run-state=,R;/*隊首進程的狀態(tài)為就緒*/ void countQwhile(run!=NULL)next=finish;finish二run; run-state=E

25、; run=NULL;run-cputime=run-cputime+1; /* 運行一次 cpu 占用時間加一 */ run-needtime=run-needtime-l; /* 運行一次要求運行時間減一 */ run-count=run-count+l; /* 運行一次計數(shù)器加一 */ if(run-needtime=O) /*右要求運彳亍時間為時*/*退出隊列*/*finish為結(jié)束進程的隊列*/*修改狀態(tài)為結(jié)束*/*釋放run指針*/if (ready!二NULL)/*創(chuàng)建新就緒隊列的頭指針*/nin=ready; ruristate二R; ready=readynext;elsei

26、f(run-count=round) /* 如果時間片到 */run-count=0; /* 計數(shù)器置 0*/ if(ready!=NULL /* 如就緒隊列 不空*/state=W,;insert(run); /*在進程隊列中重新插入原來進程,插入隊尾7run=ready; /*重新置就緒隊列的頭指針*/ run-state=,R,;void mainO next;PM;printffPlease enter the total number of PCB:nJ; scanf(%d,&N); create(); /*模擬創(chuàng)建進程,并輸入相關(guān)信息*/ count。; /*優(yōu)先數(shù)調(diào)度算法 723

27、4測試結(jié)果及說明時間片輪轉(zhuǎn)調(diào)度算法運行情況如,圖圖2,圖3所示圖1所有的進程都在隊列中圖2其中一個進程執(zhí)行完畢圖4所有的進程都執(zhí)行完畢2.4.多級反饋隊列調(diào)度2.4.1算法思想允許進程在隊列之間移動。在系統(tǒng)中設(shè)置多個就緒隊列,每個隊列對應(yīng)一個優(yōu)先級,第 一個隊列的優(yōu)先級最高,第二隊列次之。以下各隊列的優(yōu)先級逐步低。各就緒隊列中的進程的 運行時間片不同,高優(yōu)先級隊列的時間片小,低優(yōu)先級隊列的時間片大。進程并非總是固定在 某一隊列中,新進程進入系統(tǒng)后,被存放在第一個隊列的末尾。如果某個進程在規(guī)定的時間片 內(nèi)沒有完成工作,則把它轉(zhuǎn)入到下一個隊列的末尾,直至進入最后一個隊列。系統(tǒng)先運行第一 個隊列中的

28、進程。當?shù)谝魂犃袨榭諘r,才運行第二個隊列中的進程。依此類推,僅當前面所有 的隊列都為空時,才運行最后一個隊列中的進程。當處理器正在第i個隊列中為某個進程服務(wù) 時,又有新進程進入優(yōu)先級最高的隊列(第1 (i-l)中的任何一個對列),則此新進程要搶 占正在運行進程的處理器,即由調(diào)度程序把正在運行的進程放回第i隊列的末尾,把處理器分 配給新到的高優(yōu)先級進程。除最低優(yōu)先權(quán)隊列外的所有其他隊列,均采用相同的進程調(diào)度算 法,即按時間片輪轉(zhuǎn)的FIFO (先進先出)算法。最后一個隊列中的進程按按時間片輪轉(zhuǎn)或FCFS 策略進行調(diào)度。它是綜合了 FIFO、RR和剝奪式HPF的一種進程調(diào)度算法。2.4.2算法流程圖

29、243程序代碼#include #include #include #define NULL 0 typedef struct nodechar name10; /* 進程名 */int num;/*進程所在隊列數(shù),也是該隊列的時間片*/int cputime;/* 占用 cpu 時間 */int needtime;/*要求運行時間*/struct node *next; /* 指針 */PCB;PCB *qfl/qll;PCB *qf2/ql2;PCB *qfVql3;定義三個隊列的頭指針和尾指針void insert(PCB *q,PCB *qf,PCB *ql) num+; if(qf=

30、NULL&ql=NULL)/隊列為空int blogl,blog2,blog3; /*分別記錄隊列1八隊列2、隊列3中進程數(shù)*/qf二 ql 二 q;else/隊列不為空ql-next=q;ql二q;ql-next=NULL;void create(int n)/創(chuàng)建進程,剛來的進程都進入隊列1PCB*p;p=(PCB *)malloc(sizeof(PCB);inti;blogl=blog2=blog3=0; /各隊列中進程數(shù)均為 0 printf(Please enter the name and needtime ofPCB:nH);/*輸入進程名和所需時間for(i=0;in;i+na

31、me);/* 輸入進程名 */scanf(%d,&(p-needtime); /* 輸入進程要求運行時間 */ p-cputime=O; pnum=0;insert(p,qfl,qllj;blogl+;/隊列中進程數(shù)加1intrunfPCB *q/PCB *qf,PCB *ql)PCB/*p=(PCB *)malloc(sizeof(PCB); f=(PCB *)malloc(sizeof(PCB);1=(PCB *)malloc(sizeof(PCB);*/p二q;f 二 qf;l=ql; if(q-needtimenum) /* 在時間片內(nèi)完成 */cputime+=qneedtime;

32、qneedtime=O; free(q);return 0;else /*不能在時間片內(nèi)完成*/cputime+=qnum; q-needtime-=q-num; if(qnumnum+; insert(p,f);/進入下一個隊歹ij return 1;void prto /*輸出函數(shù),可以方便看到進程執(zhí)行的演示 70|blog20|blog30)if(blogl0) /*第一個隊列不為空*/next; pnext=NULL; blogprintf(n %-10s%-10d%nH/p-name/p-needtime); a=run(p/qf2/ql2); blog2+;else if(blog

33、20) /*第二個隊列不為空*/ next;p next 二 NULL;blog2-;printff %-10s%-10d%n,p-name,p- need time;a 二 run(p,qf3,ql3);if(a=lblog3+;else if(blog30) /*第三個隊列不為空*/next;p next 二 NULL;blog3-;printf( %-10s%-10d%nlp-name/p-needtime);a 二 run(p,qf3,ql3);if(a=lblog3+;/*使用getchar()函數(shù)可以讓輸出時停留畫面,等待人按回車繼續(xù)*/void mainOqfl=qll=(PCB

34、 *)malloc(sizeof(PCB);qf2=ql2=(PCB *)malloc(sizeof(PCB);qf2=ql2=(PCB *)malloc(sizeof(PCB)J;int n;blogl=blog2=blog3=0;printfC*請輸入進程的個數(shù):”);scanf(%d&n);create(n);PM;2.4.4測試結(jié)果及說明2.5 短作業(yè)調(diào)度25.1算法思想短作業(yè)優(yōu)先調(diào)度算法是指對短作業(yè)進行調(diào)度的算法。它從后備隊列總選擇一個或若干個 運行時間最短的作業(yè),將他們調(diào)入內(nèi)存運行。2.5.2. 算法流程圖:短作業(yè)優(yōu)先算法流程圖2.5.3.程序代碼#include #include

35、 ttinclude node *next;/*進程名7/*占用cpu時間 */*要求運行時間 =7 /*狀態(tài)7/*指針7typedef struct nodechar name10;int cputime; intneedtime;char state; structPCB;PCB *ready, *run, *finish; / 就緒、執(zhí)行、結(jié)束指針int N; 進程數(shù)量void printO /輸出函數(shù)name; run-cputime/ run-needtime,run-state); /*輸出執(zhí)行的進程的信息*/ p=ready;whilefp != NULL)name, p-cpu

36、time, p-needtime, p-state); /*輸出就緒進程的信息*/p=p-next;p二finish; while(p != NULL)printf(n %-10s%-10d%-10d %cnf p-name, p-cputime, p-needtime, p-state); /*輸出結(jié)束隊列的信息*/ p=p-next;getcharO; /*使用getchar()函數(shù)可以讓輸出時停留畫面,等待人按回車繼續(xù)*/voidinsert(PCB*q)/*插入新進程,把進程按進程到來時間大小排序*/PCB *pl,*s,*r;int b;s二q;/*指針s指向新要插入的進程*/pl=

37、ready; /*指針pl指向原來的進程隊列的隊首*/ r=pl; /*使用指針r是指向pl前而的進 程*/b=l;while(pl!=NULL)&b) if(pl-needtimeneedtime) next; /*新進程的開始時間大,則pl指向下一個進程繼續(xù)比*/ elseb=0;if(r!=plnext=s; snext二pl;/*新進程找到位置,插在r和pl之間*/elsenext二pl; ready二s;/*新進程的開始時間按最小,插在隊首,并修改就緒隊首ready指針*/void create0name; /* 輸入進 程名 */ scanf(%d/&p-needtime); /*

38、 輸入進程要求運行時間 */ p-cputime=O; p-state=W; /*表示就緒隊列中未在隊首先執(zhí)行,但也是就緒狀態(tài)*/ if (ready!二NULL)insert(p); /*就緒隊首不為NULL ,插入新進程*/ else /* 否則先插在 NULL 前 */ p-next=ready;printff Display is going to start: n);printQ;getcharf);run二ready; /*隊列排好,run指向就緒隊列隊首*/ ready=ready-next; /*ready指向下一個 進程*/ runstateR1; /*隊首進程的狀態(tài)為就緒7void SJF()whilefrun != NULL) cputime=runcputi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論