(完整word版)進程模擬調(diào)度算法課程設(shè)計(word文檔良心出品)_第1頁
(完整word版)進程模擬調(diào)度算法課程設(shè)計(word文檔良心出品)_第2頁
(完整word版)進程模擬調(diào)度算法課程設(shè)計(word文檔良心出品)_第3頁
(完整word版)進程模擬調(diào)度算法課程設(shè)計(word文檔良心出品)_第4頁
(完整word版)進程模擬調(diào)度算法課程設(shè)計(word文檔良心出品)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、為操作系統(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)度算法。1.3.理論依據(jù)為了描述和管制進程的運行,系統(tǒng)為每個進程定義了一個數(shù)據(jù)結(jié)構(gòu)一一進程控制塊PCB(Process Control Block),PCB中記錄了操作系統(tǒng)所需的、用于描述進程的當(dāng)前情況以及控 制進程運行的全部信息,系統(tǒng)總是通過PCB對進程進行控制,亦即,系統(tǒng)是根據(jù)進程的 PCB而不是任何別的什么而感知進程的存在的,PCB是進程存在的惟一標(biāo)志。本次課程設(shè)計用結(jié)構(gòu)體Process代替PCB的功能。14課程任務(wù)一、用C語言(或C

3、+ )編程實現(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)度算法, 使學(xué)生進一步掌握進程調(diào)度的概念和算法,加深對處理機分配的理解。三、實現(xiàn)用戶界面的開發(fā)1.5.功能模塊分析:1、 進程概念:進程是被獨立分配資源的最小單位。進程是動態(tài)概念, 必須程序運行才有 進程的產(chǎn)生。2、進程的狀態(tài)模型:(1)運行:進程已獲得處理機,當(dāng)前處于運行狀態(tài)。(2)就緒:進程已經(jīng)準(zhǔn)備好,一旦有處理器就可運行。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ù)總是把當(dāng)前處于就緒隊列之首的那個進程調(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)算法:固定時間片,每個進程在執(zhí)

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

6、隊列一般分配給較短的時間片。處理器調(diào)度先從高級就緒進程隊列中選取可占有處理器的進程, 只有在選不到時,才從較低 級的就緒進程隊列中選取。(5)短作業(yè)優(yōu)先法:對短進程優(yōu)先調(diào)度的算法,它是從后備隊列中選擇一個或者若干個進程,將處理機分配給它, 使它立即執(zhí)行并一直執(zhí)行到完成,或發(fā)生某事件而被阻塞放棄處理機時再重新調(diào)度。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 .程序代碼#i nclude #i nclude #in elude typedef struct nodechar name10;/*進程名 */int cputime;/* 占用 cpu 時間 */char starttime5; / 進程開始時間int needtime;/*要求運行時間*/char state;/* 狀態(tài) */struct node *next;/* 指針 */PCB;PCB *ready, *run, *finish; / 就緒、執(zhí)行、結(jié)束指針int N;/進程數(shù)量void pri

8、n t()/ 輸出函數(shù)STATUSn);PCB *p;prin tf( NAME CPUTIME STARTTIME NEEDTIME if(run != NULL)printf( %-10s%-10d%-10s%-10d %cn,run-n ame,run-cputime,run-starttime,run-n eedtime,run-state);/*輸出執(zhí)行的進程的信息 */p=ready;while(p != NULL)printf( %-10s%-10d%-10s%-10d %cn,p_n ame, p-cputime, p-starttime, p-n eedtime, p-sta

9、te);/*輸出就緒進程的信息*/p=p-n ext;p=fi ni sh;while(p != NULL)printf( %-10s%-10d%-10s%-10d %cn,p_n ame, p-cputime,*/*/ready 指針 */p-starttime,p-n eedtime, p-state);/*輸出結(jié)束隊列的信息*/p=p-n ext;getchar(); /*使用getchar()函數(shù)可以讓輸出時停留畫面,等待人按回車?yán)^續(xù)*/void in sert(PCB *q)/*插入新進程,把進程按進程到來時間大小排序PCB *p1,*s,*r;int b;s=q;/*指針s指向新要

10、插入的進程*/p仁ready;/*指針p1指向原來的進程隊列的隊首*/r=p1;/*使用指針r是指向p1前面的進程*/b=1;while(p1!=NULL) &b)if(strcmp(p1-starttime,s-starttime)n ext;/*新進程的開始時間大,則p1指向下一個進程繼續(xù)比elseb=0;if(r!=p1)r-n ext=s; s-n ext=p1; /*新進程找到位置,插在r和p1之間*/elses-n ext=p1; ready=s; /*新進程的開始時間按最小,插在隊首,并修改就緒隊首void create()PCB *p;int i;ready=NULL;run=

11、NULL;fin ish=NULL;prin tf(Please en ter the n ame and time and starttime of PCB:n);/*輸入進程名、運行時間和開始時間 */for(i=0;iname);/* 輸入進程名 */scan f(%d, &p- needtime);/*輸入進程要求運行時間*/scan f(%s,p-starttime);輸入進程開始時間p-cputime=0;p-state=W;/*表示就緒隊列中未在隊首先執(zhí)行,但也是就緒狀態(tài)*/if (ready!=NULL)insert(p);/*就緒隊首不為 NULL,插入新進程*/else/*

12、否則先插在 NULL前*/p-n ext=ready;ready=p;printf(”Display is going to sta rt:n ”);printf(* n);prin t();getchar();run=ready; /*隊列排好,run指向就緒隊列隊首*/ ready=ready-next;/*ready 指向下一個進程 */run-state=R; /*隊首進程的狀態(tài)為就緒 */ void FCFS()while(ru n != NULL)run-cputime=ru n-cputime+ru n- needtime;run-n eedtime=0; run-n ext=f

13、i ni sh; finish = run;run-state=E;run = NULL;if(ready != NULL)run = ready; run-state=R; ready=ready-n ext; prin t();void mai n()prin tf(Please en ter the total number of PCB:n); scan f(%d,&N);create();/*模擬創(chuàng)建進程,并輸入相關(guān)信息*/FCFS();/*先來先服務(wù)調(diào)度算法*/2.1.4.測試結(jié)果及說明首先輸入進程個數(shù)(為 5個),這里命名為A,B,C,D,E,然后分別輸入運行時間和開始時間Ple

14、ase enter the total number of PCB:Please enter the name and time and starttime of PCB:ABCDE811512483913所有進程都在隊列中,并都處于等待狀態(tài)NAMECPliTIMESTARTTIHENEEDTIMESTATUSE81312UC035VfA48uB8811uD0910w其中一個進程執(zhí)行完畢NAMECPUTIMESTftRTTIMEHEEDTIMESTATUSC035RA048WB0811WD0910UE12130E所有進程都執(zhí)行完畢NAHECPUTIMESTARTTINENEEBTIMESTAT

15、USD109&EB118阿EA840EC530EE12130E2.2 .優(yōu)先級調(diào)度2.2.1.算法思想進程的執(zhí)行順序由高優(yōu)先級到低優(yōu)先級,系統(tǒng)或用戶按某種原則為進程指定一個優(yōu)先級來表示該進程所享有的確調(diào)度優(yōu)先權(quán)。該算法核心是確定進程的優(yōu)先 級。2.2.2.算法流程圖圖2.優(yōu)先級調(diào)度流程圖#i nclude #i nclude #include typedef struct node char n ame10; /* int prio; /* int cputime;/*int n eedtime; /* char state;/*struct node *n ext; /* PCB;PCB *

16、ready,*run,*finish; int N;void prt() /*PCB *p;2.2.3.程序代碼進程名*/優(yōu)先數(shù)*/占用cpu時間*/要求運行時間*/狀態(tài)*/指針*/* 就緒執(zhí)行結(jié)束指針*/輸出函數(shù),可以方便看到進程執(zhí)行的演示*/printf( NAME CPUTIME NEEDTIME PRIORITY STATUSn)if(run !=NULL)prin tf( %-10s%-10d%-10d%-10d %cn,ru n-n ame,ru n-cputime,ru n-n eed time,ru n-prio,ru n-state);/*輸出執(zhí)行的進程的信息*/p=read

17、y;while(p!=NULL)pri ntf( %-10s%-10d%-10d%-10d %cn,p- name,p-cputime,p- needtime, p-prio,p-state); /*輸出就緒進程的信息*/p=p-n ext; p=fi ni sh;while(p!=NULL) printf( %-10s%-10d%-10d%-10d %cn,p- name,p-cputime,p- needtim e,p-prio,p-state); /*輸出結(jié)束隊列的信息*/p=p-n ext; getchar(); /*使用getchar()函數(shù)可以讓輸出時停留畫面,等待人按回車 繼續(xù)*

18、/void in sert(PCB *q) /*插入新進程,把進程按優(yōu)先數(shù)大小排序*/ PCB *p1,*s,*r;int b;s=q; /* 指針s指向新要插入的進程*/p仁ready; /* 指針p1指向原來的進程隊列的隊首*/r=p1;/*使用指針r是指向p1前面的進程*/b=1;while(p1!=NULL)&b)/*新進程的優(yōu)先數(shù)新進程找到位置,插在r和新進程的優(yōu)先數(shù)最大,插在隊if(p1-prio=s-prio) r=p1; p1=p1- n ext; 小,則p1指向下一個進程繼續(xù)比*/else b=0;if(r!=p1) r-n ext=s; s-n ext=p1; /* p1之

19、間*/else s-n ext=p1; ready=s; /*首,并修改就緒隊首ready指針*/void create() PCB *p;int i;ready=NULL; run=NULL; fin ish=NULL;prin tf(Please en ter the n ame and time and priority of PCB:n);/*輸入進程名、運行時間和優(yōu)先級*/for(i=0;iname); /*輸入進程名 */seanf(%d,&p-needtime); /*輸入進程要求運行時間*/seanf(%d,&p-prio); /*輸入進程優(yōu)先數(shù) */p-eputime=0;p

20、-state=W; /*表示就緒隊列中未在隊首先執(zhí)行,但也是就緒狀態(tài)*/if (ready!=NULL) insert(p); /*就緒隊首不為NULL插入新進程否則先插在NULL前*/*/else p-n ext=ready; ready=p; /*prin tf( Display is going to start:n);prin tf(*n)prt();run=ready; /* 隊列排好,run指向就緒隊列隊首*/ready=ready-n ext;/*ready指向下一個進程,這樣當(dāng)進程執(zhí)行時如果優(yōu)先數(shù)小于其他的進程,應(yīng)該先進行優(yōu)先數(shù)最大的進程*/run-state=R; /*隊首進

21、程的狀態(tài)為就緒*/void prio()運行一次cpu占用時間加一 */ 運行一次要求運行時間減一 */ 運行一次優(yōu)先數(shù)減一 */若要求運行時間為0時*/退出隊列*/為結(jié)束進程的隊列*/修改狀態(tài)為結(jié)束*/釋放run指針*/創(chuàng)建新就緒隊列的頭指針*/ while(ru n!=NULL) run-cputime=r un-cputime+1; /*/*run-n eedtime=r un-n eedtime-1;run-prio=ru n-prio-1; /*if(run-n eedtime=0)/*/*/*fin ish/*/*/* run-n ext=fi ni sh;fini sh=r un

22、;run-state=E;run=NULL;if (ready!=NULL) run=ready; run-state=R; ready=ready-n ext; elseif(ready!=NULL )&(run-prioprio) run-state=W;run- next=NULL; /* in sert(r un); /* run=ready;/*run-state=R;/*隊首進程的優(yōu)先數(shù)比它下一個小,且下一個進程不為NULL時執(zhí)行*/隊首進程退出進程隊列*/在進程隊列中重新插入原來的隊首進程*/重新置就緒隊列的頭指針*/ready=ready-n ext; prt(); void

23、mai n() prin tf(Please en ter the total number of PCB:n);sca nf(%d,&N);create(); /*模擬創(chuàng)建進程,并輸入相關(guān)信息*/prio(); /*優(yōu)先數(shù)調(diào)度算法*/2.2.4.測試結(jié)果及說明優(yōu)先級調(diào)度算法運行情況如圖1,圖2,圖3,圖4所示Please enter the total number of PCB:圖1.輸入進程塊的數(shù)量圖2.輸入每個進程的名稱、時間、優(yōu)先級圖3.輸入所有的進程的相關(guān)信息Please enter the total number of PCB: 囂.Please enter the name

24、nd tine and prioritv of PCB:33H6 tC h2Display is 30 insr to start:tJt JtitJtJtitJt JtitJt JKJJKJ JWKWJIMIJJWJ X1IJJMJ JHIJJMJ KM J KMNAWECPUTIMENEED!IMEPRIORITYSTATUSA033UC052uB061wNAMECPUTIMEHEEDTIMEPRIORITYSTATUSA122RG052WB061U圖4.所有進程調(diào)度算法完成2.3 .時間片輪轉(zhuǎn)調(diào)度2.3.1 .算法思想所有就緒進程按先來先服務(wù)的原則排成一個隊列,將新來的進程加到就緒 對列

25、的末尾,每當(dāng)執(zhí)行進程調(diào)度時,總是把處理機分配給隊首的進程, 各進程占 用CPU勺時間片相同。也就是說CPU勺處理時間劃分成一個個相同的時間片,就 緒隊列的所有進程輪流運行一個時間片。 當(dāng)一個時間片結(jié)束時,如果運行進程用 完它的時間片后還未完成,就強迫運行進程讓出 CPU就把它送回到就緒隊列的 末尾,等待下一次調(diào)度。同時,進程調(diào)度又去選擇就緒隊列中的隊首進程,分配 給它一時間片,以投入運行。直至所有的進程運行完畢。2.3.2.算法流程圖2.3.3.程序代碼#i nclude #in elude #in elude typedef struct nodechar name10;/*進程名 */in

26、t count;/*計數(shù)器,判斷是否=時間片的大小*/ int cputime;I* 占用 cpu 時間 */int needtime;I*要求運行時間*Ichar state;I* 狀態(tài) *Istruct node *next; I* 指針 *IPCB;PCB *ready,*ru n,*fi ni sh,*tail;I*就緒執(zhí)行結(jié)束尾指針*Iint N,ro und;void prt() I*輸出函數(shù),可以方便看到進程執(zhí)行的演示*IPCB *p;printf(”NAME CPUTIME NEEDTIME STATUS n);if(run !=NULL)printf(%-10s%-10d%-

27、10d %cn,run-name,run-cputime,run-needtime,ru n-state);/*輸出執(zhí)行的進程的信息 */p=ready;while(p!=NULL)prin tf(%-10s%-10d%-10d %cn,p- name,p-cputime,p- needtime,p-state);/*輸出就緒進程的信息*/p=p-n ext;p=fi ni sh;while(p!=NULL)prin tf(%-10s%-10d%-10d %cn,p- name,p-cputime,p- needtime,p-state); /*輸出結(jié)束隊列的信息*/p=p-n ext;get

28、char();void in sert(PCB *q)/*在隊尾插入新的進程*/PCB *p;p=ready;while(p- next!=NULL)p=ready _n ext;tail=p;tail-n ext=q; q- next=NULL;void create()PCB *p;int i;ready=NULL;run=NULL;fin ish=NULL;prin tf(Please en ter the name and time of PCB:n);/* 輸入進程名、和*/for(i=0;iname);/* 輸入進程名 */scan f(%d, &p- needtime);/*輸入

29、進程要求運行時間 */p-cputime=O;p-state=W;/*表示就緒隊列中未在隊首先執(zhí)行,但也是就緒狀態(tài)*/if (ready!=NULL)insert(p);/* 就緒隊首不為 NULL,插入新進程 */elsep-n ext=ready; ready=p; tail=p;printf(” printf(n);Display is going to start:*、n)prt();getchar();run=ready; /*隊列排好,run指向就緒隊列隊首*/ ready=ready-next;/*ready 指向下一個進程 */run-state=R;/*隊首進程的狀態(tài)為就緒*

30、/void coun t()while(ru n!=NULL)run-cputime=run-cputime+1;/*運行一次 cpu 占用時間加一 */run- needtime=ru n-n eedtime-1;/* 運行一次要求運行時間減一*/run-co un t=ru n-co un t+1;/*運行一次計數(shù)器加一*/if(run-n eedtime=0) run-n ext=fi nish; fini sh=r un;run-state=E; run=NULL;if (ready!=NULL) /*若要求運行時間為0時*/*退出隊列*/*finish為結(jié)束進程的隊列*/*修改狀態(tài)為

31、結(jié)束*/*釋放run指針*/*創(chuàng)建新就緒隊列的頭指針*/run=ready;run-state=R;ready=ready-n ext; elseif(run-count=round)/* 如果時間片到 */run-count=0;/* 計數(shù)器置 0*/if(ready!=NULL)/*如就緒隊列不空*/run-state=W;in sert(ru n);/*在進程隊列中重新插入原來進程,插入隊尾*/run=ready;/*重新置就緒隊列的頭指針*/run-state=R:ready=ready-n ext; prt();void mai n()printf(Please enter the

32、total number of PCB:n);sca nf(%d,&N);create();/*模擬創(chuàng)建進程,并輸入相關(guān)信息*/count();/*優(yōu)先數(shù)調(diào)度算法*/2.3.4.測試結(jié)果及說明時間片輪轉(zhuǎn)調(diào)度算法運行情況如圖1,圖2,圖3所示輪/字/ 片/名 間舊鼻入靈餐/ 時進輸/級先優(yōu)3圖1所有的進程都在隊列中運行共需時間612101015I/50202526/響名字整輸岀已經(jīng)執(zhí)行警畢辛還需要占用時間優(yōu)先級053&3圖2其中一個進程執(zhí)行完畢圖4所有的進程都執(zhí)行完畢2.4 .多級反饋隊列調(diào)度2.4.1算法思想允許進程在隊列之間移動。在系統(tǒng)中設(shè)置多個就緒隊列,每個隊列對應(yīng)一個優(yōu)先級,第 一個隊列

33、的優(yōu)先級最高,第二隊列次之。以下各隊列的優(yōu)先級逐步低。各就緒隊列中的進程 的運行時間片不同, 高優(yōu)先級隊列的時間片小,低優(yōu)先級隊列的時間片大。進程并非總是固定在某一隊列中,新進程進入系統(tǒng)后, 被存放在第一個隊列的末尾。如果某個進程在規(guī)定的時間片內(nèi)沒有完成工作,則把它轉(zhuǎn)入到下一個隊列的末尾,直至進入最后一個隊列。系統(tǒng)先運行第一個隊列中的進程。當(dāng)?shù)谝魂犃袨榭諘r,才運行第二個隊列中的進程。依此類推,僅 當(dāng)前面所有的隊列都為空時,才運行最后一個隊列中的進程。當(dāng)處理器正在第i個隊列中為某個進程服務(wù)時,又有新進程進入優(yōu)先級最高的隊列(第1( i-1)中的任何一個對列),則此新進程要搶占正在運行進程的處理器

34、,即由調(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算法流程圖2.4.3程序代碼#in clude#i nclude #in elude #defi ne NULL 0typedef struct nodechar name10;/*進程名 */int num;/*進程所在隊列數(shù) 也是該隊列的時間片*/int cputime;/* 占

35、用 cpu 時間 */int needtime; /*要求運行時間*/struct node *next; /* 指針 */PCB;PCB *qf1,*ql1;PCB *qf2,*ql2;PCB *qf3,*ql3;定義三個隊列的頭指針和尾指針int blog1,blog2,blog3; /*分別記錄隊列1,、隊列2、隊列3中進程數(shù)*/ void in sert(PCB *q,PCB *qf,PCB *ql)q_nu m+;if(qf=NULL&ql=NULL) /隊列為空qf=ql=q;else/隊列不為空ql-n ext=q;ql=q;ql- next=NULL;void create(i

36、 nt n)/創(chuàng)建進程,剛來的進程都進入隊列1PCB *p;p=(PCB *)malloc(sizeof(PCB);int i;blog仁blog2=blog3=0;各隊列中進程數(shù)均為0prin tf(Please en ter the n ame and n eedtime of PCB:n);/*輸入進程名和所需時間*/for(i=0;iname);/* 輸入進程名 */scan f(%d, &(p- needtime);/* 輸入進程要求運行時間 */p-cputime=0;p_num=0;in sert(p,qf1,ql1);blog1+; /隊列中進程數(shù)加1int run (PCB

37、*q,PCB *qf,PCB *ql)PCB *p,*f,*l;/*p=(PCB *)malloc(sizeof(PCB);f=(PCB *)malloc(sizeof(PCB);l=(PCB *)malloc(sizeof(PCB);*/p=q;f=qf;l=ql;if(q-needtimenum)/* 在時間片內(nèi)完成 */q-cputime+=q-n eedtime;q-n eedtime=0;free(q);return 0;else /*不能在時間片內(nèi)完成*/q-cputime+=q-num;q-n eedtime-=q-num; if(q_num nu m+;in sert(p,f,

38、l);進入下一個隊列return 1;void prt()/*輸出函數(shù),可以方便看到進程執(zhí)行的演示*/PCB *p;p=(PCB *)malloc(sizeof(PCB);int a;printf(”NAME CPUTIME NEEDTIME STATUS n);while(blog10|blog20|blog30)if(blog10)/*第一個隊列不為空*/p=qf1;qf1=qf1- n ext;p- next=NULL;blogl-;printf(%-10s%-10d%n,p- name,p- needtime);a=ru n(p,qf2,ql2);if(a=1)blog2+;else

39、if(blog20)/*第二個隊列不為空*/p=qf2;qf2=qf2- next;p- next=NULL;blog2-;printf(”-10s%-10d%n,p- name,p- needtime);a=ru n( p,qf3,ql3);if(a=1)blog3+;else if(blog30) /*第三個隊列不為空*/p=qf3;qf3=qf3- next;p- next=NULL;blog3-;printf(%-10s%-10d%n,p- name,p- needtime);a=ru n( p,qf3,ql3);if(a=1)blog3+;/*使用getchar()函數(shù)可以讓輸出時停

40、留畫面,等待人按回車?yán)^續(xù)*/void mai n()qf1=ql1=(PCB *)malloc(sizeof(PCB);qf2=ql2=(PCB *)malloc(sizeof(PCB);qf2=ql2=(PCB *)malloc(sizeof(PCB);int n;blog 仁blog2=blog3=0;printf(請輸入進程的個數(shù):”);scan f(%d,&n);create( n);prt();2.4.4測試結(jié)果及說明2.5 .短作業(yè)調(diào)度2.5.1 .算法思想短作業(yè)優(yōu)先調(diào)度算法是指對短作業(yè)進行調(diào)度的算法。它從后備隊列總選擇一個或若干個運行時間最短的作業(yè),將他們調(diào)入內(nèi)存運行。2.5.2

41、.算法流程圖:短作業(yè)優(yōu)先算法流程圖2.5.3 .程序代碼#i nclude #in elude #in elude typedef struct node char n ame10; int cputime;int n eedtime; char state;struct node *n ext;/*進程名*/*占用cpu時間*/*要求運行時間*/*狀態(tài)*/*指針*/PCB;PCB *ready, *run, *finish; / 就緒、執(zhí)行、結(jié)束指針int N; /進程數(shù)量void prin t()/ 輸出函數(shù)PCB *p;prin tf(NAME CPUTIME NEEDTIMESTATU

42、S n);if(run != NULL)printf( %-10s%-10d%-10d %cn,run-n ame,run-cputime,run-n eedtime,run-state);/*輸出執(zhí)行的進程的信息 */p=ready;while(p != NULL)printf( %-10s%-10d%-10d %cn,p_n ame,p-cputime,p-n eedtime, p-state);/*輸出就緒進程的信息*/p=p-n ext;p=fi ni sh;while(p != NULL)printf( %-10s%-10d%-10d %cn,p_n ame,p-cputime,p-

43、n eedtime, p-state);/*輸出結(jié)束隊列的信息*/p=p-n ext;getchar(); /*使用getchar()函數(shù)可以讓輸出時停留畫面,等待人按回車?yán)^續(xù)*/void in sert(PCB *q)/*插入新進程,把進程按進程到來時間大小排序*/PCB *p1,*s,*r;int b;s=q;/*指針s指向新要插入的進程*/p仁ready;/*指針pl指向原來的進程隊列的隊首*/r=p1;/*使用指針r是指向pl前面的進程*/b=1;while(p1!=NULL) &b)if(p1- n eedtimen eedtime)r=p1; p1=p1- n ext;/*新進程的

44、開始時間大,則 p1指向下一個進程繼續(xù)比*/elseb=0;if(r!=p1)r-n ext=s; s-n ext=p1;/*新進程找到位置,插在r和p1之間*/elses-n ext=p1; ready=s; /*新進程的開始時間按最小,插在隊首,并修改就緒隊首ready指針*/void create()PCB *p;int i;ready=NULL;run=NULL;fin ish=NULL;prin tf(Please en ter the n ame and time of PCB:n);/*輸入進程名、運行時間和開始時間*/for(i=0;iname);/* 輸入進程名 */scan

45、 f(%d, &p- needtime);/*輸入進程要求運行時間*/p-cputime=0;p-state=W;/*表示就緒隊列中未在隊首先執(zhí)行,但也是就緒狀態(tài)*/if (ready!=NULL)insert(p);/*就緒隊首不為 NULL,插入新進程*/else/*否則先插在 NULL前*/p_n ext=ready;ready=p;n);printf(”Display is going to sta rt:prin tf(*n);prin t();getchar();run=ready; /*隊列排好,run指向就緒隊列隊首*/ ready=ready-next;/*ready 指向下

46、一個進程 */run-state=R: /*隊首進程的狀態(tài)為就緒 */void SJF()while(ru n != NULL)run-cputime=r un-cputime+r un-n eedtime;run-n eedtime=0; run-n ext=fi ni sh; finish = run;run-state=E:run = NULL;if(ready != NULL)run = ready;run-state=R; ready=ready-n ext;prin t();void mai n()prin tf(Please enter the total number of PCB:n); scan f(%d,&N);creat

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論