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

下載本文檔

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

文檔簡介

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

2、求輸出結(jié)果。三、實驗過程分別用兩種調(diào)度算法對伍個進(jìn)程進(jìn)行調(diào)度。 每個進(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ù)2)CPUTIM進(jìn)程累計占用 CPU的時間片數(shù)NEEDTIME進(jìn)程到完成還需要的時間片數(shù)STATE進(jìn)程狀態(tài)NEXT鏈指針注:1. 為了便于處理,程序中進(jìn)程的的運行時間以時間片為單位進(jìn)行計算;2. 各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時間片數(shù),以及進(jìn)程運行時間片數(shù)的初值,均由用戶在程 序運行時給定。(二)進(jìn)

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

4、PCB按優(yōu)先數(shù)順序插入到就緒隊列中;(2)INSERT2在輪轉(zhuǎn)法中,將執(zhí)行了一個時間片單位(為 2 ),但尚未完成的 進(jìn)程的PCB,插到就緒隊列的隊尾;(3)FIRSTIN調(diào)度就緒隊列的第一個進(jìn)程投入運行;(4)PRINT顯示每執(zhí)行一次后所有進(jìn)程的狀態(tài)及有關(guān)信息。(5)CREAT創(chuàng)建新進(jìn)程,并將它的 PCB插入就緒隊列;(6)PRISCH按優(yōu)先數(shù)算法調(diào)度進(jìn)程;(7)ROUNDS按時間片輪轉(zhuǎn)法調(diào)度進(jìn)程。主程序定義 PCB 結(jié)構(gòu)和其他有關(guān)變量。實驗代碼:Main.cpp #include<iostream> #include<string>using namespace s

5、td;typedef struct nodechar name20;/進(jìn)程名int prio;/進(jìn)程優(yōu)先級int round;/分配CPU勺時間int cputime;/CPU執(zhí)行時間int needtime;/進(jìn)程執(zhí)行所需時間char state;/進(jìn)程狀態(tài)int count;/ 記錄執(zhí)行次數(shù)struct node *next; / 鏈表指針PCB;int num;/ 定義三個隊列,就緒隊列,執(zhí)行隊列,完成隊列PCB *ready = NULL;/ 就緒隊列PCB *run = NULL;/執(zhí)行隊列PCB *finish = NULL;/完成隊列/ 取得第一個就緒節(jié)點void GetFirs

6、t()run = ready;if (ready != NULL)run->state = 'R'ready = ready->next; run->next = NULL;/ 優(yōu)先級輸出隊列void Output1()PCB *p; p = ready;while (p != NULL)cout << p->name << "t" << p->prio << "t" << p->cputime << "t" &

7、lt;< p->needtime << "t " << p->state << " t " << p->count << endl;p = p->next;p = finish;while (p != NULL)cout << p->name << "t" << p->prio << "t" << p->cputime << "

8、t" << p->needtime << "t " << p->state << " t " << p->count << endl;p = p->next; p = run; while (p != NULL)cout << p->name << "t" << p->prio << "t"<< p->cputime <<

9、 "t"<< p->needtime << "t<< p->state<< " t " << p->count << endl;p = p->next;/ 輪轉(zhuǎn)法輸出隊列void Output2()PCB *p;p = ready;while (p != NULL)<< "tcout << p->name<< "t"<< p->round<< &qu

10、ot;t"<< p->cputime<< "t"<<p->needtime<< "t<< p->state<< p->count << endl;p = p->next;p = finish;while (p != NULL)<< "tcout << p->name<< "t"<< p->round<< "t"<&l

11、t; p->cputime<< "t"<<p->needtime<< "t<< p->state<< p->count << endl;p = p->next;p = run;while (p != NULL)<< "tcout << p->name<< "t"<< p->round<< "t"<< p->cputime<

12、;< "t"<<p->needtime<< "t<< p->state<< p->count << endl;p = p->next;/ 創(chuàng)建優(yōu)先級隊列/ 創(chuàng)建優(yōu)先級隊列,規(guī)定優(yōu)先數(shù)越小,優(yōu)先級越低void InsertPrio(PCB *in)PCB *fst, *nxt;fst = nxt = ready;if (ready = NULL) /如果隊列為空,則為第一個元素in->next = ready; ready = in;else / 查到合適的位置進(jìn)行插入i

13、f (in->prio >= fst->prio) / in->next = ready; ready = in;else比第一個還要大,則插入到隊頭while (fst->next != NULL) / nxt = fst;fst = fst->next;移動指針查找第一個比它小的元素的位置進(jìn)行插入if (fst->next = NULL) /已經(jīng)搜索到隊尾,則其優(yōu)先級數(shù)最小,將其插入到隊尾即可in->next = fst->next; fst->next = in;else / 插入到隊列中nxt = in; in->nex

14、t = fst;/ 將進(jìn)程插入到就緒隊列尾部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->next = in;/ 將進(jìn)程插入到完成隊列尾部void InsertFinish(PCB *in)PCB *fst;fst = finish;if (finish = NULL)in->

15、;next = finish;finish = in;elsewhile (fst->next != NULL)fst = fst->next;in->next = fst->next; fst->next = in;/ 優(yōu)先級調(diào)度輸入函數(shù)void PrioCreate()PCB *tmp;int i;<< endl;cout << "Enter the name and needtimefor (i = 0; i < num; i+)if (tmp = (PCB *)malloc(sizeof(PCB) = NULL)ce

16、rr << "malloc" << endl; exit(1);cin >> tmp->name; getchar();cin >> tmp->needtime; tmp->cputime = 0;tmp->state = 'W'tmp->prio = 50 - tmp->needtime; / 設(shè)置其優(yōu)先級,需要的時間越多,優(yōu)先級越低 tmp->round = 0;tmp->count = 0;InsertPrio(tmp); / 按照優(yōu)先級從高到低,插入到就緒

17、隊列cout << "進(jìn)程名t優(yōu)先級tcpu時間t需要時間 進(jìn)程狀態(tài) 計數(shù)器"<< endl;/ 時間片輸入函數(shù)void TimeCreate()PCB *tmp;int i;cout << " 輸入進(jìn)程名字和進(jìn)程時間片所需時間: " << endl;for (i = 0; i < num; i+)if (tmp = (PCB *)malloc(sizeof(PCB) = NULL)cerr << "malloc" << endl;exit(1);cin &

18、gt;> 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時間t需要時間 進(jìn)程狀態(tài) 計數(shù)器"<< endl;/ 按照優(yōu)先級調(diào)度,每次執(zhí)行一個時間片void Priority()int flag = 1;GetFirst(

19、);while (run != NULL)Output1();while (flag)run->prio -= 3; / 優(yōu)先級減去三run->cputime+; /CPU 時間片加一 run->needtime-;/進(jìn)程執(zhí)行完成的剩余時間減一F,將其插入到完成隊列if (run->needtime = 0)/ 如果進(jìn)程執(zhí)行完畢,將進(jìn)程狀態(tài)置為run->state = 'F'run->count+;InsertFinish(run);flag = 0;else /將進(jìn)程狀態(tài)置為 W入就緒隊列run->state = 'W'

20、;run->count+; / 進(jìn)程執(zhí)行的次數(shù)加一InsertTime(run);flag = 0;flag = 1;GetFirst(); / 繼續(xù)取就緒隊列隊頭進(jìn)程進(jìn)入執(zhí)行隊列void RoundRun() / 時間片輪轉(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'Inser

21、tFinish(run);flag = 0;else if (run->count = run->round)/ 時間片用完run->state = 'W'run->count = 0; /計數(shù)器清零,為下次做準(zhǔn)備InsertTime(run);flag = 0;flag = 1;GetFirst();int main(void)int n;cout << " 輸入進(jìn)程個數(shù): " << endl;cin >> num;getchar();<< endl;cout << &qu

22、ot; 進(jìn)程調(diào)度算法模擬 cout << "1、優(yōu)先級調(diào)度算法 " << endl;cout << "2、循環(huán)輪轉(zhuǎn)調(diào)度算法 " << endl;cout << "" << endl;cout << " 輸入選擇序號: " << endl;cin >> n;switch (n)case 1:cout << " 優(yōu)先級調(diào)度 :" << endl;PrioCreate();Priority();Output1(); break;case 2: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;四、實驗結(jié)果優(yōu)先級調(diào)度工、循環(huán)輪轉(zhuǎn)凋度現(xiàn)比揄入選擇序號:c; W

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論