




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 探究實(shí)踐:“EC”混合式教學(xué)
- 內(nèi)蒙古辦酒類管理辦法
- 機(jī)器人運(yùn)動(dòng)學(xué)建模與控制研究
- 冬季取暖安全管理辦法
- 基于“崗課賽證”視角的高職模塊化教學(xué)改革研究與實(shí)踐
- 動(dòng)物基因表達(dá)研究
- 創(chuàng)新驅(qū)動(dòng):產(chǎn)品設(shè)計(jì)全流程管控體系構(gòu)建與實(shí)踐
- 交通事故和解協(xié)議書(shū)正式版-1
- 及時(shí)如實(shí)報(bào)告生產(chǎn)安全事故是誰(shuí)的責(zé)任
- 通信網(wǎng)絡(luò)建設(shè)安全管理體系與實(shí)施細(xì)節(jié)
- 數(shù)與代數(shù)課件
- 工會(huì)審計(jì)實(shí)務(wù)課件
- 預(yù)防艾滋病、梅毒和乙肝母嬰傳播相關(guān)報(bào)表、上報(bào)流程和要求
- 《鐵路技術(shù)管理規(guī)程》(普速鐵路部分)-14年新版
- 食用油儲(chǔ)存期品質(zhì)變化的太赫茲光譜無(wú)損識(shí)別
- 胎盤(pán)早剝預(yù)案演練腳本
- 五山文學(xué)全集第一卷
- 聚磷腈功能高分子材料的合成及應(yīng)用
- 中國(guó)鐵路總公司《鐵路技術(shù)管理規(guī)程》(高速鐵路部分)2014年7月
- 鈣加維生素Dppt課件(PPT 14頁(yè))
- TRD深基坑止水帷幕施工方案(22頁(yè))
評(píng)論
0/150
提交評(píng)論