操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度模擬_第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度模擬_第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度模擬_第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度模擬_第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度模擬_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 操作系統(tǒng)課程設(shè)計(jì) 進(jìn)程調(diào)度模擬班級(jí): 計(jì)算機(jī)科學(xué)與技術(shù)三班學(xué)號(hào): 200805030312 1、 實(shí)驗(yàn)要求 編寫(xiě)一個(gè)進(jìn)程調(diào)度程序,允許多個(gè)進(jìn)程共行的進(jìn)程調(diào)度程序。 采用最高優(yōu)先級(jí)數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來(lái)先服務(wù)算法。 每個(gè)進(jìn)程用一個(gè)進(jìn)程控制塊( pcb)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用cpu時(shí)間、進(jìn)程狀態(tài)等等。 進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為輸入進(jìn)程的時(shí)間。 進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。 每個(gè)進(jìn)程的狀態(tài)可以是就緒 w(wait)、運(yùn)行r(run)、或

2、完成f(finish)三種狀態(tài)之一。 就緒進(jìn)程獲得 cpu后都只能運(yùn)行一個(gè)時(shí)間片。用已占用cpu時(shí)間加1來(lái)表示。 如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 cpu時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用cpu時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待cpu。 每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 pcb,以便進(jìn)行檢查。 重復(fù)以上過(guò)程,直到所有進(jìn)程都完成為止。2、 設(shè)計(jì)思路 本程序用兩種算法(最高優(yōu)先級(jí)數(shù)優(yōu)先的調(diào)度算法和先來(lái)先服務(wù)算法)對(duì)多個(gè)進(jìn)程進(jìn)行調(diào)度,每個(gè)進(jìn)程有三

3、個(gè)狀態(tài),初始狀態(tài)為就緒狀態(tài)。 最高優(yōu)先級(jí)數(shù)優(yōu)先的調(diào)度算法中,程序的某進(jìn)程運(yùn)行時(shí)間以時(shí)間片為單位計(jì)算。各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時(shí)間數(shù)以及進(jìn)程需運(yùn)行的時(shí)間片數(shù)的初始值均由用戶給定。在優(yōu)先級(jí)數(shù)優(yōu)先的調(diào)度算法中,優(yōu)先級(jí)數(shù)的值設(shè)計(jì)為100與運(yùn)行時(shí)間的差值,即pro_time-process-needtime。進(jìn)程每執(zhí)行一次,優(yōu)先數(shù)減3,cpu時(shí)間片數(shù)加1,進(jìn)程還需要的時(shí)間片數(shù)減1。對(duì)于遇到優(yōu)先數(shù)一致的情況,采用先來(lái)先服務(wù)策略解決。 三、詳細(xì)設(shè)計(jì) 設(shè)計(jì)創(chuàng)建進(jìn)程的結(jié)構(gòu)類型定義和結(jié)構(gòu)變量說(shuō)明struct processpcb,定義pcb相關(guān)變量: processpcb()next=null;char pro_na

4、me20; /進(jìn)程的名字int time_submit ; /提交時(shí)間,從時(shí)間的1開(kāi)始計(jì)時(shí)int time_exe ; /進(jìn)程所需的運(yùn)行時(shí)間 int pro_id ; /進(jìn)程id(系統(tǒng)生成)int pro_priority ; /進(jìn)程優(yōu)先級(jí)int time_start ; /開(kāi)始執(zhí)行的時(shí)間int time_end ; /結(jié)束的時(shí)間 int time_wait ; /等待的時(shí)間int pro_state ; /進(jìn)程的狀態(tài) (就緒,執(zhí)行,完成)int time_left ; /還需多少時(shí)間單位,初始化為所需的執(zhí)行時(shí)間int time_turn ; /周轉(zhuǎn)時(shí)間double time_aver ; /

5、帶權(quán)周轉(zhuǎn)時(shí)間 創(chuàng)建pcb類class cpumodel,定義程序中使用的各函數(shù): cpumodel()pcbnum=0; void cpurun(); /cpu模擬運(yùn)行函數(shù)bool getpcb(); /進(jìn)程輸入函數(shù)void showpcb(); /將輸入的進(jìn)程展示出來(lái)void primodel(); /可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度模式void fcfsmodel(); /先到先服務(wù)調(diào)度模式processpcb pcblist100;/按提交時(shí)間排的未就緒進(jìn)程隊(duì)列() 主函數(shù)調(diào)用已定義的各函數(shù),完成進(jìn)程模擬。結(jié)構(gòu)框圖:主函數(shù)開(kāi)始,顯示開(kāi)始信息輸入進(jìn)程數(shù),以及各個(gè)進(jìn)程屬性 輸出進(jìn)程列表以及相關(guān)屬性選擇進(jìn)

6、程模擬算法 優(yōu)先級(jí)數(shù)調(diào)度 先來(lái)先服務(wù) 退出程序調(diào)用函數(shù),輸出運(yùn)行過(guò)程調(diào)用函數(shù),輸出運(yùn)行過(guò)程退出程序輸出顯示運(yùn)行結(jié)果,輸出重新運(yùn)行選擇信息流程圖: 1.可強(qiáng)占優(yōu)先調(diào)度算法實(shí)現(xiàn)過(guò)程流程圖: fcfs算法實(shí)現(xiàn)過(guò)程流程圖:4、 測(cè)試結(jié)果及分析 1.開(kāi)始運(yùn)行,顯示: 2.輸入進(jìn)程數(shù),各進(jìn)程屬性: 關(guān)于提交時(shí)間執(zhí)行時(shí)間等,將檢測(cè)輸入是否數(shù)字,不是數(shù)字即退出程序。 3.顯示各進(jìn)程屬性,以及關(guān)于調(diào)度算法的選擇項(xiàng):此處的優(yōu)先級(jí)數(shù),是用100減去執(zhí)行時(shí)間。對(duì)于優(yōu)先級(jí)數(shù)相同,則默認(rèn)fifo。4.測(cè)試可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度:一次調(diào)度完成,將計(jì)算此次運(yùn)行中cpu的利用率。5. 可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度算法結(jié)束,回到算法選擇界

7、面: 6. 先到先服務(wù)調(diào)度算法運(yùn)行情況: 7. 選擇3,回車,退出程序。6、 設(shè)計(jì)心得 類與結(jié)構(gòu)體的設(shè)計(jì)創(chuàng)建遇到盲點(diǎn),一部分知識(shí)很少用到,忘記了,經(jīng)過(guò)查閱,復(fù)習(xí)了遺忘的知識(shí)點(diǎn)。 循環(huán)的嵌套,通過(guò)查閱,編程,重新熟悉溫習(xí)了關(guān)于各種循環(huán)的嵌套實(shí)現(xiàn)。能較好的運(yùn)用嵌套。 通過(guò)使用幾種算法模擬進(jìn)程的調(diào)度,更好理解了計(jì)算機(jī)中各進(jìn)程間的協(xié)調(diào)正常運(yùn)行,也一定程度上鞏固了操作系統(tǒng)知識(shí),融匯了一些以前不甚理解的操作系統(tǒng)知識(shí)。附錄: 程序源代碼以及注釋 /進(jìn)程pcb類和模擬cpu的進(jìn)程類的聲明#include #include #include #include #include using namespace s

8、td ; /進(jìn)程的狀態(tài)#define unready 0 /未就緒#define ready 1 /就緒#define execute 2 /執(zhí)行#define end 3 /完成 /進(jìn)程的pcb結(jié)構(gòu)類型定義和結(jié)構(gòu)變量說(shuō)明struct processpcb processpcb()next=null; char pro_name20; /進(jìn)程的名字 int time_submit ; /提交時(shí)間,從時(shí)間的1開(kāi)始計(jì)時(shí) int time_exe ; /進(jìn)程所需的運(yùn)行時(shí)間 int pro_id ; /進(jìn)程id(系統(tǒng)生成) int pro_priority ; /進(jìn)程優(yōu)先級(jí) int time_star

9、t ; /開(kāi)始執(zhí)行的時(shí)間 int time_end ; /結(jié)束的時(shí)間 int time_wait ; /等待的時(shí)間 int pro_state ; /進(jìn)程的狀態(tài) (就緒,執(zhí)行,完成) int time_left ; /還需多少時(shí)間單位,初始化為所需的執(zhí)行時(shí)間 int time_turn ; /周轉(zhuǎn)時(shí)間 double time_aver ; /帶權(quán)周轉(zhuǎn)時(shí)間 processpcb *next; /封裝cpu調(diào)度與分配程序模塊。進(jìn)程類class cpumodelpublic: cpumodel()pcbnum=0; void cpurun(); /cpu模擬運(yùn)行函數(shù) bool getpcb(); /

10、進(jìn)程輸入函數(shù) void showpcb(); /將輸入的進(jìn)程展示出來(lái) void primodel(); /可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度模式 void fcfsmodel(); /先到先服務(wù)調(diào)度模式private: processpcb pcblist100; /按提交時(shí)間排的未就緒進(jìn)程隊(duì)列 int pcbnum ; /進(jìn)程數(shù)量 int freetime ; /cpu空閑時(shí)間 int allturn ; /總周轉(zhuǎn)時(shí)間 float allaver ; /總帶權(quán)周轉(zhuǎn)時(shí)間;#include /cpu模擬運(yùn)行函數(shù)void cpumodel:cpurun() if(!getpcb() /進(jìn)程輸入函數(shù) return

11、 ; showpcb(); /展示所需執(zhí)行進(jìn)程信息 int choose = 0 ; while(1) cout*請(qǐng)選擇需要模擬的cpu調(diào)度算法!*endl ; cout* 1: 可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度 *endl ; cout* 2: 先到先調(diào)度 *endl; cout* 3: 退出系統(tǒng) *endl ; coutchoose ; coutendl ; switch(choose) case 1: primodel(); /可強(qiáng)占的優(yōu)先進(jìn)程方式 break; case 2: fcfsmodel(); /先到先服務(wù)調(diào)度方式 break; default:return; /結(jié)束程序 coutendl

12、; /按進(jìn)程提交時(shí)間排序的比較函數(shù)bool cmp(processpcb a,processpcb b) if(a.time_submit0&a0=9) num=a0-0; else return -1; for(i=1;i=0&ai=9) num=num*10+ai-0; else return -1; return num; /進(jìn)程輸入函數(shù)bool cpumodel:getpcb() char num10; cout * 進(jìn)程調(diào)度模擬程序 *n; cout * 計(jì)算機(jī)科學(xué)與技術(shù)三班 *n; cout * 孫清茂 *n; coutnum; /輸入進(jìn)程個(gè)數(shù) pcbnum=isnumber(nu

13、m); if(pcbnum=0) cout*輸入有錯(cuò)*n;return 0; int i; for(i=0;ipcbnum;i+)/輸入進(jìn)程信息 cout*請(qǐng)依次輸入第i+1個(gè)進(jìn)程的信息*endl ; coutpcbl_name ; coutnum; pcblisti.time_submit=isnumber(num); if(pcblisti.time_submit=0)cout*輸入有錯(cuò)*n; return 0; coutnum; pcblisti.time_exe=isnumber(num); if(pcblisti.time_exe=0) cout*輸入有錯(cuò)*n; re

14、turn 0; pcblisti.time_left=pcblisti.time_exe; /設(shè)置剩余執(zhí)行時(shí)間 pcbl_state=unready; /設(shè)置狀態(tài)為未就緒 pcbl_priority=100-pcblisti.time_exe; /設(shè)置優(yōu)先級(jí), 優(yōu)先級(jí)=100-執(zhí)行時(shí)間 coutendl ; sort(pcblist,pcblist+pcbnum,cmp); /按提交時(shí)間排序 for(i=0;ipcbnum;i+) pcbl_id=i+1; /設(shè)置id,根據(jù)提交時(shí)間 return 1; /展示所需執(zhí)行進(jìn)程信息void cpumod

15、el:showpcb() int i; coutn*所需執(zhí)行的進(jìn)程信息如下*n; for(i=0;ipcbnum;i+) cout 進(jìn)程編號(hào): pcbl_id 進(jìn)程名字: pcbl_name 提交時(shí)間: pcblisti.time_submit 執(zhí)行時(shí)間: pcblisti.time_exe 優(yōu)先級(jí)數(shù): pcbl_priorityendl ; coutendl; /可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度模式void cpumodel:primodel() coutnext=null; /head 指針不用,head-next開(kāi)始為就緒隊(duì)列 /模擬cpu開(kāi)始工作 w

16、hile(head-next!=null|pnumpcbnum) sleep(1000); time+; /時(shí)間片為1 cout*time: 第time秒endl; /打印 / 進(jìn)程就緒(查看未就緒的進(jìn)程中在該時(shí)間片是否可以進(jìn)入就緒隊(duì)列) while(pnumpcbnum & pcblistpnum.time_submitnext=head-next; /插在head之后 head-next=pcb; /查找在time時(shí)間片應(yīng)該運(yùn)行的進(jìn)程 if(head-next=null) cout 沒(méi)有可運(yùn)行的進(jìn)程next; pcb1=head-next; /查找當(dāng)前優(yōu)先級(jí)最高的就緒進(jìn)程 while(pc

17、b1-next!=null) if(pcb-pro_prioritynext-pro_priority) pcb2=pcb1; pcb=pcb1-next; pcb1=pcb1-next; /運(yùn)行優(yōu)先級(jí)最高的進(jìn)程 if(pcb-time_left=pcb-time_exe) /該進(jìn)程是否已開(kāi)始 pcb-time_start=time; /設(shè)置開(kāi)始時(shí)間 pcb-pro_state=execute; /設(shè)置狀態(tài)為執(zhí)行 pcb-pro_priority=pcb-pro_priority-3; /優(yōu)先級(jí)數(shù)減3 pcb-time_left-; /剩余執(zhí)行時(shí)間減去時(shí)間片1 /打印該進(jìn)程信息 cout 進(jìn)程

18、編號(hào): pro_id 進(jìn)程名字: pro_name 提交時(shí)間: time_submit 執(zhí)行時(shí)間: time_exe n開(kāi)始時(shí)間: time_start 還剩時(shí)間: time_left 優(yōu)先級(jí)數(shù): pro_prioritytime_left=0) pcb2-next=pcb2-next-next;/將其在就緒隊(duì)列中出列 pcb-time_end=time; /設(shè)置結(jié)束時(shí)間 pcb-time_turn=pcb-time_end-pcb-time_submit+1; /計(jì)算周轉(zhuǎn)時(shí)間 pcb-time_aver=pcb-time_turn/(double)pcb- time_exe; /計(jì)算帶權(quán)周轉(zhuǎn)

19、時(shí)間 pcb-pro_state=end; coutn進(jìn)程pro_id運(yùn)行結(jié)束:n進(jìn)程名字: pro_name 提交時(shí)間: time_submit 執(zhí)行時(shí)間: time_exe 開(kāi)始時(shí)間: time_start 結(jié)束時(shí)間: time_endn周轉(zhuǎn)時(shí)間: time_turn 帶權(quán)周轉(zhuǎn)時(shí)間: time_averendl ; /模擬cpu工作結(jié)束 coutn 所有進(jìn)程運(yùn)行完畢!endl; double c=(time-freetime)/(double)time*100; coutn cpu利用率:c%endl; /可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度模式結(jié)束 /先到先服務(wù)調(diào)度模式void cpumodel:fcf

20、smodel() cout*先到先服務(wù)進(jìn)程調(diào)度過(guò)程如下*n; freetime=0; /初始化系統(tǒng)空閑時(shí)間為0 int time=0; /時(shí)間 int pnum=0; /已就緒進(jìn)程數(shù)目 processpcb que100; /就緒隊(duì)列 int quef=0,quee=0; /就緒隊(duì)列的頭指針和尾指針/模擬cpu開(kāi)始工作 while(quefquee|pnumpcbnum) sleep(1000); time+; /時(shí)間片為1 cout*time: 第time秒endl; /打印 /進(jìn)程就緒(查看未就緒的進(jìn)程中在該時(shí)間片是否可以進(jìn)入就緒隊(duì)列) while(pnumpcbnum & pcblistpnum.time_submit=time) quequee+=pcblistpnum+; /查找time時(shí)間片的運(yùn)行進(jìn)程 if(quef=quee) cout 沒(méi)有可運(yùn)行的進(jìn)程endl; freetime+; else /運(yùn)行進(jìn)程 if(quequef.time_left=quequef.time_exe) /該進(jìn)程是否已開(kāi)始 quequef.time_start=time; /設(shè)置開(kāi)始時(shí)間 _state=execute; /設(shè)置狀態(tài)為執(zhí)行 quequef.time_left-; /剩余執(zhí)行時(shí)間減去時(shí)間片1 /打印進(jìn)程信息 cout進(jìn)程編號(hào): quequ

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論