版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 一.課程概述</b></p><p><b> 1.1.設(shè)計(jì)構(gòu)想</b></p><p> 程序能夠完成以下操作:創(chuàng)建進(jìn)程:先輸入進(jìn)程的數(shù)目,再一次輸入每個(gè)進(jìn)程的進(jìn)程名、運(yùn)行總時(shí)間和優(yōu)先級(jí),先到達(dá)的先輸入;進(jìn)程調(diào)度:進(jìn)程創(chuàng)建完成后就選擇進(jìn)程調(diào)度算法,并單步執(zhí)行,每次執(zhí)行的結(jié)果都從屏幕上輸出來(lái)。</p>
2、<p><b> 1.2.需求分析</b></p><p> 在多道程序環(huán)境下,主存中有著多個(gè)進(jìn)程,其數(shù)目往往多于處理機(jī)數(shù)目,要使這多個(gè)進(jìn)程能夠并發(fā)地執(zhí)行,這就要求系統(tǒng)能按某種算法,動(dòng)態(tài)地把處理機(jī)分配給就緒隊(duì)列中的一個(gè)進(jìn)程,使之執(zhí)行。分配處理機(jī)的任務(wù)是由處理機(jī)調(diào)度程序完成的。由于處理機(jī)是最重要的計(jì)算機(jī)資源,提高處理機(jī)的利用率及改善系統(tǒng)必(吞吐量、響應(yīng)時(shí)間),在很大程度上取決
3、于處理機(jī)調(diào)度性能的好壞,因而,處理機(jī)調(diào)度便成為操作系統(tǒng)設(shè)計(jì)的中心問(wèn)題之一。本次實(shí)驗(yàn)在VC++6.0環(huán)境下實(shí)現(xiàn)先來(lái)先服務(wù)調(diào)度算法,短作業(yè)優(yōu)先調(diào)度算法,高優(yōu)先權(quán)調(diào)度算法,時(shí)間片輪轉(zhuǎn)調(diào)度算法和多級(jí)反饋隊(duì)列調(diào)度算法。</p><p><b> 1.3.理論依據(jù)</b></p><p> 為了描述和管制進(jìn)程的運(yùn)行,系統(tǒng)為每個(gè)進(jìn)程定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)——進(jìn)程控制塊PCB(Pro
4、cess Control Block),PCB中記錄了操作系統(tǒng)所需的、用于描述進(jìn)程的當(dāng)前情況以及控制進(jìn)程運(yùn)行的全部信息,系統(tǒng)總是通過(guò)PCB對(duì)進(jìn)程進(jìn)行控制,亦即,系統(tǒng)是根據(jù)進(jìn)程的PCB而不是任何別的什么而感知進(jìn)程的存在的,PCB是進(jìn)程存在的惟一標(biāo)志。本次課程設(shè)計(jì)用結(jié)構(gòu)體Process代替PCB的功能。</p><p><b> 1.4.課程任務(wù)</b></p><p>
5、; 用C語(yǔ)言(或C++)編程實(shí)現(xiàn)操作模擬操作系統(tǒng)進(jìn)程調(diào)度子系統(tǒng)的基本功能;運(yùn)用多種算法實(shí)現(xiàn)對(duì)進(jìn)程的模擬調(diào)度。</p><p> 通過(guò)編寫(xiě)程序?qū)崿F(xiàn)進(jìn)程或作業(yè)先來(lái)先服務(wù)、高優(yōu)先權(quán)、按時(shí)間片輪轉(zhuǎn)、短作業(yè)優(yōu)先、多級(jí)反饋隊(duì)列調(diào)度算法,使學(xué)生進(jìn)一步掌握進(jìn)程調(diào)度的概念和算法,加深對(duì)處理機(jī)分配的理解。</p><p><b> 實(shí)現(xiàn)用戶界面的開(kāi)發(fā)</b></p>
6、<p> 1.5.功能模塊分析:</p><p> 進(jìn)程概念:進(jìn)程是被獨(dú)立分配資源的最小單位。進(jìn)程是動(dòng)態(tài)概念,必須程序運(yùn)行才有 </p><p><b> 進(jìn)程的產(chǎn)生。</b></p><p> 2、進(jìn)程的狀態(tài)模型: </p><p> ?。?)運(yùn)行:進(jìn)程已獲得處理機(jī),當(dāng)前處于運(yùn)行狀態(tài)。<
7、/p><p> (2)就緒:進(jìn)程已經(jīng)準(zhǔn)備好,一旦有處理器就可運(yùn)行。</p><p> 3、處理機(jī)調(diào)度:在多道程序設(shè)計(jì)系統(tǒng)中,內(nèi)存中有多道程序運(yùn)行,他們相互爭(zhēng)奪處理機(jī) </p><p> 這一重要的資源。處理機(jī)調(diào)度就是從就緒隊(duì)列中,按照一定的算法選擇一個(gè)進(jìn)程并將</p><p> 處理機(jī)分配給它運(yùn)行,以實(shí)現(xiàn)進(jìn)程并發(fā)地執(zhí)行。</p&
8、gt;<p> 4、進(jìn)程調(diào)度算法的功能:</p><p> 記錄系統(tǒng)中所有進(jìn)程的執(zhí)行情況</p><p> 選擇占有處理機(jī)的進(jìn)程</p><p> 進(jìn)行進(jìn)程的上下文切換</p><p> 5、進(jìn)程調(diào)度的算法:</p><p> ?。?)先來(lái)先服務(wù)算法:如果早就緒的進(jìn)程排在就緒隊(duì)列的前面,遲就緒的
9、進(jìn)程排在 </p><p> 就緒隊(duì)列的后面,那么先來(lái)先服務(wù)總是把當(dāng)前處于就緒隊(duì)列之首的那個(gè)進(jìn)程調(diào)</p><p><b> 度到運(yùn)行狀態(tài)。</b></p><p> ?。?)優(yōu)先數(shù)算法:即進(jìn)程的執(zhí)行順序由高優(yōu)先級(jí)到低優(yōu)先級(jí)。系統(tǒng)或用戶按某種原則為進(jìn)程指定一個(gè)優(yōu)先級(jí)來(lái)表示該進(jìn)程所享有的確調(diào)度優(yōu)先權(quán)。該算法核心是確定進(jìn)程的優(yōu)先級(jí)。</
10、p><p> ?。?)時(shí)間片輪轉(zhuǎn)算法:固定時(shí)間片,每個(gè)進(jìn)程在執(zhí)行一個(gè)時(shí)間片后,輪到下一進(jìn)程執(zhí)行,知道所有的進(jìn)程執(zhí)行完畢。處理器同一個(gè)時(shí)間只能處理一個(gè)任務(wù)。處理器在處理多任務(wù)的時(shí)候,就要看請(qǐng)求的時(shí)間順序,如果時(shí)間一致,就要進(jìn)行預(yù)測(cè)。挑到一個(gè)任務(wù)后,需要若干步驟才能做完,這些步驟中有些需要處理器參與,有些不需要(如磁盤控制器的存儲(chǔ)過(guò)程)。不需要處理器處理的時(shí)候,這部分時(shí)間就要分配給其他的進(jìn)程。原來(lái)的進(jìn)程就要處于等待的時(shí)間
11、段上。經(jīng)過(guò)周密分配時(shí)間,宏觀上就象是多個(gè)任務(wù)一起運(yùn)行一樣,但微觀上是有先后的,就是時(shí)間片輪換。</p><p> (4) 多級(jí)反饋隊(duì)列法:又稱反饋循環(huán)隊(duì)列或多隊(duì)列策略, 主要思想是將就緒進(jìn)程分為兩級(jí)或多級(jí),系統(tǒng)相應(yīng)建立兩個(gè)或多個(gè)就緒進(jìn)程隊(duì)列, 較高優(yōu)先級(jí)的隊(duì)列一般分配給較短的時(shí)間片。 處理器調(diào)度先從高級(jí)就緒進(jìn)程隊(duì)列中選取可占有處理器的進(jìn)程, 只有在選不到時(shí), 才從較低 級(jí)的就緒進(jìn)程隊(duì)列中選取。</p>
12、;<p> (5)短作業(yè)優(yōu)先法:對(duì)短進(jìn)程優(yōu)先調(diào)度的算法,它是從后備隊(duì)列中選擇一個(gè)或者若干個(gè)進(jìn)程,將處理機(jī)分配給它,使它立即執(zhí)行并一直執(zhí)行到完成, 或發(fā)生某事件而被阻塞放棄處理機(jī)時(shí)再重新調(diào)度。</p><p><b> 二.設(shè)計(jì)方案</b></p><p> 2.1.先來(lái)先服務(wù)調(diào)度</p><p> 2.1.1.算法思想&l
13、t;/p><p> 先來(lái)先服務(wù)調(diào)度算法的思想是按照進(jìn)程進(jìn)入就緒隊(duì)列的先后順序調(diào)度并分配處理機(jī)執(zhí)行。先來(lái)先服務(wù)調(diào)度算法是一種不可搶占的算法,先進(jìn)入就緒隊(duì)列的進(jìn)程,先被處理機(jī)運(yùn)行。一旦一個(gè)進(jìn)程占有了處理機(jī),它就一直運(yùn)行下去,直到該進(jìn)程完成工作或者因?yàn)榈却呈录荒芾^續(xù)運(yùn)行時(shí)才釋放處理機(jī)。</p><p> 2.1.2.算法流程圖</p><p> 圖1.先來(lái)先服務(wù)算
14、法流程圖</p><p> 2.1.3.程序代碼</p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <string.h></p><p> typedef struct no
15、de</p><p><b> { </b></p><p> char name[10]; /*進(jìn)程名*/</p><p> int cputime; /*占用cpu時(shí)間*/</p><p> char starttime[5]; //進(jìn)程開(kāi)始時(shí)間</p><p> i
16、nt needtime; /*要求運(yùn)行時(shí)間*/</p><p> char state; /*狀態(tài)*/</p><p> struct node *next; /*指針*/</p><p><b> }PCB;</b></p><p> PCB *ready, *run, *finish
17、; //就緒、執(zhí)行、結(jié)束指針</p><p> int N; //進(jìn)程數(shù)量</p><p> void print() //輸出函數(shù)</p><p><b> {</b></p><p><b> PCB *p;</b></p><p> printf(&quo
18、t; NAME CPUTIME STARTTIME NEEDTIME STATUS\n");</p><p> if(run != NULL)</p><p> printf(" %-10s%-10d%-10s%-10d %c\n",</p><p> run->name,</p><
19、p> run->cputime,</p><p> run->starttime,</p><p> run->needtime,</p><p> run->state); /*輸出執(zhí)行的進(jìn)程的信息*/</p><p><b> p=ready;</b></p>
20、<p> while(p != NULL)</p><p><b> {</b></p><p> printf(" %-10s%-10d%-10s%-10d %c\n",</p><p><b> p->name,</b></p><p> p-&
21、gt;cputime,</p><p> p->starttime,</p><p> p->needtime,</p><p> p->state); /*輸出就緒進(jìn)程的信息*/</p><p> p=p->next; </p><p><b> }</b
22、></p><p><b> p=finish;</b></p><p> while(p != NULL)</p><p><b> {</b></p><p> printf(" %-10s%-10d%-10s%-10d %c\n",</p>&
23、lt;p><b> p->name,</b></p><p> p->cputime,</p><p> p->starttime,</p><p> p->needtime,</p><p> p->state); /*輸出結(jié)束隊(duì)列的信息*/</p>
24、<p> p=p->next; </p><p><b> }</b></p><p> getchar(); /*使用getchar()函數(shù)可以讓輸出時(shí)停留畫(huà)面,</p><p> 等待人按回車?yán)^續(xù)*/</p><p><b> } </b></p>&l
25、t;p> void insert(PCB *q) /*插入新進(jìn)程,把進(jìn)程按進(jìn)程到來(lái)時(shí)間大小排序*/</p><p><b> { </b></p><p> PCB *p1,*s,*r;</p><p><b> int b;</b></p><p> s=q; /
26、*指針s指向新要插入的進(jìn)程*/</p><p> p1=ready; /*指針p1指向原來(lái)的進(jìn)程隊(duì)列的隊(duì)首*/</p><p> r=p1; /*使用指針r是指向p1前面的進(jìn)程*/</p><p><b> b=1;</b></p><p> while((p1!=NULL)&&b
27、)</p><p> if(strcmp(p1->starttime,s->starttime)<0) </p><p><b> {</b></p><p> r=p1; p1=p1->next; </p><p> } /*新進(jìn)程的開(kāi)始時(shí)間大,則p1 指向下一個(gè)進(jìn)程繼續(xù)比*/ &l
28、t;/p><p><b> else </b></p><p> b=0; </p><p> if(r!=p1) </p><p><b> {</b></p><p> r->next=s; s-&
29、gt;next=p1; </p><p> } /*新進(jìn)程找到位置,插在r和p1之間*/</p><p><b> else</b></p><p><b> {</b></p><p> s->next=p1; ready=s; </p><p> } /
30、*新進(jìn)程的開(kāi)始時(shí)間按最小,插在隊(duì)首,并修改就緒隊(duì)首ready指針*/</p><p><b> } </b></p><p> void create() </p><p><b> { </b></p><p>
31、<b> PCB *p;</b></p><p><b> int i;</b></p><p> ready=NULL; </p><p> run=NULL; </p><p> finish=NULL;</p><p> printf("Plea
32、se enter the name and time and starttime of PCB:\n"); </p><p> /*輸入進(jìn)程名、運(yùn)行時(shí)間和開(kāi)始時(shí)間*/</p><p> for(i=0;i<N;i++) </p><p><b> { </b&
33、gt;</p><p> p=(PCB *)malloc(sizeof(PCB)); /*為新進(jìn)程開(kāi)辟空間*/</p><p> scanf("%s",p->name); /*輸入進(jìn)程名*/</p><p> scanf("%d",&p->needtime); /*輸入進(jìn)程要求運(yùn)行時(shí)間
34、*/</p><p> scanf("%s",p->starttime); //輸入進(jìn)程開(kāi)始時(shí)間</p><p> p->cputime=0; </p><p> p->state='W'; /*表示就緒隊(duì)列中未在隊(duì)首先執(zhí)行,但也是就緒狀態(tài)*/</p><p>
35、if (ready!=NULL) </p><p> insert(p); /*就緒隊(duì)首不為NULL,插入新進(jìn)程*/</p><p><b> else </b></p><p> { /*否則先插在NULL前*/</p><p> p->next=ready;</p><p&g
36、t;<b> ready=p; </b></p><p><b> } </b></p><p><b> } </b></p><p> printf(" Display is going to start: \n");&l
37、t;/p><p> printf("***********************************************\n");</p><p> print(); </p><p> getchar();</p><p> run=ready; /*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/</p
38、><p> ready=ready->next; /*ready指向下一個(gè)進(jìn)程*/</p><p> run->state='R'; /*隊(duì)首進(jìn)程的狀態(tài)為就緒*/</p><p><b> }</b></p><p> void FCFS()</p><p
39、><b> {</b></p><p> while(run != NULL)</p><p><b> {</b></p><p> run->cputime=run->cputime+run->needtime;</p><p> run->needtim
40、e=0;</p><p> run->next=finish;</p><p> finish = run;</p><p> run->state='E';</p><p> run = NULL;</p><p> if(ready != NULL)</p>&l
41、t;p><b> {</b></p><p> run = ready;</p><p> run->state='R';</p><p> ready=ready->next;</p><p><b> }</b></p><p>
42、;<b> print();</b></p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p><b> { </b></p><p> pri
43、ntf("Please enter the total number of PCB:\n");</p><p> scanf("%d",&N);</p><p> create(); /*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/</p><p> FCFS(); /*先來(lái)先服務(wù)調(diào)度算法*/</p>
44、<p><b> }</b></p><p> 2.1.4.測(cè)試結(jié)果及說(shuō)明</p><p> 首先輸入進(jìn)程個(gè)數(shù)(為5個(gè)),這里命名為A,B,C,D,E,然后分別輸入運(yùn)行時(shí)間和開(kāi)始時(shí)間</p><p> 所有進(jìn)程都在隊(duì)列中,并都處于等待狀態(tài)</p><p> 其中一個(gè)進(jìn)程執(zhí)行完畢</p>
45、<p><b> 所有進(jìn)程都執(zhí)行完畢</b></p><p><b> 2.2.優(yōu)先級(jí)調(diào)度</b></p><p> 2.2.1.算法思想</p><p> 進(jìn)程的執(zhí)行順序由高優(yōu)先級(jí)到低優(yōu)先級(jí),系統(tǒng)或用戶按某種原則為進(jìn)程指定一個(gè)優(yōu)先級(jí)來(lái)表示該進(jìn)程所享有的確調(diào)度優(yōu)先權(quán)。該算法核心是確定進(jìn)程的優(yōu)先級(jí)。<
46、;/p><p> 2.2.2.算法流程圖</p><p> 圖2.優(yōu)先級(jí)調(diào)度流程圖</p><p> 2.2.3.程序代碼</p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #inc
47、lude <string.h></p><p> typedef struct node</p><p> { char name[10]; /*進(jìn)程名*/</p><p> int prio; /*優(yōu)先數(shù)*/</p><p> int cputime; /*占用cpu時(shí)間*/</p
48、><p> int needtime; /*要求運(yùn)行時(shí)間*/</p><p> char state; /*狀態(tài)*/</p><p> struct node *next; /*指針*/</p><p><b> }PCB;</b></p><p> PCB *re
49、ady,*run,*finish; /*就緒 執(zhí)行 結(jié)束指針*/</p><p><b> int N;</b></p><p> void prt() /*輸出函數(shù),可以方便看到進(jìn)程執(zhí)行的演示*/</p><p><b> {</b></p><p><b> PCB *p
50、;</b></p><p> printf(" NAME CPUTIME NEEDTIME PRIORITY STATUS\n");</p><p> if(run!=NULL) </p><p> printf(" %-10s%-10d%-10d%-10d %c\n",run->
51、;name,run->cputime,run->needtime,run->prio,run->state); </p><p> /*輸出執(zhí)行的進(jìn)程的信息*/</p><p> p=ready; </p><p> while(p!=NULL) </p><p> {printf("
52、 %-10s%-10d%-10d%-10d %c\n",p->name,p->cputime,p->needtime,p->prio,p->state); /*輸出就緒進(jìn)程的信息*/</p><p> p=p->next; }</p><p> p=finish; </p><p> while(
53、p!=NULL)</p><p> { printf(" %-10s%-10d%-10d%-10d %c\n",p->name,p->cputime,p->needtime,p->prio,p->state); /*輸出結(jié)束隊(duì)列的信息*/</p><p> p=p->next; }</p><p&
54、gt; getchar(); } /*使用getchar()函數(shù)可以讓輸出時(shí)停留畫(huà)面,等待人按回車?yán)^續(xù)*/</p><p> void insert(PCB *q) /*插入新進(jìn)程,把進(jìn)程按優(yōu)先數(shù)大小排序*/</p><p> { PCB *p1,*s,*r;</p><p><b> int b;</b></p>
55、<p> s=q; /*指針s指向新要插入的進(jìn)程*/</p><p> p1=ready; /*指針p1指向原來(lái)的進(jìn)程隊(duì)列的隊(duì)首*/</p><p> r=p1; /*使用指針r是指向p1前面的進(jìn)程*/</p><p><b> b=1;</b></p><p> wh
56、ile((p1!=NULL)&&b)</p><p> if(p1->prio>=s->prio) { r=p1; p1=p1->next; } /*新進(jìn)程的優(yōu)先數(shù)小,則p1 指向下一個(gè)進(jìn)程繼續(xù)比*/ </p><p> else b=0; </p><p>
57、; if(r!=p1) { r->next=s; s->next=p1; } /*新進(jìn)程找到位置,插在r和p1之間*/</p><p> else { s->next=p1; ready=s; } } /*新進(jìn)程的優(yōu)先數(shù)最大,插在隊(duì)首,并</p><p> 修改就緒隊(duì)首ready指針*/</p><p> void crea
58、te() </p><p> { PCB *p;</p><p><b> int i;</b></p><p> ready=NULL; run=NULL; finish=NULL;</p><p> printf("Pl
59、ease enter the name and time and priority of PCB:\n"); </p><p> /*輸入進(jìn)程名、運(yùn)行時(shí)間和優(yōu)先級(jí)*/</p><p> for(i=0;i<N;i++) </p><p> { p=(PCB *)malloc(
60、sizeof(PCB)); /*為新進(jìn)程開(kāi)辟空間*/</p><p> scanf("%s",p->name); /*輸入進(jìn)程名*/</p><p> scanf("%d",&p->needtime); /*輸入進(jìn)程要求運(yùn)行時(shí)間*/</p><p> scanf("%d&qu
61、ot;,&p->prio); /*輸入進(jìn)程優(yōu)先數(shù)*/</p><p> p->cputime=0; </p><p> p->state='W'; /*表示就緒隊(duì)列中未在隊(duì)首先執(zhí)行,但也是就緒狀態(tài)*/</p><p> if (ready!=NULL) insert(p); /*就緒隊(duì)首不為N
62、ULL,插入新進(jìn)程*/</p><p> else { p->next=ready; ready=p; } } /*否則先插在NULL前*/ </p><p> printf(" Display is going to start: \n");</p><p> printf(&quo
63、t;***********************************************\n");</p><p><b> prt(); </b></p><p> run=ready; /*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/</p><p> ready=ready->next; /*re
64、ady指向下一個(gè)進(jìn)程,這樣當(dāng)進(jìn)程執(zhí)行時(shí)如果優(yōu)先數(shù)小于其他的進(jìn)程,應(yīng)該先進(jìn)行優(yōu)先數(shù)最大的進(jìn)程*/</p><p> run->state='R'; } /*隊(duì)首進(jìn)程的狀態(tài)為就緒*/</p><p> void prio()</p><p> { while(run!=NULL)</p><p> { ru
65、n->cputime=run->cputime+1; /*運(yùn)行一次cpu占用時(shí)間加一*/</p><p> run->needtime=run->needtime-1; /*運(yùn)行一次要求運(yùn)行時(shí)間減一*/</p><p> run->prio=run->prio-1; /*運(yùn)行一次優(yōu)先數(shù)減一*/</p><p> i
66、f(run->needtime==0) /*若要求運(yùn)行時(shí)間為0時(shí)*/</p><p> { run->next=finish; /*退出隊(duì)列*/</p><p> finish=run; /*finish為結(jié)束進(jìn)程的隊(duì)列 */</p><p> run->state='E';
67、 /*修改狀態(tài)為結(jié)束*/</p><p> run=NULL; /*釋放run指針*/</p><p> if (ready!=NULL) /*創(chuàng)建新就緒隊(duì)列的頭指針*/</p><p> { run=ready; run->state='R'; ready=ready-&g
68、t;next; } }</p><p><b> else</b></p><p> if((ready!=NULL)&&(run->prio<ready->prio))</p><p> /*隊(duì)首進(jìn)程的優(yōu)先數(shù)比它下一個(gè)小,且下一個(gè)進(jìn)程不為NULL時(shí)執(zhí)行*/</p><p> {
69、 run->state='W'; </p><p> run->next=NULL; /*隊(duì)首進(jìn)程退出進(jìn)程隊(duì)列*/</p><p> insert(run); /*在進(jìn)程隊(duì)列中重新插入原來(lái)的隊(duì)首進(jìn)程*/</p><p> run=ready; /*重新置就緒隊(duì)列的頭指針*/</p><p
70、> run->state='R';</p><p> ready=ready->next; }</p><p> prt(); } }</p><p> void main()</p><p> { printf("Please enter the total number of PC
71、B:\n");</p><p> scanf("%d",&N);</p><p> create(); /*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/</p><p> prio(); } /*優(yōu)先數(shù)調(diào)度算法*/</p><p> 2.2.4.測(cè)試結(jié)果及說(shuō)明</p><p>
72、; 優(yōu)先級(jí)調(diào)度算法運(yùn)行情況如圖1,圖2,圖3,圖4所示</p><p> 圖1.輸入進(jìn)程塊的數(shù)量</p><p> 圖2.輸入每個(gè)進(jìn)程的名稱、時(shí)間、優(yōu)先級(jí)</p><p> 圖3.輸入所有的進(jìn)程的相關(guān)信息</p><p> 圖4.所有進(jìn)程調(diào)度算法完成</p><p> 2.3.時(shí)間片輪轉(zhuǎn)調(diào)度</p&g
73、t;<p> 2.3.1.算法思想</p><p> 所有就緒進(jìn)程按先來(lái)先服務(wù)的原則排成一個(gè)隊(duì)列,將新來(lái)的進(jìn)程加到就緒對(duì)列的末尾,每當(dāng)執(zhí)行進(jìn)程調(diào)度時(shí),總是把處理機(jī)分配給隊(duì)首的進(jìn)程,各進(jìn)程占用CPU的時(shí)間片相同。也就是說(shuō)CPU的處理時(shí)間劃分成一個(gè)個(gè)相同的時(shí)間片,就緒隊(duì)列的所有進(jìn)程輪流運(yùn)行一個(gè)時(shí)間片。當(dāng)一個(gè)時(shí)間片結(jié)束時(shí),如果運(yùn)行進(jìn)程用完它的時(shí)間片后還未完成,就強(qiáng)迫運(yùn)行進(jìn)程讓出CPU,就把它送回到就緒
74、隊(duì)列的末尾,等待下一次調(diào)度。同時(shí),進(jìn)程調(diào)度又去選擇就緒隊(duì)列中的隊(duì)首進(jìn)程,分配給它一時(shí)間片,以投入運(yùn)行。直至所有的進(jìn)程運(yùn)行完畢。</p><p> 2.3.2.算法流程圖</p><p> 2.3.3.程序代碼</p><p> #include <stdio.h></p><p> #include <stdlib.
75、h></p><p> #include <string.h></p><p> typedef struct node</p><p><b> { </b></p><p> char name[10]; /*進(jìn)程名*/</p><p> int count;
76、 /*計(jì)數(shù)器,判斷是否=時(shí)間片的大小*/</p><p> int cputime; /*占用cpu時(shí)間*/</p><p> int needtime; /*要求運(yùn)行時(shí)間*/</p><p> char state; /*狀態(tài)*/</p><p> struct node *next;
77、 /*指針*/</p><p><b> }PCB;</b></p><p> PCB *ready,*run,*finish,*tail; /*就緒 執(zhí)行 結(jié)束 尾指針*/</p><p> int N,round;</p><p> void prt() /*輸出函數(shù),可以方便看到進(jìn)程執(zhí)行的演示*/
78、</p><p><b> {</b></p><p><b> PCB *p;</b></p><p> printf(" NAME CPUTIME NEEDTIME STATUS\n");</p><p> if(run!=NULL) </p&g
79、t;<p> printf(" %-10s%-10d%-10d %c\n",run->name,run->cputime,run->needtime,run->state); /*輸出執(zhí)行的進(jìn)程的信息*/</p><p> p=ready; </p><p> while(p!=NULL) </p>
80、;<p><b> { </b></p><p> printf(" %-10s%-10d%-10d %c\n",p->name,p->cputime,p->needtime,p->state); /*輸出就緒進(jìn)程的信息*/</p><p> p=p->next; </p>
81、;<p><b> }</b></p><p> p=finish; </p><p> while(p!=NULL)</p><p><b> { </b></p><p> printf(" %-10s%-10d%-10d %c\n",p->
82、;name,p->cputime,p->needtime,p->state); /*輸出結(jié)束隊(duì)列的信息*/</p><p> p=p->next; </p><p><b> }</b></p><p> getchar(); </p><p><b> }</b
83、></p><p> void insert(PCB *q) /*在隊(duì)尾插入新的進(jìn)程*/</p><p><b> { </b></p><p><b> PCB *p;</b></p><p><b> p=ready;</b></p>&l
84、t;p> while(p->next!=NULL)</p><p><b> {</b></p><p> p=ready->next;</p><p><b> }</b></p><p><b> tail=p;</b></p>&
85、lt;p> tail->next=q;</p><p> q->next=NULL; </p><p><b> }</b></p><p> void create() </p><p><b> { <
86、/b></p><p><b> PCB *p;</b></p><p><b> int i;</b></p><p> ready=NULL; run=NULL; finish=NULL;</p><p> printf("Please enter the nam
87、e and time of PCB:\n"); /*輸入進(jìn)程名、和*/</p><p> for(i=0;i<N;i++) </p><p><b> { </b></p><p> p=(PCB *)malloc(sizeof(PCB)); /*為新
88、進(jìn)程開(kāi)辟空間*/</p><p> scanf("%s",p->name); /*輸入進(jìn)程名*/</p><p> scanf("%d",&p->needtime); /*輸入進(jìn)程要求運(yùn)行時(shí)間*/</p><p> p->cputime=0; </p><
89、;p> p->state='W'; /*表示就緒隊(duì)列中未在隊(duì)首先執(zhí)行,但也是就緒狀態(tài)*/</p><p> if (ready!=NULL) insert(p); /*就緒隊(duì)首不為NULL,插入新進(jìn)程*/</p><p><b> else </b></p><p><b> {<
90、/b></p><p> p->next=ready; ready=p; tail=p; </p><p><b> } </b></p><p><b> } </b></p><p> printf(" Display is going
91、 to start: \n");</p><p> printf("***********************************************\n");</p><p><b> prt(); </b></p><p> getchar();</p>&
92、lt;p> run=ready; /*隊(duì)列排好,run指向就緒隊(duì)列隊(duì)首*/</p><p> ready=ready->next; /*ready指向下一個(gè)進(jìn)程*/</p><p> run->state='R'; </p><p> } /*隊(duì)首進(jìn)程的狀態(tài)為就緒*/</p><p>
93、; void count()</p><p><b> { </b></p><p> while(run!=NULL)</p><p><b> { </b></p><p> run->cputime=run->cputime+1; /*運(yùn)行一次cpu占用時(shí)間加一*/
94、</p><p> run->needtime=run->needtime-1; /*運(yùn)行一次要求運(yùn)行時(shí)間減一*/</p><p> run->count=run->count+1; /*運(yùn)行一次計(jì)數(shù)器加一*/</p><p> if(run->needtime==0) /*若要求運(yùn)行時(shí)間為0時(shí)*/</p&g
95、t;<p><b> { </b></p><p> run->next=finish; /*退出隊(duì)列*/</p><p> finish=run; /*finish為結(jié)束進(jìn)程的隊(duì)列 */</p><p> run->state='E';
96、 /*修改狀態(tài)為結(jié)束*/</p><p> run=NULL; /*釋放run指針*/</p><p> if (ready!=NULL) /*創(chuàng)建新就緒隊(duì)列的頭指針*/</p><p><b> {</b></p><p> run=ready; run->s
97、tate='R'; ready=ready->next; </p><p><b> } </b></p><p><b> }</b></p><p><b> else</b></p><p> if(run->count==round
98、) /*如果時(shí)間片到*/</p><p><b> { </b></p><p> run->count=0; /*計(jì)數(shù)器置0*/</p><p> if(ready!=NULL) /*如就緒隊(duì)列不空*/</p><p><b> {</b></p>&l
99、t;p> run->state='W'; </p><p> insert(run); /*在進(jìn)程隊(duì)列中重新插入原來(lái)進(jìn)程,插入隊(duì)尾*/</p><p> run=ready; /*重新置就緒隊(duì)列的頭指針*/</p><p> run->state='R';</p><p
100、> ready=ready->next; </p><p><b> }</b></p><p><b> }</b></p><p><b> prt(); </b></p><p><b> }</b></p>&
101、lt;p><b> }</b></p><p> void main()</p><p><b> { </b></p><p> printf("Please enter the total number of PCB:\n");</p><p> scanf(
102、"%d",&N);</p><p> create(); /*模擬創(chuàng)建進(jìn)程,并輸入相關(guān)信息*/</p><p> count(); /*優(yōu)先數(shù)調(diào)度算法*/</p><p><b> }</b></p><p> 2.3.4.測(cè)試結(jié)果及說(shuō)明</p><p>
103、 時(shí)間片輪轉(zhuǎn)調(diào)度算法運(yùn)行情況如圖1,圖2,圖3所示</p><p> 圖1 所有的進(jìn)程都在隊(duì)列中</p><p> 圖2 其中一個(gè)進(jìn)程執(zhí)行完畢 </p><p> 圖4 所有的進(jìn)程都執(zhí)行完畢</p><p> 2.4.多級(jí)反饋隊(duì)列調(diào)度</p><p><b> 2.4.1算法思想</b>
104、;</p><p> 允許進(jìn)程在隊(duì)列之間移動(dòng)。在系統(tǒng)中設(shè)置多個(gè)就緒隊(duì)列,每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)優(yōu)先級(jí),第一個(gè)隊(duì)列的優(yōu)先級(jí)最高,第二隊(duì)列次之。以下各隊(duì)列的優(yōu)先級(jí)逐步低。各就緒隊(duì)列中的進(jìn)程的運(yùn)行時(shí)間片不同,高優(yōu)先級(jí)隊(duì)列的時(shí)間片小,低優(yōu)先級(jí)隊(duì)列的時(shí)間片大。進(jìn)程并非總是固定在某一隊(duì)列中,新進(jìn)程進(jìn)入系統(tǒng)后,被存放在第一個(gè)隊(duì)列的末尾。如果某個(gè)進(jìn)程在規(guī)定的時(shí)間片內(nèi)沒(méi)有完成工作,則把它轉(zhuǎn)入到下一個(gè)隊(duì)列的末尾,直至進(jìn)入最后一個(gè)隊(duì)列。系
105、統(tǒng)先運(yùn)行第一個(gè)隊(duì)列中的進(jìn)程。當(dāng)?shù)谝魂?duì)列為空時(shí),才運(yùn)行第二個(gè)隊(duì)列中的進(jìn)程。依此類推,僅當(dāng)前面所有的隊(duì)列都為空時(shí),才運(yùn)行最后一個(gè)隊(duì)列中的進(jìn)程。當(dāng)處理器正在第i個(gè)隊(duì)列中為某個(gè)進(jìn)程服務(wù)時(shí),又有新進(jìn)程進(jìn)入優(yōu)先級(jí)最高的隊(duì)列(第1—(i-1)中的任何一個(gè)對(duì)列),則此新進(jìn)程要搶占正在運(yùn)行進(jìn)程的處理器,即由調(diào)度程序把正在運(yùn)行的進(jìn)程放回第i隊(duì)列的末尾,把處理器分配給新到的高優(yōu)先級(jí)進(jìn)程。除最低優(yōu)先權(quán)隊(duì)列外的所有其他隊(duì)列,均采用相同的進(jìn)程調(diào)度算法,即按時(shí)間片輪
106、轉(zhuǎn)的FIFO(先進(jìn)先出)算法。最后一個(gè)隊(duì)列中的進(jìn)程按按時(shí)間片輪轉(zhuǎn)或FCFS策略進(jìn)行調(diào)度。它是綜合了FIFO、RR和剝奪式HPF的一種進(jìn)程調(diào)度算法。</p><p> 2.4.2算法流程圖</p><p><b> 2.4.3程序代碼</b></p><p> #include<stdio.h></p><p
107、> #include <stdlib.h></p><p> #include <string.h></p><p> #define NULL 0</p><p> typedef struct node</p><p><b> {</b></p><p&g
108、t; char name[10]; /*進(jìn)程名*/</p><p> int num;/*進(jìn)程所在隊(duì)列數(shù),也是該隊(duì)列的時(shí)間片*/</p><p> int cputime; /*占用cpu時(shí)間*/</p><p> int needtime; /*要求運(yùn)行時(shí)間*/</p><p> struct node
109、 *next; /*指針*/</p><p><b> }PCB;</b></p><p> PCB *qf1,*ql1;</p><p> PCB *qf2,*ql2;</p><p> PCB *qf3,*ql3;//定義三個(gè)隊(duì)列的頭指針和尾指針</p><p> int blo
110、g1,blog2,blog3;/*分別記錄隊(duì)列1,、隊(duì)列2、隊(duì)列3中進(jìn)程數(shù)*/</p><p> void insert(PCB *q,PCB *qf,PCB *ql) </p><p><b> {</b></p><p><b> q->num++;</b></p><p> i
111、f(qf==NULL&&ql==NULL)</p><p><b> { //隊(duì)列為空</b></p><p> qf=ql=q; </p><p><b> }</b></p><p><b> else</b></p><p&g
112、t;<b> {//隊(duì)列不為空</b></p><p> ql->next=q;</p><p><b> ql=q;</b></p><p><b> }</b></p><p> ql->next=NULL;</p><p>&
113、lt;b> }</b></p><p> void create(int n)</p><p> {//創(chuàng)建進(jìn)程,剛來(lái)的進(jìn)程都進(jìn)入隊(duì)列1</p><p><b> PCB *p;</b></p><p> p=(PCB *)malloc(sizeof(PCB));</p><
114、;p><b> int i;</b></p><p> blog1=blog2=blog3=0;//各隊(duì)列中進(jìn)程數(shù)均為0</p><p> printf("Please enter the name and needtime of PCB:\n"); </p><p> /*輸入進(jìn)程名和所需時(shí)間*/</
115、p><p> for(i=0;i<n;i++) </p><p><b> { </b></p><p> //p=(PCB *)malloc(sizeof(PCB)); /*為新進(jìn)程開(kāi)辟空間*/</p><p> scanf("%s
116、",p->name); /*輸入進(jìn)程名*/</p><p> scanf("%d",&(p->needtime)); /*輸入進(jìn)程要求運(yùn)行時(shí)間*/</p><p> p->cputime=0;</p><p><b> p->num=0;</b></p>
117、<p> insert(p,qf1,ql1);</p><p> blog1++;//隊(duì)列中進(jìn)程數(shù)加1</p><p><b> }</b></p><p><b> }</b></p><p> int run(PCB *q,PCB *qf,PCB *ql)</p&
118、gt;<p><b> {</b></p><p> PCB *p,*f,*l;</p><p> /*p=(PCB *)malloc(sizeof(PCB));</p><p> f=(PCB *)malloc(sizeof(PCB));</p><p> l=(PCB *)malloc(siz
119、eof(PCB));*/</p><p><b> p=q;</b></p><p><b> f=qf;</b></p><p><b> l=ql;</b></p><p> if(q->needtime<=q->num) /*在時(shí)間片內(nèi)完成*/&
120、lt;/p><p><b> {</b></p><p> //q->cputime+=q->needtime;</p><p> q->needtime=0;</p><p><b> free(q);</b></p><p><b> r
121、eturn 0;</b></p><p><b> }</b></p><p> else/*不能在時(shí)間片內(nèi)完成*/</p><p><b> {</b></p><p> //q->cputime+=q->num;</p><p> q-
122、>needtime-=q->num;</p><p> if(q->num<3)</p><p><b> q->num++;</b></p><p> insert(p,f,l);//進(jìn)入下一個(gè)隊(duì)列</p><p><b> return 1;</b><
123、;/p><p><b> }</b></p><p><b> }</b></p><p> void prt() /*輸出函數(shù),可以方便看到進(jìn)程執(zhí)行的演示*/</p><p><b> {</b></p><p><b> PCB *
124、p;</b></p><p> //p=(PCB *)malloc(sizeof(PCB));</p><p><b> int a;</b></p><p> printf(" NAME CPUTIME NEEDTIME STATUS\n");</p><p> w
125、hile(blog1>0||blog2>0||blog3>0)</p><p><b> {</b></p><p> if(blog1>0)/*第一個(gè)隊(duì)列不為空*/</p><p><b> {</b></p><p><b> p=qf1;</
126、b></p><p> qf1=qf1->next;</p><p> p->next=NULL;</p><p><b> blog1--;</b></p><p> printf(" %-10s%-10d%\n",p->name,p->needtime);
127、</p><p> a=run(p,qf2,ql2);</p><p><b> if(a==1)</b></p><p><b> blog2++;</b></p><p><b> }</b></p><p> else if(blog2&
128、gt;0)/*第二個(gè)隊(duì)列不為空*/</p><p><b> {</b></p><p><b> p=qf2;</b></p><p> qf2=qf2->next;p->next=NULL;</p><p><b> blog2--;</b></
129、p><p> printf(" %-10s%-10d%\n",p->name,p->needtime); </p><p> a=run(p,qf3,ql3);</p><p><b> if(a==1)</b></p><p><b> blog3++;</b>
130、;</p><p><b> }</b></p><p> else if(blog3>0)/*第三個(gè)隊(duì)列不為空*/</p><p><b> {</b></p><p><b> p=qf3;</b></p><p> qf3=qf3
131、->next;p->next=NULL;</p><p><b> blog3--;</b></p><p> printf(" %-10s%-10d%\n",p->name,p->needtime); </p><p> a=run(p,qf3,ql3);</p><p&
132、gt;<b> if(a==1)</b></p><p><b> blog3++;</b></p><p><b> }</b></p><p><b> }</b></p><p> } /*使用getchar()函數(shù)可以讓輸出時(shí)停留畫(huà)面,
133、等待人按回車?yán)^續(xù)*/</p><p> void main()</p><p><b> {</b></p><p> qf1=ql1=(PCB *)malloc(sizeof(PCB));</p><p> qf2=ql2=(PCB *)malloc(sizeof(PCB));</p><p
134、> qf2=ql2=(PCB *)malloc(sizeof(PCB));</p><p><b> int n;</b></p><p> blog1=blog2=blog3=0;</p><p> printf("請(qǐng)輸入進(jìn)程的個(gè)數(shù): ");</p><p> scanf("
135、;%d",&n);</p><p> create(n);</p><p><b> prt();</b></p><p><b> }</b></p><p> 2.4.4測(cè)試結(jié)果及說(shuō)明</p><p><b> 2.5.短作業(yè)調(diào)度&l
136、t;/b></p><p> 2.5.1.算法思想</p><p> 短作業(yè)優(yōu)先調(diào)度算法是指對(duì)短作業(yè)進(jìn)行調(diào)度的算法。它從后備隊(duì)列總選擇一個(gè)或若干個(gè)運(yùn)行時(shí)間最短的作業(yè),將他們調(diào)入內(nèi)存運(yùn)行。</p><p> 2.5.2.算法流程圖:</p><p><b> Y</b></p><p>
137、;<b> N</b></p><p> 短作業(yè)優(yōu)先算法流程圖</p><p> 2.5.3.程序代碼</p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 進(jìn)程調(diào)度模擬系統(tǒng)課程設(shè)計(jì)
- 進(jìn)程調(diào)度模擬程序課程設(shè)計(jì)
- 進(jìn)程調(diào)度算法 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)-進(jìn)程調(diào)度模擬
- [優(yōu)秀畢業(yè)設(shè)計(jì)精品] 進(jìn)程模擬調(diào)度程序
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì) (2)
- 操作系統(tǒng)_進(jìn)程調(diào)度算法課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度模擬設(shè)計(jì)
- 《高級(jí)語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)--進(jìn)程調(diào)度模擬
- 磁盤調(diào)度算法課程設(shè)計(jì)--模擬磁盤調(diào)度算法系統(tǒng)的設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---多級(jí)反饋隊(duì)列進(jìn)程調(diào)度算法
- 通信原理課程設(shè)計(jì)——模擬調(diào)制信號(hào)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度子系統(tǒng)模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---進(jìn)程調(diào)度的模擬實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論