課程設(shè)計(jì)報(bào)告---處理機(jī)調(diào)度模擬程序_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  設(shè)計(jì)報(bào)告題目:處理機(jī)調(diào)度模擬程序</p><p><b>  目錄</b></p><p>  一、課程設(shè)計(jì)題目....................................3</p><p>  二、基本概念及思想..................................3</p>&l

2、t;p>  三、部分程序主要流程圖..............................9</p><p>  四、操作截圖.......................................11</p><p>  五、程序源代碼.....................................12</p><p>  六、心得體會(huì)及

3、總結(jié).................................21</p><p>  一. 課程設(shè)計(jì)題目:</p><p>  課題1:理機(jī)調(diào)度模擬程序:選擇一個(gè)調(diào)度算法,實(shí)現(xiàn)處理機(jī)調(diào)度。</p><p>  設(shè)計(jì)目的:在多道程序和多任務(wù)系統(tǒng)中,系統(tǒng)內(nèi)同時(shí)處于就緒狀態(tài)的進(jìn)程可能有若干個(gè)。也就是說(shuō)能運(yùn)行的進(jìn)程數(shù)大于處理機(jī)個(gè)數(shù)。為了使系統(tǒng)中的進(jìn)程能有條不紊地工

4、作,必須選用某種調(diào)度策略,選擇一進(jìn)程占用處理機(jī)。要求學(xué)生設(shè)計(jì)一個(gè)模擬處理機(jī)調(diào)度算法,以鞏固和加深處理機(jī)調(diào)度的概念。</p><p><b>  設(shè)計(jì)要求:</b></p><p>  1)進(jìn)程調(diào)度算法包括:時(shí)間片輪轉(zhuǎn)法,短作業(yè)優(yōu)先算法,最高響應(yīng)比優(yōu)先算法。</p><p><b>  2)可選擇進(jìn)程數(shù)量</b></p

5、><p>  3)本程序包括三種算法,可用C語(yǔ)言實(shí)現(xiàn),執(zhí)行時(shí)在主界面選擇算法(可用函數(shù)實(shí)現(xiàn)),進(jìn)入子頁(yè)面后輸入進(jìn)程數(shù)及每個(gè)進(jìn)程的運(yùn)行時(shí)間,每個(gè)進(jìn)程的優(yōu)先數(shù)由隨機(jī)函數(shù)產(chǎn)生且優(yōu)先數(shù)隨等待時(shí)間而變化,執(zhí)行,顯示結(jié)果。</p><p>  二. 基本概念及思想:</p><p>  (1)進(jìn)程的創(chuàng)建:由系統(tǒng)為某個(gè)進(jìn)程設(shè)置一個(gè)進(jìn)程控制塊PCB,用于對(duì)進(jìn)程進(jìn)行控制和管理。進(jìn)程任務(wù)完

6、成,由系統(tǒng)收回其PCB,該進(jìn)程便消亡。</p><p>  (2)進(jìn)程的三種狀態(tài):運(yùn)行、就緒、完成。進(jìn)程的三種狀態(tài)可以通過(guò)設(shè)計(jì)三個(gè)鏈隊(duì)列來(lái)實(shí)現(xiàn):finish為完成隊(duì)列的頭指針,ready為就緒隊(duì)列的頭指針,tail為循環(huán)輪轉(zhuǎn)法隊(duì)列的尾指針。因?yàn)槊恳粫r(shí)刻,CPU只能運(yùn)行一個(gè)進(jìn)程,所以運(yùn)行隊(duì)列只有一個(gè)run指針指向當(dāng)前運(yùn)行進(jìn)程。</p><p>  (3)進(jìn)程調(diào)度的功能:按照一定的策略從就緒隊(duì)

7、列的多個(gè)進(jìn)程中選取一個(gè)進(jìn)程,使其獲得CPU而運(yùn)行。</p><p> ?、賱?dòng)態(tài)優(yōu)先數(shù)調(diào)度算法: </p><p>  思想:為每一個(gè)進(jìn)程設(shè)一個(gè)優(yōu)先數(shù),它總是把處理機(jī)給就緒隊(duì)列中具有最高優(yōu)先級(jí)的進(jìn)程。初始的進(jìn)程優(yōu)先數(shù)是隨機(jī)產(chǎn)生的,隨著進(jìn)程的運(yùn)行對(duì)優(yōu)先數(shù)進(jìn)行調(diào)整,每次運(yùn)行時(shí)都是從就緒隊(duì)列中選取優(yōu)先數(shù)最大的進(jìn)程運(yùn)行,所以將就緒隊(duì)列按照優(yōu)先數(shù)的大小從高到低排序,這樣,每次取對(duì)首進(jìn)程即可。將進(jìn)程按優(yōu)

8、先數(shù)的大小排列在就緒隊(duì)列中,每次選取就緒隊(duì)列中優(yōu)先權(quán)最高的進(jìn)程首先占用處理機(jī)。優(yōu)先數(shù)由隨機(jī)函數(shù)產(chǎn)生進(jìn)程最初的優(yōu)先數(shù)。優(yōu)先數(shù)的動(dòng)態(tài)變化:進(jìn)程每執(zhí)行一次優(yōu)先數(shù)-1。優(yōu)先數(shù)隨著進(jìn)程的執(zhí)行進(jìn)行調(diào)整,每次執(zhí)行時(shí)都從就緒隊(duì)列中選取優(yōu)先數(shù)最大的進(jìn)程投入運(yùn)行。</p><p> ?、跁r(shí)間片輪轉(zhuǎn)調(diào)度算法:</p><p>  思想:將所有進(jìn)程按照先來(lái)先服務(wù)的規(guī)則排成一個(gè)隊(duì)列,把CPU分配給就緒隊(duì)列的隊(duì)首進(jìn)程

9、,并規(guī)定它的執(zhí)行時(shí)間(稱(chēng)此時(shí)間為時(shí)間片),當(dāng)時(shí)間片用完但并未執(zhí)行結(jié)束時(shí),剝奪該進(jìn)程的執(zhí)行,將其鏈接到就緒隊(duì)列的隊(duì)尾,等待下一次的選擇。將就緒隊(duì)列的隊(duì)首指針投入運(yùn)行。</p><p> ?、鄱套鳂I(yè)優(yōu)先調(diào)度算法(不可剝奪式的)</p><p>  思想:根據(jù)估計(jì)運(yùn)行時(shí)間的長(zhǎng)短,將各個(gè)進(jìn)程排成一個(gè)就緒隊(duì)列(估計(jì)運(yùn)行時(shí)間最短的進(jìn)程排在隊(duì)首),每次運(yùn)行將隊(duì)首進(jìn)程投入運(yùn)行,直到運(yùn)行結(jié)束,將此進(jìn)程連接到

10、完成隊(duì)列的隊(duì)尾。然后,再將下一個(gè)隊(duì)首進(jìn)程投入運(yùn)行,直到所有的進(jìn)程都運(yùn)行完畢。</p><p><b>  PCB結(jié)構(gòu)體:</b></p><p>  typedef struct node</p><p>  { char name[10]; /*進(jìn)程時(shí)間輪轉(zhuǎn)時(shí)間片*/</p><p>  int pid;

11、 /*進(jìn)程的標(biāo)號(hào)*/ </p><p>  int prio; /*優(yōu)先級(jí)*/ </p><p>  int round; /*時(shí)間片*/</p><p>  int cputime; /*進(jìn)程占用cpu的時(shí)間*/</p><p>  int runtime; /*進(jìn)程運(yùn)

12、行所用的時(shí)間*/</p><p>  int waittime; /*進(jìn)程的等待時(shí)間*/</p><p>  int length; /*進(jìn)程的長(zhǎng)度*/</p><p>  int count; /*計(jì)數(shù)器*/</p><p>  char state; /*進(jìn)程的狀態(tài)*/ </p><

13、;p>  struct node *next;/*鏈指針*/</p><p>  }PCB; PCB結(jié)構(gòu)體用于標(biāo)識(shí)進(jìn)程的創(chuàng)建與撤消。</p><p><b>  鏈指針:</b></p><p>  PCB *finish,*ready,*tail,*run;.</p><p>  Finish:完成隊(duì)列的首指針

14、,用于標(biāo)識(shí)完成隊(duì)列;</p><p>  Ready:就緒隊(duì)列的首指針,用于標(biāo)識(shí)就緒隊(duì)列;;</p><p>  Run:運(yùn)行隊(duì)列的首指針,用于標(biāo)識(shí)運(yùn)行隊(duì)列;;</p><p>  Tail:循環(huán)輪轉(zhuǎn)隊(duì)列的尾指針;</p><p>  2.3 Create1(),create2(),create3()分別為創(chuàng)建進(jìn)程的函數(shù)</p>

15、<p>  Create1( ):按照優(yōu)先級(jí)調(diào)度算法創(chuàng)建進(jìn)程,用戶(hù)輸入進(jìn)程名及進(jìn)程所需的時(shí)間后,創(chuàng)建每個(gè)進(jìn)程的PCB,將每個(gè)進(jìn)程的PCB調(diào)用函數(shù)insert1()按照優(yōu)先數(shù)從高到低排列到就緒隊(duì)列中。</p><p>  create2( ):按照時(shí)間片調(diào)度算法創(chuàng)建進(jìn)程,用戶(hù)輸入進(jìn)程名及進(jìn)程所需的時(shí)間后,創(chuàng)建每個(gè)進(jìn)程的PCB,將每個(gè)進(jìn)程的PCB調(diào)用函數(shù)insert2( )將每個(gè)進(jìn)程PCB按照輸入的先后順

16、序插入到就緒隊(duì)列的末尾。</p><p>  create3( ):按照短作業(yè)優(yōu)先調(diào)度算法創(chuàng)建進(jìn)程,用戶(hù)輸入進(jìn)程名及進(jìn)程所需的時(shí)間后,創(chuàng)建每個(gè)進(jìn)程的PCB,將每個(gè)進(jìn)程的PCB調(diào)用函數(shù)insert3( ):按照作業(yè)估計(jì)執(zhí)行時(shí)間的長(zhǎng)短從高到低排列到就緒隊(duì)列中。</p><p>  就緒隊(duì)列創(chuàng)建好后,將隊(duì)列當(dāng)中的第一個(gè)PCB變?yōu)檫\(yùn)行態(tài)“R”,將run 指針指向它,ready指針后移,作為就緒隊(duì)列

17、的新頭指針,然后調(diào)用調(diào)度算法。注意每個(gè)時(shí)刻只能有一個(gè)進(jìn)程處于運(yùn)行態(tài)。</p><p>  2.4 insert1(),insert2(),insert3()分別為插入函數(shù)</p><p>  這三個(gè)函數(shù)完成的是就緒隊(duì)列的創(chuàng)建和管理。</p><p> ?、賗nsert1()的功能是將未完成且優(yōu)先數(shù)小于其它進(jìn)程的PCB按進(jìn)程優(yōu)先數(shù)的順序插入到就緒隊(duì)列中去。</p

18、><p> ?、趇nsert2()的功能是將執(zhí)行了一個(gè)時(shí)間片且還未完成的進(jìn)程的PCB插入到就緒隊(duì)列的隊(duì)尾。</p><p> ?、?insert3()的功能是將未完成且作業(yè)的執(zhí)行時(shí)間小于其它進(jìn)程的PCB按進(jìn)程的作業(yè)的執(zhí)行時(shí)間的長(zhǎng)短插入到就緒隊(duì)列中去。</p><p>  2.5 priority()優(yōu)先數(shù)調(diào)度算法</p><p> ?、偌俣ㄏ到y(tǒng)有

19、三個(gè)進(jìn)程,每一個(gè)進(jìn)程用一個(gè)進(jìn)程控制塊PCB來(lái)代表,進(jìn)程控制塊的格式為:</p><p>  typedef struct node</p><p><b>  { </b></p><p>  int pid; /*進(jìn)程的標(biāo)號(hào)*/ </p><p>  int prio;

20、 /*優(yōu)先級(jí)*/ </p><p>  int cputime; /*進(jìn)程占用cpu的時(shí)間*/</p><p>  int runtime; /*進(jìn)程運(yùn)行所用的時(shí)間*/</p><p>  char state; /*進(jìn)程的狀態(tài)*/ </p><p>  struct node *next;/*鏈指針*/<

21、/p><p><b>  }PCB; </b></p><p>  進(jìn)程名,優(yōu)先數(shù), 進(jìn)程占用cpu的時(shí)間, 進(jìn)程到完成還需的時(shí)間, 狀態(tài) </p><p>  進(jìn)程名:作為進(jìn)程的標(biāo)識(shí),假設(shè)三個(gè)進(jìn)程的進(jìn)程名分別為P1,P2,P3。</p><p>  進(jìn)程占用cpu的時(shí)間;假設(shè)進(jìn)程已經(jīng)運(yùn)行的單位時(shí)間數(shù),初始值為“0”。<

22、;/p><p>  優(yōu)先數(shù):賦予進(jìn)程的優(yōu)先數(shù),調(diào)度時(shí)總是選取優(yōu)先數(shù)大的進(jìn)程先執(zhí)行。</p><p>  狀態(tài);有三種狀態(tài),“就緒”狀態(tài),“運(yùn)行”狀態(tài)和“完成”狀態(tài)。三個(gè)進(jìn)程的初始狀態(tài)都為“就緒”,用“w”表示,當(dāng)一個(gè)進(jìn)程運(yùn)行結(jié)束后,它的狀態(tài)為“完成”,用“F”表示,當(dāng)一個(gè)進(jìn)程正在占用cpu ,它的狀態(tài)為“運(yùn)行”狀態(tài)。</p><p> ?、?在每次運(yùn)行所設(shè)計(jì)的優(yōu)先數(shù)調(diào)度

23、程序之前,為每個(gè)進(jìn)程隨機(jī)確定它的“優(yōu)先數(shù)”和“要求運(yùn)行時(shí)間”。</p><p> ?、蹫榱苏{(diào)度方便,把三個(gè)進(jìn)程按隨機(jī)產(chǎn)生的優(yōu)先數(shù)從大到小連成隊(duì)列。用一單元指出隊(duì)首進(jìn)程,用指針指出隊(duì)列的連接情況。</p><p> ?、?優(yōu)先數(shù)調(diào)度總是選隊(duì)首進(jìn)程運(yùn)行。采用動(dòng)態(tài)改變優(yōu)先數(shù)的辦法,進(jìn)程每運(yùn)行一次優(yōu)先數(shù)就減“1”。而是執(zhí)行: </p><p><b>  優(yōu)先數(shù)-

24、1</b></p><p><b>  要求運(yùn)行時(shí)間-1</b></p><p>  進(jìn)程占用cpu的時(shí)間+1,</p><p>  來(lái)模擬進(jìn)程的一次運(yùn)行。 </p><p> ?、葸M(jìn)程運(yùn)行一次后,若要求運(yùn)行時(shí)間〉0,則再將它插入就緒隊(duì)列(按優(yōu)先數(shù)大小插入,且置隊(duì)首標(biāo)志);若要求運(yùn)行時(shí)間=0,則把它的狀態(tài)修

25、改成“完成”(F),且退出隊(duì)列。</p><p> ?、?若“就緒”狀態(tài)的進(jìn)程隊(duì)列不為空,則重復(fù)上面(4)和(5)的步驟,直到所有進(jìn)程都成為“完成”狀態(tài)。</p><p> ?、咴谠O(shè)計(jì)的程序中有顯示或打印語(yǔ)句,能顯示或打印每次被選中進(jìn)程的進(jìn)程名以及運(yùn)行一次后進(jìn)程隊(duì)列的變化及狀態(tài)。</p><p> ?、?為三個(gè)進(jìn)程隨機(jī)確定一組“優(yōu)先數(shù)”和“要求運(yùn)行時(shí)間”,啟動(dòng)所設(shè)計(jì)

26、的處理器調(diào)度程序,顯示或打印逐次被選中進(jìn)程的進(jìn)程名以及進(jìn)程控制塊的動(dòng)態(tài)變化過(guò)程。</p><p>  注意:進(jìn)程的優(yōu)先數(shù)值越小,則代表其優(yōu)先權(quán)越高。 </p><p>  2.6 roundrun()時(shí)間片輪轉(zhuǎn)法調(diào)度算法</p><p> ?、?假定系統(tǒng)有三個(gè)進(jìn)程,每一個(gè)進(jìn)程用一個(gè)進(jìn)程控制塊PCB來(lái)代表。進(jìn)程控制塊的格式為: </p><p>

27、;  進(jìn)程名,進(jìn)程占用cpu的時(shí)間,進(jìn)程到完成還需的時(shí)間,時(shí)間片,計(jì)數(shù)器,狀態(tài) </p><p>  進(jìn)程名——作為進(jìn)程的標(biāo)識(shí),假設(shè)三個(gè)進(jìn)程的進(jìn)程名分別是p1,p2,p3。</p><p>  時(shí)間片——時(shí)間片輪轉(zhuǎn)循環(huán)所需的時(shí)間總數(shù)。</p><p>  計(jì)數(shù)器——對(duì)進(jìn)程執(zhí)行時(shí)間進(jìn)行計(jì)數(shù)。</p><p>  進(jìn)程占用cpu的時(shí)間——假設(shè)進(jìn)程

28、已經(jīng)運(yùn)行的單位時(shí)間數(shù),初始值為“0”。 </p><p>  狀態(tài)——有三種狀態(tài),“就緒”狀態(tài),“運(yùn)行”狀態(tài)和“完成”狀態(tài)。三個(gè)進(jìn)程的初始狀態(tài)都為“就緒”,用“w”表示,當(dāng)一個(gè)進(jìn)程運(yùn)行結(jié)束后,它的狀態(tài)為“完成”,用“F”表示,當(dāng)一個(gè)進(jìn)程正在占用cpu 時(shí),它的狀態(tài)為“運(yùn)行”狀態(tài)。</p><p> ?、?每次運(yùn)行所設(shè)計(jì)的時(shí)間片輪轉(zhuǎn)調(diào)度程序之前,為每個(gè)進(jìn)程任意確定它的“要求運(yùn)行時(shí)間”。&l

29、t;/p><p> ?、?把三個(gè)進(jìn)程按先來(lái)先服務(wù)的順序排成循環(huán)隊(duì)列,用指針指出隊(duì)列連接情況。時(shí)間片輪轉(zhuǎn)調(diào)度總是選擇ready指針指示的進(jìn)程運(yùn)行。而是執(zhí)行:</p><p>  進(jìn)程到完成還需的時(shí)間-1</p><p>  進(jìn)程占用cpu的時(shí)間+1</p><p><b>  計(jì)數(shù)器+1</b></p><

30、p>  來(lái)模擬進(jìn)程的一次運(yùn)行,表示進(jìn)程已經(jīng)運(yùn)行過(guò)一個(gè)單位的時(shí)間。</p><p>  2.7 shortjob()短作業(yè)優(yōu)先法調(diào)度算法</p><p> ?、偌俣ㄏ到y(tǒng)有三個(gè)進(jìn)程,每一個(gè)進(jìn)程用一個(gè)進(jìn)程控制塊PCB來(lái)代表,進(jìn)程控制塊的格式為:</p><p>  進(jìn)程名, 進(jìn)程占用cpu的時(shí)間, 進(jìn)程到完成還需的時(shí)間, 狀態(tài)</p><p&g

31、t;  進(jìn)程名——作為進(jìn)程的標(biāo)識(shí),假設(shè)三個(gè)進(jìn)程的進(jìn)程名分別為P1,P2,P3。</p><p>  進(jìn)程占用cpu的時(shí)間——假設(shè)進(jìn)程已經(jīng)運(yùn)行的單位時(shí)間數(shù),初始值為“0”。</p><p>  狀態(tài)——有三種狀態(tài),“就緒”狀態(tài),“運(yùn)行”狀態(tài)和“完成”狀態(tài)。三個(gè)進(jìn)程的初始狀態(tài)都為“就緒”,用“w”表示,當(dāng)一個(gè)進(jìn)程運(yùn)行結(jié)束后,它的狀態(tài)為“完成”,用“F”表示,當(dāng)一個(gè)進(jìn)程正在占用cpu 時(shí),它的狀

32、態(tài)為“運(yùn)行”狀態(tài)。</p><p>  ②在每次運(yùn)行所設(shè)計(jì)的短作業(yè)優(yōu)先調(diào)度程序之前,為每個(gè)進(jìn)程任意確定它的“要求運(yùn)行時(shí)間”。</p><p>  ③ 為了調(diào)度方便,把三個(gè)進(jìn)程按任意給定的作業(yè)長(zhǎng)短進(jìn)行排序。用一單元指出隊(duì)首進(jìn)程,用指針指出隊(duì)列的連接情況。每次取對(duì)首進(jìn)程即可。</p><p> ?、?短作業(yè)調(diào)度總是選隊(duì)首進(jìn)程運(yùn)行。進(jìn)程每運(yùn)行一次,</p>

33、<p><b>  要求運(yùn)行時(shí)間-1</b></p><p>  進(jìn)程占用cpu的時(shí)間+1</p><p>  來(lái)模擬進(jìn)程的一次運(yùn)行。</p><p> ?、葸M(jìn)程運(yùn)行一次后,若要求運(yùn)行時(shí)間〉0,則再將它插入就緒隊(duì)列(按作業(yè)長(zhǎng)短插入,且置隊(duì)首標(biāo)志);若要求運(yùn)行時(shí)間=0,則把它的狀態(tài)修改成“完成”(F),且退出隊(duì)列。</p>

34、<p> ?、?若“就緒”狀態(tài)的進(jìn)程隊(duì)列不為空,則重復(fù)上面(4)和(5)的步驟,直到所有進(jìn)程都成為“完成”狀態(tài)。</p><p> ?、?在設(shè)計(jì)的程序中有顯示或打印語(yǔ)句,能顯示或打印每次被選中進(jìn)程的進(jìn)程名以及運(yùn)行一次后進(jìn)程隊(duì)列的變化及狀態(tài)。</p><p> ?、?為三個(gè)進(jìn)程隨機(jī)確定“要求運(yùn)行時(shí)間”,啟動(dòng)所設(shè)計(jì)的處理器調(diào)度程序,顯示或打印逐次被選中進(jìn)程的進(jìn)程名以及進(jìn)程控制塊的動(dòng)

35、態(tài)變化過(guò)程。</p><p><b>  2.8 界面設(shè)計(jì):</b></p><p>  主界面:選擇調(diào)度算法;</p><p>  子界面:輸入進(jìn)程數(shù),進(jìn)程名及進(jìn)程所需的時(shí)間;</p><p>  利用c語(yǔ)言中的畫(huà)圖函數(shù)及清屏函數(shù)設(shè)計(jì)界面。</p><p>  三.部分程序主要流程圖:</

36、p><p><b>  main</b></p><p><b>  Prt1()</b></p><p>  insert1()函數(shù)</p><p><b>  四.操作截圖:</b></p><p>  主界面設(shè)計(jì):(1,2,3算法 4退出)</p

37、><p>  算法1:動(dòng)態(tài)優(yōu)先級(jí)算法</p><p>  算法2:時(shí)間片輪轉(zhuǎn)法</p><p>  算法3:短作業(yè)優(yōu)先法</p><p><b>  五.程序源代碼</b></p><p>  #include <stdio.h></p><p>  #includ

38、e <stdlib.h></p><p>  #include <string.h></p><p>  #include <time.h></p><p>  typedef struct node</p><p><b>  {</b></p><p>  

39、char name[10];</p><p><b>  int prio;</b></p><p>  int round;</p><p>  int cputime;</p><p>  int needtime;</p><p>  int count;</p><p&

40、gt;  char state;</p><p>  struct node *next;</p><p><b>  }PCB;</b></p><p>  PCB *finish,*ready,*tail,*run;</p><p><b>  int N;</b></p><

41、;p><b>  firstin()</b></p><p><b>  {</b></p><p>  run=ready;</p><p>  run->state='R';</p><p>  ready=ready->next;</p><

42、;p><b>  }</b></p><p>  int timesj(void)</p><p><b>  {</b></p><p><b>  int i,xt;</b></p><p><b>  time_t t;</b></p&g

43、t;<p>  srand((unsigned) time(&t));</p><p>  xt = rand() % 10 +1;</p><p>  return xt;</p><p><b>  }</b></p><p>  void prt1(char a)</p><

44、;p><b>  {</b></p><p>  if(toupper(a)=='1')</p><p>  printf(" name cputime needtime priority state\n");</p><p><b>  else</b></

45、p><p>  if(toupper(a)=='2')</p><p>  printf(" name cputime needtime priority state\n");</p><p><b>  else </b></p><p>  printf("

46、 name cputime needtime priority state\n");</p><p><b>  }</b></p><p>  void prt2(char a,PCB *q)</p><p><b>  {</b></p><p>  if(toupper

47、(a)=='1')</p><p>  printf(" %-10s%-10d%-10d%-10d %c\n",q->name,</p><p>  q->cputime,q->needtime,q->prio,q->state);</p><p><b>  else</b>

48、</p><p>  if(toupper(a)=='2')</p><p>  printf(" %-10s%-10d%-10d%-10d %c\n",q->name,</p><p>  q->cputime,q->needtime,q->prio,q->state);</p>&

49、lt;p><b>  else</b></p><p>  printf(" %-10s%-10d%-10d%-10d %c\n",q->name,</p><p>  q->cputime,q->needtime,q->prio,q->state);</p><p><b>

50、  }</b></p><p>  void prt(char algo)</p><p><b>  {</b></p><p><b>  PCB *p;</b></p><p>  prt1(algo); </p><p>  if(run!=NULL)

51、</p><p>  prt2(algo,run); </p><p>  p=ready; </p><p>  while(p!=NULL)</p><p><b>  {</b></p><p>  prt2(algo,p);</p><p>  p=p->n

52、ext;</p><p><b>  }</b></p><p>  p=finish; </p><p>  while(p!=NULL)</p><p><b>  {</b></p><p>  prt2(algo,p);</p><p>  

53、p=p->next;</p><p><b>  }</b></p><p>  getch(); </p><p><b>  return;</b></p><p><b>  }</b></p><p>  insert1(PCB *q)&

54、lt;/p><p><b>  {</b></p><p>  PCB *p1,*s,*r;</p><p><b>  int b;</b></p><p><b>  s=q; </b></p><p><b>  p1=ready;<

55、/b></p><p><b>  r=p1; </b></p><p><b>  b=1;</b></p><p>  while((p1!=NULL)&&b) </p><p>  if(p1->prio>=s->prio)</p>&l

56、t;p><b>  {</b></p><p><b>  r=p1;</b></p><p>  p1=p1->next;</p><p><b>  }</b></p><p><b>  else</b></p><p

57、><b>  b=0;</b></p><p>  if(r!=p1) </p><p><b>  {</b></p><p>  r->next=s;</p><p>  s->next=p1;</p><p><b>  }</b>

58、;</p><p><b>  else</b></p><p><b>  {</b></p><p>  s->next=p1;</p><p><b>  ready=s;</b></p><p><b>  }</b>

59、</p><p><b>  }</b></p><p>  insert2(PCB *p2)</p><p><b>  {</b></p><p>  tail->next=p2;</p><p><b>  tail=p2;</b></

60、p><p>  p2->next=NULL;</p><p><b>  }</b></p><p>  insert3(PCB *q)</p><p><b>  {</b></p><p>  PCB *p1,*s,*r;</p><p><

61、;b>  int b;</b></p><p><b>  s=q; </b></p><p><b>  p1=ready;</b></p><p><b>  r=p1; </b></p><p><b>  b=1;</b><

62、;/p><p>  while((p1!=NULL)&&b) </p><p>  if(p1->needtime<=s->needtime)</p><p><b>  {</b></p><p><b>  r=p1;</b></p><p&g

63、t;  p1=p1->next;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  b=0;</b></p><p>  if(r!=p1) </p><p><b>  {

64、</b></p><p>  r->next=s;</p><p>  s->next=p1;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></

65、p><p>  s->next=p1;</p><p><b>  ready=s;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void create1(char alg)</p&

66、gt;<p><b>  {</b></p><p><b>  PCB *p;</b></p><p>  int i,time,sjt,priost;</p><p>  char na[10];</p><p>  ready=NULL;</p><p>

67、  finish=NULL;</p><p><b>  run=NULL;</b></p><p>  printf("Enter name and time of process\n");</p><p>  printf("----\n");</p><p>  for(i=

68、1;i<=N;i++)</p><p><b>  {</b></p><p>  p=malloc(sizeof(PCB));</p><p>  printf("Enter name%d",i);</p><p>  printf(":");</p><

69、;p>  scanf("%s",na);</p><p>  printf("Random time%d",i);</p><p>  printf(":");</p><p>  sjt=timesj();</p><p>  printf("%d\n",

70、 sjt);</p><p>  printf("Random priority%d",i);</p><p>  printf(":");</p><p>  printf("%d\n", 20-sjt);</p><p>  strcpy(p->name,na);</

71、p><p>  p->cputime=0;</p><p>  p->needtime=sjt;</p><p>  p->state='w';</p><p>  p->prio=20-sjt;</p><p>  if(ready!=NULL)</p><p&

72、gt;  insert1(p);</p><p><b>  else</b></p><p><b>  {</b></p><p>  p->next=ready;</p><p><b>  ready=p;</b></p><p><

73、b>  }</b></p><p><b>  }</b></p><p>  printf(" Display Process Of Priority:\n");</p><p>  printf("-----\n");</p><p><

74、;b>  prt(alg);</b></p><p>  run=ready; </p><p>  ready=ready->next;</p><p>  run->state='R';</p><p><b>  }</b></p><p>  

75、void create2(char alg)</p><p><b>  {</b></p><p><b>  PCB *p;</b></p><p>  int i,time,sjt;</p><p>  char na[10];</p><p>  ready=NULL

76、;</p><p>  finish=NULL;</p><p><b>  run=NULL;</b></p><p>  printf("Enter name and time of round process\n");</p><p>  printf("-----\n");

77、</p><p>  for(i=1;i<=N;i++)</p><p><b>  {</b></p><p>  p=malloc(sizeof(PCB));</p><p>  printf("Enter name%d",i);</p><p>  printf(&

78、quot;:");</p><p>  scanf("%s",na);</p><p>  printf("Random time%d",i);</p><p>  printf(":");</p><p>  sjt=timesj();</p><p&

79、gt;  printf("%d\n", sjt);</p><p>  printf("Random priority%d",i);</p><p>  printf(":");</p><p>  printf("%d\n", 20-sjt);</p><p>

80、  strcpy(p->name,na);</p><p>  p->cputime=0;</p><p>  p->needtime=sjt;</p><p>  p->round=1;</p><p>  p->state='w';</p><p>  p->co

81、unt=0;</p><p>  p->prio=20-sjt;</p><p>  if(ready!=NULL)</p><p>  insert2(p);</p><p><b>  else</b></p><p><b>  {</b></p>

82、<p>  p->next=ready;</p><p><b>  ready=p;</b></p><p><b>  tail=p;</b></p><p><b>  }</b></p><p><b>  }</b></p&

83、gt;<p>  printf(" Display Process Of Roundrobin\n");</p><p>  printf("-----\n");</p><p><b>  prt(alg);</b></p><p>  run=ready;<

84、;/p><p>  ready=ready->next;</p><p>  run->state='R';</p><p><b>  }</b></p><p>  void create3(char alg)</p><p><b>  {</b>

85、;</p><p><b>  PCB *p;</b></p><p>  int i,time,sjt;</p><p>  char na[10];</p><p>  ready=NULL;</p><p>  finish=NULL;</p><p><b&g

86、t;  run=NULL;</b></p><p>  printf("Enter name and time of process\n");</p><p>  printf("----\n");</p><p>  for(i=1;i<=N;i++)</p><p><b&g

87、t;  {</b></p><p>  p=malloc(sizeof(PCB));</p><p>  printf("Enter name%d",i);</p><p>  printf(":");</p><p>  scanf("%s",na);</p>

88、;<p>  printf("Random time%d",i);</p><p>  printf(":");</p><p>  sjt=timesj();</p><p>  printf("%d\n", sjt);</p><p>  printf("

89、Random priority%d",i);</p><p>  printf(":");</p><p>  printf("%d\n", 20-sjt);</p><p>  strcpy(p->name,na);</p><p>  p->cputime=0;</p&g

90、t;<p>  p->needtime=sjt;</p><p>  p->state='w';</p><p>  p->prio=20-sjt;</p><p>  if(ready!=NULL)</p><p>  insert1(p);</p><p><b

91、>  else</b></p><p><b>  {</b></p><p>  p->next=ready;</p><p><b>  ready=p;</b></p><p><b>  }</b></p><p><

92、;b>  }</b></p><p>  printf(" Display Process Of Priority:\n");</p><p>  printf("-----\n");</p><p>  prt(alg); </p><p>  run=ready

93、; </p><p>  ready=ready->next;</p><p>  run->state='R';</p><p><b>  }</b></p><p>  priority(char alg)</p><p><b>  {</b&g

94、t;</p><p>  while(run!=NULL)</p><p><b>  {</b></p><p>  run->cputime=run->cputime+1;</p><p>  run->needtime=run->needtime-1;</p><p>

95、;  run->prio=run->prio-1; </p><p>  if(run->needtime==0) </p><p><b>  {</b></p><p>  run->next=finish;</p><p>  finish=run;</p><p>

96、;  run->state='C'; </p><p>  run=NULL; </p><p>  if(ready!=NULL)</p><p>  firstin(); </p><p><b>  }</b></p><p><b>  else <

97、/b></p><p>  if((ready!=NULL)&&(run->prio<ready->prio))</p><p><b>  {</b></p><p>  run->state='W';</p><p>  insert1(run);<

98、/p><p>  firstin();</p><p><b>  }</b></p><p><b>  prt(alg);</b></p><p><b>  }</b></p><p><b>  }</b></p>

99、<p>  roundrun(char alg)</p><p><b>  {</b></p><p>  while(run!=NULL)</p><p><b>  {</b></p><p>  run->cputime=run->cputime+1;</p&g

100、t;<p>  run->needtime=run->needtime-1;</p><p>  run->count=run->count+1;</p><p>  run->prio=run->prio-1;</p><p>  if(run->needtime==0)</p><p&g

101、t;<b>  {</b></p><p>  run->next=finish;</p><p>  finish=run;</p><p>  run->state='C';</p><p><b>  run=NULL;</b></p><p&g

102、t;  if(ready!=NULL)</p><p>  firstin();</p><p><b>  }</b></p><p><b>  else</b></p><p>  if(run->count==run->round) </p><p>&

103、lt;b>  {</b></p><p>  run->count=0;</p><p>  if(ready!=NULL) </p><p><b>  {</b></p><p>  run->state='W'; </p><p>  inser

104、t2(run);</p><p>  firstin(); </p><p><b>  }</b></p><p><b>  }</b></p><p>  prt(alg); </p><p><b>  }</b></p><

105、p><b>  }</b></p><p>  shorttask(char alg)</p><p><b>  {</b></p><p>  while(run!=NULL)</p><p><b>  {</b></p><p>  run

106、->cputime=run->cputime+1;</p><p>  run->needtime=run->needtime-1;</p><p>  run->prio=run->prio-1;</p><p>  if(run->needtime==0) </p><p><b> 

107、 {</b></p><p>  run->next=finish;</p><p>  finish=run;</p><p>  run->state='C'; </p><p>  run=NULL; </p><p>  if(ready!=NULL) </p&g

108、t;<p>  firstin(); </p><p><b>  }</b></p><p><b>  else </b></p><p>  if((ready!=NULL)&&(run->needtime>ready->needtime))</p>&l

109、t;p><b>  {</b></p><p>  run->state='W';</p><p>  insert1(run);</p><p>  firstin();</p><p><b>  }</b></p><p><b>

110、  prt(alg);</b></p><p><b>  }</b></p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  menu()</b></p><

111、p>  { char algo;</p><p>  printf("\n\n COMPUTER OS WORK\n\n");</p><p>  printf("\n\n By wanghao(Class 2) \n\n\n");</p><p>  pr

112、intf(" choose one of following:\n");</p><p>  printf("\n 1.PRIORITY.\n\n");</p><p>  printf(" 2.ROUNDROBIN.\n\n");</p><p&g

113、t;  printf(" 3.SHORTTASK.\n\n");</p><p>  printf(" 4.EXIT.\n\n\n");</p><p>  printf("\n please enter your choice:");</p><p

114、>  scanf("%c",&algo);</p><p>  if(algo=='1')</p><p><b>  { </b></p><p>  printf("Enter process number\n");</p><p>  sca

115、nf("%d",&N);</p><p>  create1(algo);</p><p>  priority(algo);</p><p><b>  }</b></p><p><b>  else</b></p><p>  if(algo

116、=='2')</p><p><b>  { </b></p><p>  printf("Enter process number\n");</p><p>  scanf("%d",&N);</p><p>  create2(algo);</p

117、><p>  roundrun(algo);</p><p><b>  }</b></p><p><b>  else</b></p><p>  if(algo=='3')</p><p><b>  { </b></p>

118、<p>  printf("Enter process number\n");</p><p>  scanf("%d",&N);</p><p>  create3(algo);</p><p>  shorttask(algo);</p><p><b>  retur

119、n;</b></p><p><b>  }</b></p><p>  else if(algo=='4')</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>&l

120、t;b>  main()</b></p><p><b>  {</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  menu();</b></p>

121、<p><b>  }</b></p><p><b>  }</b></p><p>  六.心得體會(huì)及總結(jié):</p><p>  處理機(jī)調(diào)度問(wèn)題實(shí)際上是處理機(jī)分配問(wèn)題。只有那些參與競(jìng)爭(zhēng)處理機(jī)所必須的資源都已得到滿(mǎn)足的進(jìn)程才能享受競(jìng)爭(zhēng)處理機(jī)的資格,這時(shí)它們處于內(nèi)存就緒狀態(tài)。這些必須的資源包括內(nèi)存、外設(shè)及有關(guān)

122、數(shù)據(jù)結(jié)構(gòu)等。作業(yè)調(diào)度程序必須先調(diào)用存儲(chǔ)管理、外設(shè)管理,分配資源,讓它們能有競(jìng)爭(zhēng)資格。</p><p>  為了提高資源利用率,一部分在內(nèi)存中處于就緒、等待狀態(tài)而短期內(nèi)不能執(zhí)行進(jìn)程、作業(yè)換出內(nèi)存,所以外存中除了處于后備狀態(tài)的作業(yè),還有處于就緒狀態(tài)的作業(yè)。這就需要一定的方法和策略來(lái)為這部分作業(yè)分配空間。</p><p>  學(xué)習(xí)完《操作系統(tǒng)原理》課程后,進(jìn)行的這次全面的綜合訓(xùn)練,通過(guò)課程設(shè)計(jì),

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論