操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告_第1頁
操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告_第2頁
操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告_第3頁
操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告_第4頁
操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上進(jìn)程調(diào)度算法模擬專業(yè):XXXXX學(xué)號:XXXXX姓名:XXX實(shí)驗(yàn)日期:20XX年XX月XX日一、實(shí)驗(yàn)?zāi)康耐ㄟ^對進(jìn)程調(diào)度算法的模擬加深對進(jìn)程概念和進(jìn)程調(diào)度算法的理解。二、實(shí)驗(yàn)要求編寫程序?qū)崿F(xiàn)對5個(gè)進(jìn)程的調(diào)度模擬,要求至少采用兩種不同的調(diào)度算法分別進(jìn)行模擬調(diào)度。三、實(shí)驗(yàn)方法內(nèi)容1. 算法設(shè)計(jì)思路將每個(gè)進(jìn)程抽象成一個(gè)控制塊PCB, PCB用一個(gè)結(jié)構(gòu)體描述。構(gòu)建一個(gè)進(jìn)程調(diào)度類。將進(jìn)程調(diào)度的各種算法分裝在一個(gè)類中。類中存在三個(gè)容器,一個(gè)保存正在或未進(jìn)入就緒隊(duì)列的進(jìn)程,一個(gè)保存就緒的進(jìn)程,另一個(gè)保存已完成的進(jìn)程。還有一個(gè)PCB實(shí)例。主要保存正在運(yùn)行的進(jìn)程。類中其他方法都是圍繞這三

2、個(gè)容器可以這個(gè)運(yùn)行中的PCB展開。主要用到的技術(shù)是STL中的vector以維護(hù)和保存進(jìn)程容器、就緒容器、完成容器。當(dāng)程序啟動時(shí),用戶可以選擇不同的調(diào)度算法。然后用戶從控制臺輸入各個(gè)進(jìn)程的信息,這些信息保存到進(jìn)程容器中。進(jìn)程信息輸入完畢后,就開始了進(jìn)程調(diào)度,每調(diào)度一次判斷就緒隊(duì)列是否為空,若為空則系統(tǒng)時(shí)間加一個(gè)時(shí)間片。判斷進(jìn)程容器中是否有新的進(jìn)程可以加入就緒隊(duì)列。2. 算法流程圖主程序的框架:進(jìn)程調(diào)度過程:3. 算法中用到的數(shù)據(jù)結(jié)構(gòu)struct fcfs /先來先服務(wù)算法從這里開始 char name10; float arrivetime; float servicetime; float s

3、tarttime; float finishtime; float zztime; float dqzztime; ; /定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息 4. 主要的常量變量vectorm_ProcessQueue;/進(jìn)程輸入隊(duì)列vectorm_WaitQueue;/進(jìn)程就緒隊(duì)列vectorm_FinishQueue;/完成隊(duì)列vector:iterator m_iter;/迭代器PCB m_runProcess;/運(yùn)行中的進(jìn)程int m_ProcessCount;/進(jìn)程數(shù)float m_RunTime;/運(yùn)行時(shí)間int m_tagIsRun;/是否在運(yùn)行標(biāo)志。表示正在運(yùn)行,表

4、示沒有float m_TimeSlice;/時(shí)間片大小int m_TimeSliceCount;/指時(shí)間片輪轉(zhuǎn)中一次分到的時(shí)間片個(gè)數(shù)char m_SchedulerAlgorithm;/調(diào)度算法5. 主要模塊void PCBInput();/輸入進(jìn)程信息void PCBSort();/對進(jìn)程控制塊按照優(yōu)先級排序(采用冒泡排序)void ProcessSelect();/若當(dāng)前就緒隊(duì)列不為空則根據(jù)選擇的調(diào)度算法開始調(diào)度。否則,系統(tǒng)時(shí)間加.以等待新的進(jìn)程到來void PCBDisplay();/打印當(dāng)前狀況下。就緒隊(duì)列、完成隊(duì)列、運(yùn)行中的進(jìn)程信息void ProcessRun();/進(jìn)程運(yùn)行一次。

5、運(yùn)行時(shí)間加個(gè)時(shí)間片。并判斷進(jìn)程是否達(dá)到完成條件。若是則ProcessStatus=f.否則為w;void ProcessQueueProcess();/查看當(dāng)前時(shí)間下,有無進(jìn)程加入。若有則把該進(jìn)程調(diào)入就緒隊(duì)列void ProcessDispatch();/進(jìn)程分派,進(jìn)程執(zhí)行完成后決定進(jìn)程該進(jìn)入哪個(gè)隊(duì)列(就緒、完成)void TimePast() m_RunTime +=m_TimeSlice; ProcessQueueProcess();/當(dāng)前系統(tǒng)時(shí)間加個(gè)時(shí)間片,并檢查是否有新的進(jìn)程加入void SchedulerStatistics();/調(diào)度統(tǒng)計(jì),計(jì)算周轉(zhuǎn)時(shí)間等void FCFS();/先

6、來先服務(wù)void SJF();/最短進(jìn)程優(yōu)先調(diào)度void RR();/簡單時(shí)間片輪轉(zhuǎn)void PD();/最高優(yōu)先數(shù)優(yōu)先四、實(shí)驗(yàn)代碼#include #include #include using namespace std;struct fcfs /先來先服務(wù)算法從這里開始 char name10; float arrivetime; float servicetime; float starttime; float finishtime; float zztime; float dqzztime; ; /定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息 fcfs a100; void inp

7、ut(fcfs *p,int N) int i; coutendl; printf( 請您輸入進(jìn)程的 名字 到達(dá)時(shí)間 服務(wù)時(shí)間: (例如: a 0 100)nn); for(i=0;i=N-1;i+) printf( 請您輸入進(jìn)程%d的信息:t,i+1);scanf(ttt%s%f%f,&,&pi.arrivetime,&pi.servicetime); void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime

8、,int N) int k; printf(nn調(diào)用先來先服務(wù)算法以后進(jìn)程運(yùn)行的順序是: ); printf(%s,); for(k=1;k%s,); coutendl; printf(n 具體進(jìn)程調(diào)度信息:n); printf(t進(jìn)程名 到達(dá)時(shí)間 服務(wù)時(shí)間 開始時(shí)間 結(jié)束時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n); for(k=0;k=N-1;k+) printf(t%st%-.2ft %-.2ft %-.2ft %-.2ft %-.2ft %-.2fn,,pk.arrivetime, pk.servicetime,pk.starttime,pk.finish

9、time,pk.zztime,pk.dqzztime); getchar(); /此處必須要有這個(gè)函數(shù),否則就看不到顯示器上面的輸出,可以看到的結(jié)果只是一閃而過的一個(gè)框剪 void sort(fcfs *p,int N) /排序 for(int i=0;i=N-1;i+) for(int j=0;j=i;j+) if(pi.arrivetimepj.arrivetime) fcfs temp; temp=pi; pi=pj; pj=temp; void deal(fcfs *p, float arrivetime,float servicetime,float starttime,float

10、finishtime,float &zztime,float &dqzztime,int N) /運(yùn)行階段 int k; for(k=0;k=N-1;k+) if(k=0) pk.starttime=pk.arrivetime; pk.finishtime=pk.arrivetime+pk.servicetime; else pk.starttime=pk-1.finishtime; pk.finishtime=pk-1.finishtime+pk.servicetime; for(k=0;k=N-1;k+) pk.zztime=pk.finishtime-pk.arrivetime; pk.

11、dqzztime=pk.zztime/pk.servicetime; void FCFS(fcfs *p,int N) float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0; sort(p,N); deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); getchar

12、(); /先來先服務(wù)算法到此結(jié)束 struct sjf/最短進(jìn)程優(yōu)先調(diào)度算法從這里開始 char name10;float arrivetime; /到達(dá)時(shí)間float servicetime; /運(yùn)行時(shí)間float starttime; /開始時(shí)間float finishtime; /完成時(shí)間;sjf a1100;void input(sjf *p,int N1)/進(jìn)程信息輸入 int i;coutendl; printf( 請您輸入進(jìn)程的 名字 到達(dá)時(shí)間 服務(wù)時(shí)間: (例如: a 0 100)n); for(i=0;i=N1-1;i+) printf( 請您輸入進(jìn)程%d的信息:t,i+1)

13、; scanf(ttt%s%f%f,&,&pi.arrivetime,&pi.servicetime);void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,int N1)/最終結(jié)果輸出 int k; printf(nt調(diào)用最短進(jìn)程優(yōu)先調(diào)度算法以后進(jìn)程的調(diào)度順序?yàn)?); printf(%s,); for(k=1;k%s,); coutendl; printf(n給個(gè)進(jìn)程具體調(diào)度信息如下:n); printf(nt進(jìn)程名t到達(dá)時(shí)間t運(yùn)行時(shí)

14、間t開始時(shí)間t完成時(shí)間n); for(k=0;k=N1-1;k+) printf( t%st %-.2ftt %-.2ftt %-.2ftt %-.2ftn,,pk.arrivetime, pk.servicetime,pk.starttime,pk.finishtime); getchar(); void sort(sjf *p,int N1)/排序 for(int i=0;i=N1-1;i+) for(int j=0;j=i;j+) if(pi.arrivetimepj.arrivetime) sjf temp; temp=pi; pi=pj; pj=temp; void d

15、eal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,int N1)/運(yùn)行階段 int k; for(k=0;k=N1-1;k+) if(k=0) pk.starttime=pk.arrivetime; pk.finishtime=pk.arrivetime+float(pk.servicetime)/60; else pk.starttime=pk-1.finishtime; pk.finishtime=pk-1.finishtime+float(pk.servicetime)/60;

16、void sjff(sjf *p,int N1) float arrivetime=0,servicetime=0,starttime=0,finishtime=0; sort(p,N1); for(int m=0;mN1-1;m+) if(m=0) pm.finishtime=pm.arrivetime+float(pm.servicetime)/60; else pm.finishtime=pm-1.finishtime+float(pm.servicetime)/60; int i=0; for(int n=m+1;n=N1-1;n+) if(pn.arrivetime=pm.finis

17、htime) i+; float min=pm+1.servicetime; int next=m+1; for(int k=m+1;km+i;k+) if(pk+1.servicetimemin) min=pk+1.servicetime; next=k+1; sjf temp; temp=pm+1; pm+1=pnext; pnext=temp; deal(p,arrivetime,servicetime,starttime,finishtime,N1); Print(p,arrivetime,servicetime,starttime,finishtime,N1); getchar();

18、/最短進(jìn)程優(yōu)先調(diào)度算法到這里結(jié)束 char menu()/用來輸出相關(guān)信息的函數(shù) char cse1; while(1) system(cls); fflush(stdin); coutendl; coutendl; coutt| 歡迎 |endl ; coutt| |endl ; coutt|t 進(jìn)程調(diào)度算法模擬tt|endl; coutt| |endl ; coutt|tt 1.先來先服務(wù)調(diào)度算法 tt|endl; coutt| |endl ; coutt|tt 2.最短進(jìn)程優(yōu)先調(diào)度算法tt|endl; coutt| |endl ; coutt| |endl ; coutendl; coutendl; couttt 請輸入您的選擇(1/2):; cse1=getchar(); i

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論