操作系統(tǒng)進(jìn)程調(diào)度模擬算法附源碼_第1頁
操作系統(tǒng)進(jìn)程調(diào)度模擬算法附源碼_第2頁
操作系統(tǒng)進(jìn)程調(diào)度模擬算法附源碼_第3頁
操作系統(tǒng)進(jìn)程調(diào)度模擬算法附源碼_第4頁
操作系統(tǒng)進(jìn)程調(diào)度模擬算法附源碼_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、進(jìn)程調(diào)度模擬算法課程名稱:計(jì)算機(jī)操作系統(tǒng)班級(jí):信1501-2實(shí)驗(yàn)者姓名:李琛實(shí)驗(yàn)日期:2018年 5 月 1 日評(píng)分:教師簽名:一、實(shí)驗(yàn)?zāi)康倪M(jìn)程調(diào)度是處理機(jī)管理的核心內(nèi)容。本實(shí)驗(yàn)要求用高級(jí)語言編寫模擬進(jìn)程調(diào)度程序,以 便加深理解有關(guān)進(jìn)程控制快、 進(jìn)程隊(duì)列等概念, 并體會(huì)和了解優(yōu)先數(shù)算法和時(shí)間片輪轉(zhuǎn)算法 的具體實(shí)施辦法。二、實(shí)驗(yàn)要求設(shè)計(jì)進(jìn)程控制塊PCB 的結(jié)構(gòu),通常應(yīng)包括如下信息:進(jìn)程名、進(jìn)程優(yōu)先數(shù)(或輪轉(zhuǎn)時(shí)間片數(shù)) 、進(jìn)程已占用的 CPU 時(shí)間、進(jìn)程到完成還需要的時(shí)間、進(jìn)程的狀態(tài)、當(dāng)前隊(duì)列指針等。編寫兩種調(diào)度算法程序:優(yōu)先數(shù)調(diào)度算法程序循環(huán)輪轉(zhuǎn)調(diào)度算法程序按要求輸出結(jié)果。三、實(shí)驗(yàn)過程分別用兩種

2、調(diào)度算法對(duì)伍個(gè)進(jìn)程進(jìn)行調(diào)度。 每個(gè)進(jìn)程可有三種狀態(tài); 執(zhí)行狀態(tài)( RUN) 、就緒狀態(tài)(READY&括等待狀態(tài))和完成狀態(tài)(FINISH),并假定初始狀態(tài)為就緒狀態(tài)。(一)進(jìn)程控制塊結(jié)構(gòu)如下:NAME-一進(jìn)程標(biāo)示符PRIO/ROUN進(jìn)程優(yōu)先數(shù)/進(jìn)程每次輪轉(zhuǎn)的時(shí)間片數(shù)(設(shè)為常數(shù) 2)CPUTIME-進(jìn)程累計(jì)占用CPU的時(shí)間片數(shù)NEEDTIME一進(jìn)程到完成還需要的時(shí)間片數(shù)STATE-進(jìn)程狀態(tài)NEXT-一鏈指針注:為了便于處理,程序中進(jìn)程的的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算;各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時(shí)間片數(shù),以及進(jìn)程運(yùn)行時(shí)間片數(shù)的初值,均由用戶在程序運(yùn)行時(shí)給定。(二)進(jìn)程的就緒態(tài)和等待態(tài)均為鏈表結(jié)構(gòu),共有

3、四個(gè)指針如下:RUN-當(dāng)前運(yùn)行進(jìn)程指針READY就需隊(duì)列頭指針就需隊(duì)列尾指針TAILFINISH完成隊(duì)列頭指針(三)程序說明在優(yōu)先數(shù)算法中,進(jìn)程優(yōu)先數(shù)的初值設(shè)為:50-NEEDTIME每執(zhí)行一次,優(yōu)先數(shù)減1 , CPU 時(shí)間片數(shù)加1 ,進(jìn)程還需要的時(shí)間片數(shù)減1 。在輪轉(zhuǎn)法中,采用固定時(shí)間片單位(兩個(gè)時(shí)間片為一個(gè)單位),進(jìn)程每輪轉(zhuǎn)一次,CPUS寸問片數(shù)加2,進(jìn)程還需要的時(shí)間片數(shù)減2,并退出CPU,排到就緒隊(duì)列尾,等待下一次 調(diào)度。程序的模塊結(jié)構(gòu)如下:整個(gè)程序可由主程序和如下7 個(gè)過程組成:2INSERT1在優(yōu)先數(shù)算法中,將尚未完成的PCB按優(yōu)先數(shù)順序插入到就緒隊(duì)列中;INSERT2-在輪轉(zhuǎn)法中,

4、將執(zhí)行了一個(gè)時(shí)間片單位(為 2),但尚未完成的 進(jìn)程的PCB,插到就緒隊(duì)列的隊(duì)尾;FIRSTIN調(diào)度就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)行;PRINT-顯示每執(zhí)行一次后所有進(jìn)程的狀態(tài)及有關(guān)信息。CREAT創(chuàng)建新進(jìn)程,并將它的 PCB插入就緒隊(duì)列;PRISCH按優(yōu)先數(shù)算法調(diào)度進(jìn)程;ROUNDS CH按時(shí)間片輪轉(zhuǎn)法調(diào)度進(jìn)程主程序定義PCB 結(jié)構(gòu)和其他有關(guān)變量。實(shí)驗(yàn)代碼:Main.cpp#include#includeusing namespace std;typedef struct node進(jìn)程名進(jìn)程優(yōu)先級(jí)分配CPU勺時(shí)間片執(zhí)行時(shí)間 TOC o 1-5 h z char name20;/int prio;

5、/int round;/int cputime;/CPUint needtime;/進(jìn)程執(zhí)行所需時(shí)間char state;/進(jìn)程狀態(tài)int count;/記錄執(zhí)行次數(shù)struct node *next; / 鏈表指針PCB;int num;/ 定義三個(gè)隊(duì)列,就緒隊(duì)列,執(zhí)行隊(duì)列,完成隊(duì)列PCB *ready = NULL; / 就緒隊(duì)列PCB *run = NULL;/執(zhí)行隊(duì)列PCB *finish = NULL;/完成隊(duì)列/ 取得第一個(gè)就緒節(jié)點(diǎn)void GetFirst()run = ready;if (ready != NULL)run-state = R;ready = ready-nex

6、t;run-next = NULL;)/優(yōu)先級(jí)輸出隊(duì)列void Output1()(PCB *p;p = ready;while (p != NULL)(cout name t prio t cputime t needtime t state t count next;)p = finish;while (p != NULL)cout name t prio t cputime t needtime t state t count next;)p = run;while (p != NULL)(cout name t prio t cputime t needtime t state t c

7、ount next;)/輪轉(zhuǎn)法輸出隊(duì)列void Output2()(PCB *p;p = ready;while (p != NULL)cout name t round t cputime t needtime t state t count next;p = finish;while (p != NULL)(cout name t round t cputime t needtime t state t count next;p = run;while (p != NULL)cout name t round t cputime t needtime t state t count nex

8、t;)/創(chuàng)建優(yōu)先級(jí)隊(duì)列/創(chuàng)建優(yōu)先級(jí)隊(duì)列,規(guī)定優(yōu)先數(shù)越小,優(yōu)先級(jí)越低void InsertPrio(PCB *in)PCB *fst, *nxt;fst = nxt = ready;if (ready = NULL) / 如果隊(duì)列為空,則為第一個(gè)元素in-next = ready;ready = in;)else /查到合適的位置進(jìn)行插入if (in-prio = fst-prio) / 比第一個(gè)還要大,則插入到隊(duì)頭in-next = ready;ready = in;elsewhile (fst-next != NULL) / 移動(dòng)指針查找第一個(gè)比它小的元素的位置進(jìn)行插入nxt = fst;f

9、st = fst-next;if (fst-next = NULL) / 已經(jīng)搜索到隊(duì)尾,則其優(yōu)先級(jí)數(shù)最小,將其插入到隊(duì)尾即可in-next = fst-next;fst-next = in;else / 插入到隊(duì)列中nxt = in;in-next = fst;/ 將進(jìn)程插入到就緒隊(duì)列尾部void InsertTime(PCB *in)PCB *fst;fst = ready;if (ready = NULL)in-next = ready;ready = in;elsewhile (fst-next != NULL)fst = fst-next;in-next = fst-next;fst

10、-next = in; / 將進(jìn)程插入到完成隊(duì)列尾部void InsertFinish(PCB *in)PCB *fst;fst = finish;if (finish = NULL)in-next = finish;finish = in;elsewhile (fst-next != NULL)fst = fst-next; in-next = fst-next;fst-next = in;/ 優(yōu)先級(jí)調(diào)度輸入函數(shù)void PrioCreate()PCB *tmp;int i;cout Enter the name and needtime : endl;for (i = 0; i num;

11、i+)if (tmp = (PCB *)malloc(sizeof(PCB) = NULL)cerr malloc tmp-name;getchar();cin tmp-needtime;tmp-cputime = 0;tmp-state = W;tmp-prio = 50 - tmp-needtime; / 設(shè)置其優(yōu)先級(jí),需要的時(shí)間越多,優(yōu)先級(jí)越低tmp-round = 0;tmp-count = 0;InsertPrio(tmp); / 按照優(yōu)先級(jí)從高到低,插入到就緒隊(duì)列cout 進(jìn)程名 t 優(yōu)先級(jí) tcpu 時(shí)間 t 需要時(shí)間 進(jìn)程狀態(tài) 計(jì)數(shù)器 endl;/ 時(shí)間片輸入函數(shù)void Ti

12、meCreate()PCB *tmp;int i;cout 輸入進(jìn)程名字和進(jìn)程時(shí)間片所需時(shí)間: endl;for (i = 0; i num; i+)if (tmp = (PCB *)malloc(sizeof(PCB) = NULL)cerr malloc tmp-name;getchar();cin tmp-needtime;tmp-cputime = 0;tmp-state = W;tmp-prio = 0;tmp-round = 2;tmp-count = 0;InsertTime(tmp);cout 進(jìn)程名 t 輪數(shù) tCPU 時(shí)間 t 需要時(shí)間 進(jìn)程狀態(tài) 計(jì)數(shù)器 prio -= 3

13、; / 優(yōu)先級(jí)減去三run-cputime+; /CPU 時(shí)間片加一run-needtime-;/進(jìn)程執(zhí)行完成的剩余時(shí)間減一if (run-needtime = 0)如果進(jìn)程執(zhí)行完畢,將進(jìn)程狀態(tài)置為F,將其插入到完成隊(duì)列run-state = F;run-count+;InsertFinish(run);flag = 0;else /將進(jìn)程狀態(tài)置為 W入就緒隊(duì)列run-state = W;run-count+; / 進(jìn)程執(zhí)行的次數(shù)加一InsertTime(run);flag = 0;flag = 1;GetFirst(); / 繼續(xù)取就緒隊(duì)列隊(duì)頭進(jìn)程進(jìn)入執(zhí)行隊(duì)列void RoundRun()

14、/ 時(shí)間片輪轉(zhuǎn)調(diào)度算法int flag = 1;GetFirst();while (run != NULL)Output2();while (flag)run-count+;run-cputime+;run-needtime-;if (run-needtime = 0) / 進(jìn)程執(zhí)行完畢run-state = F;InsertFinish(run);flag = 0;else if (run-count = run-round)/ 時(shí)間片用完run-state = W;run-count = 0; / 計(jì)數(shù)器清零,為下次做準(zhǔn)備InsertTime(run);flag = 0; flag = 1

15、;GetFirst();int main(void)int n;cout 輸入進(jìn)程個(gè)數(shù): num;getchar();cout 進(jìn)程調(diào)度算法模擬 endl;cout 1 、優(yōu)先級(jí)調(diào)度算法 endl;cout 2 、循環(huán)輪轉(zhuǎn)調(diào)度算法 endl;cout endl;cout 輸入選擇序號(hào): n;switch (n)cout 優(yōu)先級(jí)調(diào)度: endl;PrioCreate();Priority();Output1();break;cout 循環(huán)輪轉(zhuǎn)算法: endl;TimeCreate();RoundRun();Output2();break;case 0:exit(1);break;default:cout Enter error! endl;break;cout endl;return 0;四、實(shí)驗(yàn)結(jié)果優(yōu)先級(jí)調(diào)度時(shí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論