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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

12、; /按進程提交時間排序的比較函數(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; /進程輸入函數(shù)bool cpumodel:getpcb() char num10; cout * 進程調(diào)度模擬程序 *n; cout * 計算機科學與技術(shù)三班 *n; cout * 孫清茂 *n; coutnum; /輸入進程個數(shù) pcbnum=isnumber(nu

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

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

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

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

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

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

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

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

溫馨提示

  • 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

提交評論