5種進(jìn)程調(diào)度算法_第1頁
5種進(jìn)程調(diào)度算法_第2頁
5種進(jìn)程調(diào)度算法_第3頁
5種進(jìn)程調(diào)度算法_第4頁
5種進(jìn)程調(diào)度算法_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.進(jìn)程調(diào)度算法的模擬實現(xiàn)實驗?zāi)康?本實驗?zāi)M在單處理機(jī)情況下的處理機(jī)調(diào)度問題,加深對進(jìn)程調(diào)度的理解。2利用程序設(shè)計語言編寫算法,模擬實現(xiàn)先到先服務(wù)算法FCFS、輪轉(zhuǎn)調(diào)度算法RR、最短作業(yè)優(yōu)先算法SJF、優(yōu)先級調(diào)度算法PRIOR、最短剩余時間優(yōu)先算法SRTF。3進(jìn)行算法評價,計算平均等待時間和平均周轉(zhuǎn)時間。實驗內(nèi)容及結(jié)果1先來先服務(wù)算法2輪轉(zhuǎn)調(diào)度算法3. 優(yōu)先級調(diào)度算法4. 最短時間優(yōu)先算法5. 最短剩余時間優(yōu)先算法實驗總結(jié)在此次模擬過程中,將SRTF單獨拿了出來用指針表示,而其余均用數(shù)組表示。完整代碼Srtf.cpp代碼如下:/最短剩余時間優(yōu)先算法的實現(xiàn)#include#include#inc

2、ludetypedefstructint remain_time;/進(jìn)程剩余執(zhí)行時間int arrive_time;/進(jìn)程到達(dá)時間int Tp;/進(jìn)入就緒隊列的時間int Tc;/進(jìn)入執(zhí)行隊列的時間int To;/進(jìn)程執(zhí)行結(jié)束的時間int number;/進(jìn)程編號Process_Block;/定義進(jìn)程模塊typedefstruct _QueueProcess_Block PB;struct _Queue *next;_Block,*Process;/定義一個進(jìn)程模塊隊列中結(jié)點typedefstructProcess head;/隊列頭指針Process end;/隊列尾指針Process_Qu

3、eue;/進(jìn)程隊列Process_QueuePQ;/定義一個全局隊列變量intt;/全局時間ProcessRun_Now;/當(dāng)前正在運行的進(jìn)程,作為全局變量void InitQueuePQ.head -next = NULL;PQ.end-next = PQ.head;/*初始化隊列*/int IsEmptyifnext = PQ.headreturn 1;/隊列空的條件為頭指針指向尾指針并且尾指針指向頭指針elsereturn 0;/*判定隊列是否為空隊列*/void EnQueueProcess temp =mallocsizeof;temp = PQ.end;temp-next-next

4、 = P;PQ.end-next = P;/*插入隊列操作*/Process DeQueueifIsEmptyreturn NULL;Process temp = PQ.head-next;PQ.head-next= temp -next;ifnext = tempPQ.end-next = PQ.head;return temp;/*出列操作*/Process ShortestProcessifIsEmpty/如果隊列為空,返回ifreturn NULL;elsereturn Run_Now;Process temp,shortest,prev;int min_time;if/如果當(dāng)前有進(jìn)程

5、正在執(zhí)行,shortest = Run_Now;/那么最短進(jìn)程初始化為當(dāng)前正在執(zhí)行的進(jìn)程,min_time = Run_Now-PB.remain_time;else/如果當(dāng)前沒有進(jìn)程執(zhí)行,shortest = PQ.head-next;/則最短進(jìn)程初始化為隊列中第一個進(jìn)程min_time = PQ.head-next-PB.remain_time;temp = PQ.head;prev = temp;whilenextifnext-PB.remain_time /如果當(dāng)前進(jìn)程的剩余時間比min_time短,shortest = temp-next;/則保存當(dāng)前進(jìn)程,min_time = sh

6、ortest-PB.remain_time;prev=temp;/及其前驅(qū)temp=temp-next;ifnext/如果最短剩余時間進(jìn)程是隊列中最后一個進(jìn)程,PQ.end-next = prev;/則需要修改尾指針指向其前驅(qū)prev-next = shortest-next;/修改指針將最短剩余時間進(jìn)程插入到隊頭return shortest;/*調(diào)度最短剩余時間的進(jìn)程至隊頭*/void RunRun_Now-PB.remain_time-;/某一時間運行它的剩余時間減return;/*運行函數(shù)*/void Waitreturn ;int sumint i,sum=0;fori=0;isum

7、+=arrayi;return sum;int mainPQ.head= mallocsizeof;PQ.end= mallocsizeof;Run_Now= mallocsizeof;Run_Now=NULL;InitQueue;int i,N,Total_Time=0;/Total_Time為所有進(jìn)程的執(zhí)行時間之和printf;scanf;Process *P,temp;P = mallocN*sizeof;int *wt,*circle_t;wt=mallocN*sizeof;circle_t=mallocN*sizeof;fori=0;iPi= mallocsizeof;Pi-PB.n

8、umber=i+1;Pi-next=NULL;wti=0;circle_ti=0;printf;scanfPB.arrive_time,&Pi-PB.remain_time;fori=0;iTotal_Time+=Pi-PB.remain_time;printf;i=0;int k=0;forif/如果當(dāng)前有進(jìn)程正在執(zhí)行Run;ifPB.arrive_time/如果當(dāng)前時間正好有進(jìn)程進(jìn)入ifPB.remain_time PB.remain_timetemp= Pi;Pi= Run_Now;Run_Now = temp;/則調(diào)度它至運行隊列中,Run_Now-PB.Tp=t;Run_Now-PB

9、.Tc=t;wtRun_Now-PB.number-1+=Run_Now-PB.Tc-Run_Now-PB.Tp;printfPB.number;EnQueue;/并將當(dāng)前運行進(jìn)程重新插入隊列中Pi-PB.Tp=t;k+;i=?:;ifPB.remain_time = 0/如果當(dāng)前進(jìn)程運行結(jié)束,Run_Now-PB.To=t;/進(jìn)程運行結(jié)束的時間circle_tRun_Now-PB.number-1 +=t-Run_Now-PB.arrive_time;free;/則將它所占資源釋放掉,Run_Now =NULL;/并修改Run_Now為NULLRun_Now = ShortestProces

10、s;/從就緒隊列中調(diào)出最短剩余時間進(jìn)程至隊頭,if/如果隊列為空,轉(zhuǎn)為等待狀態(tài)ifIsEmpty & k = N break;Wait;continue;elseRun_Now-PB.Tc=t;wtRun_Now-PB.number-1+=Run_Now-PB.Tc-Run_Now-PB.Tp;printfPB.number;else/如果當(dāng)前運行進(jìn)程為空,那么ifPB.arrive_time/如果正好這時有進(jìn)程入隊k+;EnQueue;Run_Now = DeQueue;/則直接被調(diào)入運行隊列中Run_Now-PB.Tp=t;Run_Now-PB.Tc=t;printfPB.number;i

11、=?:;elseWait;continue;printf;printf平均等待時間是:n%fn,sum/N;printf平均周轉(zhuǎn)時間是:n%fn,sum/N;return 0;/Process.cpp代碼如下:#include#includeusingnamespace std;class Processpublic:string ProcessName; / 進(jìn)程名字int Time; / 進(jìn)程需要時間int leval; / 進(jìn)程優(yōu)先級int LeftTime; / 進(jìn)程運行一段時間后還需要的時間; void Copy ; / 把proc2賦值給proc1void Sort ; / 此排序

12、后按優(yōu)先級從大到小排列void sort1 ; / 此排序后按需要的cpu時間從小到大排列void Fcfs; / 先來先服務(wù)算法void TimeTurn; / 時間片輪轉(zhuǎn)算法void Priority; / 優(yōu)先級算法void main int a; coutendl; cout 選擇調(diào)度算法:endl; cout 1: FCFS 2: 時間片輪換 3: 優(yōu)先級調(diào)度 4: 最短作業(yè)優(yōu)先 5: 最短剩余時間優(yōu)先a; constint Size =30; Process processSize ;int num;int TimePice; cout 輸入進(jìn)程個數(shù):num; cout 輸入此進(jìn)程

13、時間片大小: TimePice;for int i=0; i string name;int CpuTime;int Leval; cout 輸入第 i+1 個進(jìn)程的名字、cpu時間和優(yōu)先級:name; cin CpuTimeLeval; processi.ProcessName =name; processi.Time =CpuTime; processi.leval =Leval; coutendl;for int k=0;kprocessk.LeftTime=processk.Time ;/對進(jìn)程剩余時間初始化cout ; coutendl; coutendl; cout進(jìn)程名字共需占用

14、CPU時間 還需要占用時間 優(yōu)先級 狀態(tài)endl;if Fcfs;elseif TimeTurn;elseif Sort; Priority;else/ 最短作業(yè)算法,先按時間從小到大排序,再調(diào)用Fcfs算法即可 sort1; Fcfs; void Copy proc1.leval =proc2.leval ; proc1.ProcessName =proc2.ProcessName ; proc1.Time =proc2.Time ;void Sort /以進(jìn)程優(yōu)先級高低排序/ 直接插入排序for int i=1;i Process temp; temp = pri;int j=i; whi

15、le0 & temp.leval prj = prj-1; j-; prj = temp; / 直接插入排序后進(jìn)程按優(yōu)先級從小到大排列forsize/2;d- Process temp; temp=pr d; pr d = pr size-d-1; pr size-d-1=temp; / 此排序后按優(yōu)先級從大到小排列/*最短作業(yè)優(yōu)先算法的實現(xiàn)*/void sort1 / 以進(jìn)程時間從低到高排序/ 直接插入排序for int i=1;i Process temp; temp = pri;int j=i; while0 & temp.Time prj = prj-1; j-; prj = temp

16、; /* 先來先服務(wù)算法的實現(xiàn)*/void Fcfs / process 是輸入的進(jìn)程,num是進(jìn)程的數(shù)目,Timepice是時間片大小while if cout 所有進(jìn)程都已經(jīng)執(zhí)行完畢!endl; exit; if cout 進(jìn)程process0.ProcessName 已經(jīng)執(zhí)行完畢!endl;for int i=0;i processi=processi+1; num-; elseif cout 進(jìn)程processnum-1.ProcessName 已經(jīng)執(zhí)行完畢!endl; num-; else coutendl; /輸出正在運行的進(jìn)程 process0.LeftTime=process0

17、.LeftTime- Timepice; process0.leval =process0.leval-1; cout process0.ProcessName process0.Time ; coutprocess0.LeftTime process0.leval 運行; coutendl; forint s=1;s cout processs.ProcessName processs.Time ; coutprocesss.LeftTime processs.leval 等待endl; ; / else coutendl; system; coutendl; / while /* 時間片輪

18、轉(zhuǎn)調(diào)度算法實現(xiàn)*/void TimeTurnwhile if cout 所有進(jìn)程都已經(jīng)執(zhí)行完畢!endl; exit; if cout 進(jìn)程process0.ProcessName 已經(jīng)執(zhí)行完畢!endl;for int i=0;i processi=processi+1; num-; if cout 進(jìn)程 processnum-1.ProcessName 已經(jīng)執(zhí)行完畢! endl; num-; elseif 0 coutendl; /輸出正在運行的進(jìn)程 process0.LeftTime=process0.LeftTime- Timepice; process0.leval =process

19、0.leval-1; cout process0.ProcessName process0.Time ; coutprocess0.LeftTime process0.leval 運行; coutendl; forint s=1;s cout processs.ProcessName processs.Time ; coutprocesss.LeftTime processs.leval; if cout 就緒endl;else cout 等待endl; Process temp; temp = process0;for int j=0;j processj = processj+1; processnum-1 = temp; / else coutendl; system; cout

溫馨提示

  • 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

提交評論