




版權(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ì)報(bào)告題目: 進(jìn)程調(diào)度算法的模擬實(shí)現(xiàn) 專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名劉遠(yuǎn)強(qiáng)班級(jí)計(jì)算機(jī)131學(xué)號(hào)1310704109指導(dǎo)教師韓 立 毛完成日期信 息 工 程 學(xué) 院目 錄1 概述21.1 設(shè)計(jì)目的21.2 設(shè)計(jì)要求22 設(shè)計(jì)原理22.1 先來(lái)先服務(wù)算法22.2 短進(jìn)程優(yōu)先算法22.3高優(yōu)先權(quán)優(yōu)先算法22.4高響應(yīng)比優(yōu)先算法33 概要設(shè)計(jì)33.1 功能結(jié)構(gòu)34 詳細(xì)設(shè)計(jì)44.1 用戶界面模塊設(shè)計(jì)44.2 算法模塊設(shè)計(jì)45 測(cè)試與分析125.1 測(cè)試方案125.2 測(cè)試結(jié)果125.3 結(jié)果分析146 設(shè)計(jì)小結(jié)157 參考文獻(xiàn)15附錄 源程序代碼16題目:進(jìn)程調(diào)度算法的模擬實(shí)現(xiàn)1 概述1.
2、1 設(shè)計(jì)目的在多道程序和多任務(wù)系統(tǒng)中,系統(tǒng)內(nèi)同時(shí)處于就緒狀態(tài)的進(jìn)程可能有若干個(gè),也就是說(shuō)能運(yùn)行的進(jìn)程數(shù)大于處理機(jī)個(gè)數(shù)。為了使系統(tǒng)中的進(jìn)程能有條不紊地工作,必須選用某種調(diào)度策略,選擇一進(jìn)程占用處理機(jī)。要求學(xué)生設(shè)計(jì)一個(gè)模擬處理機(jī)調(diào)度算法,以鞏固和加深處理機(jī)調(diào)度的概念。1.2 設(shè)計(jì)要求a)至少有四種作業(yè)調(diào)度算法;b)能根據(jù)不同的調(diào)度算法算出每個(gè)作業(yè)的周轉(zhuǎn)時(shí)間和帶權(quán)周轉(zhuǎn)時(shí)間,并通過(guò)一組作業(yè)算出系統(tǒng)的平均周轉(zhuǎn)時(shí)間和平均帶權(quán)周轉(zhuǎn)時(shí)間,比較各種算法的優(yōu)缺點(diǎn);c)設(shè)計(jì)一個(gè)實(shí)用的用戶界面,以便選擇不同的作業(yè)調(diào)度算法。2 設(shè)計(jì)原理2.1 先來(lái)先服務(wù)算法 每次調(diào)度都是從后備作業(yè)隊(duì)列中選擇一個(gè)或多個(gè)最先進(jìn)入該隊(duì)列的作
3、業(yè),將它們調(diào)入內(nèi)存,為它們分配資源創(chuàng)建進(jìn)程,然后放入就緒隊(duì)列。2.2 短進(jìn)程優(yōu)先算法 短進(jìn)程優(yōu)先調(diào)度算法是從就緒隊(duì)列中選出一個(gè)估計(jì)運(yùn)行時(shí)間最短的進(jìn)程,將處理機(jī)分配給它,使它立即執(zhí)行并一直執(zhí)行到完成,或發(fā)生某事件而被阻塞放棄處理機(jī)時(shí)再重新調(diào)度。2.3高優(yōu)先權(quán)優(yōu)先算法a)當(dāng)該算法用于作業(yè)調(diào)度時(shí),系統(tǒng)從后備作業(yè)隊(duì)列中選擇若干個(gè)優(yōu)先級(jí)最高的,且系統(tǒng)能滿足資源要求的作業(yè)裝入內(nèi)存運(yùn)行。b)當(dāng)該算法用于進(jìn)程調(diào)度時(shí),將把處理機(jī)分配給就緒進(jìn)程隊(duì)列中優(yōu)先級(jí)最高的進(jìn)程。2.4高響應(yīng)比優(yōu)先算法 高響應(yīng)比優(yōu)先調(diào)度算法既考慮作業(yè)的執(zhí)行時(shí)間也考慮作業(yè)的等待時(shí)間,綜合了先來(lái)先服務(wù)和最短作業(yè)優(yōu)先兩種算法的特點(diǎn)。3 概要設(shè)計(jì)3.
4、1 功能結(jié)構(gòu)函數(shù)調(diào)用流程圖如圖31圖314 詳細(xì)設(shè)計(jì)4.1 用戶界面模塊設(shè)計(jì)用戶界面包含4種算法的選擇項(xiàng)及退出項(xiàng),并能根據(jù)對(duì)應(yīng)選項(xiàng)做出相應(yīng)反應(yīng)。選擇算法則進(jìn)入所選算法進(jìn)行進(jìn)一步計(jì)算,選擇退出則關(guān)閉界面,輸入其他錯(cuò)誤字符會(huì)顯示錯(cuò)誤提示。void main()int choice;cout<<" *進(jìn)程調(diào)度算法模擬實(shí)現(xiàn)*"<<endl;cout<<"*1.先來(lái)先服務(wù)算法*2.短作業(yè)優(yōu)先算法*"<<endl;cout<<"*3.高優(yōu)先權(quán)優(yōu)先算法*4.高響應(yīng)比優(yōu)先算法*"<&l
5、t;endl;cout<<"*5.退出*"<<endl;l1:cout<<"請(qǐng)輸入您的選擇:"<<endl; l2:cin>>choice;JCB *head=NULL;switch(choice)case 1:head=create(head);FCFS(head);goto l1;case 2:head=create(head);SJF(head,jnum);goto l1;case 3:head=create(head);SUPER(head,jnum);goto l1;case 4:he
6、ad=create(head);HRN(head,jnum);goto l1;case 5:break;default:cout<<"輸入錯(cuò)誤!n請(qǐng)重新輸入:"<<endl;goto l2;4.2 算法模塊設(shè)計(jì)先來(lái)先服務(wù)算法:直接復(fù)制首個(gè)作業(yè)的鏈表HEAD作為先來(lái)先服務(wù)的鏈表(因?yàn)槭讉€(gè)原始輸入作業(yè)的鏈表就是按輸入順序進(jìn)行鏈接形成的)。 void FCFS(JCB *head)/先來(lái)先服務(wù)算法dealFCFS(head);JCB *p,*q,*s;p=head->next;cout<<"作業(yè)執(zhí)行順序?yàn)椋?quot;while
7、(p!=NULL)cout<<"-"<<p->name;p=p->next;cout<<endl;cout<<"作業(yè)名 提交時(shí)間 開(kāi)始時(shí)間 結(jié)束時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n" s=head->next;while(s!=NULL)cout<<setw(4)<<s->name<<setw(7)<<s->htime<<setw(10)<<s->starttime<<setw(11)<&
8、lt;s->ftime<<setw(10)<<s->zhouzhuan<<setw(10)<<s->daiquan<<endl;s=s->next;cout<<endl; cout<<" 平均周轉(zhuǎn)時(shí)間:"<<total/(double)jnum<<endl;cout<<"平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<weight/(double)jnum<<endl;cout<<"*&qu
9、ot;<<endl;total=0;weight=0;b)短作業(yè)優(yōu)先算法:每次查找所有HEAD的結(jié)點(diǎn),并將結(jié)點(diǎn)中最小作業(yè)所需運(yùn)行時(shí)間的結(jié)點(diǎn)復(fù)制并連接到短作業(yè)優(yōu)先鏈表的最后節(jié)點(diǎn)中。每復(fù)制一個(gè)結(jié)點(diǎn),結(jié)點(diǎn)的是否被復(fù)制位置。共復(fù)制HEAD鏈表長(zhǎng)度的LENGTH次,就復(fù)制完畢。這樣形成的最短作業(yè)優(yōu)先鏈表就剛剛好是按作業(yè)所需運(yùn)行時(shí)間按從小到大的順序排列的了。void SJF(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;stri
10、ng pnameMAX_NUM;for(int ss=0;ss<MAX_NUM;ss+)pnamess=""sortFCFS(head);cout<<endl;cout<<" 順序 作業(yè)名 提交時(shí)間 開(kāi)始時(shí)間 結(jié)束時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n"head=head->next;p=head;while(head)q=head;if(time < p->htime) /如果該作業(yè)提交時(shí)間早于其它作業(yè),則先執(zhí)行該作業(yè)time=p->htime;flag=head; /用于暫存將要執(zhí)行的作業(yè)while(q
11、&& q->htime <= time)if(q->ntime<flag->ntime)flag=q;q=q->next;/輸出當(dāng)前執(zhí)行作業(yè)的信息 cout<<setw(4)<<xuhao+1;cout<<setw(8)<<flag->name;cout<<setw(8)<<flag->ntime;cout<<setw(8)<<time;cout<<setw(10)<<(time + flag->ntime
12、);cout<<setw(10)<<(time - flag->htime + flag->ntime);cout<<" "<<setw(11)<<(double)(time-flag->htime + flag->ntime)/flag->ntime)<<endl; j=(time-flag->htime+flag->ntime); /當(dāng)前執(zhí)行作業(yè)的周轉(zhuǎn)時(shí)間runTime +=j; /記錄周轉(zhuǎn)時(shí)間time+=flag->ntime;drunTime+=j
13、/flag->ntime; /帶權(quán)周轉(zhuǎn)時(shí)間pnamexuhao=flag->name;xuhao+;/將執(zhí)行過(guò)的作業(yè)從鏈表中刪除if(flag=head) /在鏈表頭head=head->next; else /在鏈表中p1=head;while(p1->next!=flag)p1=p1->next;p1->next=flag->next;delete flag; /刪除這個(gè)作業(yè)所占的節(jié)點(diǎn)cout<<"作業(yè)執(zhí)行順序?yàn)椋?quot;for(ss=0;ss<n;ss+)cout<<pnamess;if(pnamess
14、+1 !="")cout<<" -> "cout<<endl;cout<<" 平均周轉(zhuǎn)時(shí)間為:"<<runTime/n<<endl; cout<<"平均帶權(quán)周轉(zhuǎn)時(shí)間為:"<<drunTime/n<<endl;cout<<"*"<<endl;c)高優(yōu)先權(quán)優(yōu)先算法:其中的操作和短作業(yè)優(yōu)先差不多。因?yàn)樽鳂I(yè)在輸入時(shí)已經(jīng)有了作業(yè)時(shí)間和優(yōu)先權(quán),高優(yōu)先權(quán)算法是查找HEAD中最高優(yōu)先權(quán)的
15、結(jié)點(diǎn)進(jìn)行復(fù)制。void SUPER(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ss<MAX_NUM;ss+)pnamess=""sortFCFS(head);cout<<endl;cout<<" 順序 作業(yè)名 提交時(shí)間 開(kāi)始時(shí)間 結(jié)束時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n"head=head->
16、;next;p=head;while(head)q=head;if(time < p->htime) /如果該作業(yè)提交時(shí)間早于其它作業(yè),則先執(zhí)行該作業(yè)time=p->htime;flag=head; /用于暫存將要執(zhí)行的作業(yè)while(q && q->htime <= time)if(q->super>flag->super)flag=q;q=q->next;/輸出當(dāng)前執(zhí)行作業(yè)的信息 cout<<setw(4)<<xuhao+1;cout<<setw(8)<<flag->
17、name;cout<<setw(8)<<flag->ntime;cout<<setw(8)<<time;cout<<setw(10)<<(time + flag->ntime);cout<<setw(10)<<(time - flag->htime + flag->ntime);cout<<" "<<setw(11)<<(double)(time-flag->htime + flag->ntime)/flag
18、->ntime)<<endl; j=(time-flag->htime+flag->ntime); /當(dāng)前執(zhí)行作業(yè)的周轉(zhuǎn)時(shí)間runTime +=j; /記錄周轉(zhuǎn)時(shí)間time+=flag->ntime;drunTime+=j/flag->ntime; /帶權(quán)周轉(zhuǎn)時(shí)間pnamexuhao=flag->name;xuhao+;/將執(zhí)行過(guò)的作業(yè)從鏈表中刪除if(flag=head) /在鏈表頭head=head->next; else /在鏈表中p1=head;while(p1->next!=flag)p1=p1->next;p1-&g
19、t;next=flag->next;delete flag; /刪除這個(gè)作業(yè)所占的節(jié)點(diǎn)cout<<"作業(yè)執(zhí)行順序?yàn)椋?quot;for(ss=0;ss<n;ss+)cout<<pnamess;if(pnamess+1 !="")cout<<" -> "cout<<endl;cout<<" 平均周轉(zhuǎn)時(shí)間為:"<<runTime/n<<endl; cout<<"平均帶權(quán)周轉(zhuǎn)時(shí)間為:"<<
20、;drunTime/n<<endl;cout<<"*"<<endl;d)高響應(yīng)比優(yōu)先算法:首先是將HEAD整個(gè)鏈表復(fù)制過(guò)來(lái)形成高響應(yīng)比鏈表,然后每執(zhí)行一次就算出正在執(zhí)行作業(yè)以后所有結(jié)點(diǎn)的響應(yīng)比,查找出響應(yīng)比最高的那個(gè)結(jié)點(diǎn),將響應(yīng)比最高的結(jié)點(diǎn)插入到正在執(zhí)行作業(yè)后面。這樣執(zhí)行下一個(gè)結(jié)點(diǎn)時(shí),必定是未執(zhí)行所有結(jié)點(diǎn)中響應(yīng)比最高的結(jié)點(diǎn)。 void HRN(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0
21、;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ss<MAX_NUM;ss+)pnamess=""sortFCFS(head);cout<<endl;cout<<" 順序 作業(yè)名 提交時(shí)間 開(kāi)始時(shí)間 結(jié)束時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n"head=head->next;p=head;while(head)q=head;if(time < p->htime) /如果該作業(yè)提交時(shí)間早于其它作業(yè),則先執(zhí)行該作業(yè)time=p->htime;flag=head; /用于
22、暫存將要執(zhí)行的作業(yè)/計(jì)算當(dāng)前鏈表中作業(yè)的響應(yīng)比while(q && q->htime <= time)if(time - q->htime)/(q->ntime) > (time - flag->htime)/(flag->ntime)flag=q;q=q->next;if(time<flag->htime)/如果上一次結(jié)束時(shí)間比當(dāng)前選中要執(zhí)行作業(yè)的結(jié)束時(shí)間小time=flag->htime; /則當(dāng)前作業(yè)開(kāi)始時(shí)間為提交時(shí)間/輸出當(dāng)前執(zhí)行作業(yè)的信息 cout<<setw(4)<<xuhao
23、+1;cout<<setw(8)<<flag->name;cout<<setw(8)<<flag->ntime;cout<<setw(8)<<time;cout<<setw(10)<<(time + flag->ntime);cout<<setw(10)<<(time - flag->htime + flag->ntime);cout<<" "<<setw(11)<<(double)(tim
24、e-flag->htime + flag->ntime)/flag->ntime)<<endl; j=(time-flag->htime+flag->ntime); /當(dāng)前執(zhí)行作業(yè)的周轉(zhuǎn)時(shí)間runTime +=j; /記錄周轉(zhuǎn)時(shí)間time+=flag->ntime;drunTime+=j/flag->ntime; /帶權(quán)周轉(zhuǎn)時(shí)間pnamexuhao=flag->name;xuhao+;/將執(zhí)行過(guò)的作業(yè)從鏈表中刪除if(flag=head) /在鏈表頭head=head->next; else /在鏈表中p1=head;while
25、(p1->next!=flag)p1=p1->next;p1->next=flag->next;delete flag; /刪除這個(gè)作業(yè)所占的節(jié)點(diǎn)cout<<"作業(yè)執(zhí)行順序?yàn)椋?quot;for(ss=0;ss<n;ss+)cout<<pnamess;if(pnamess+1 !="")cout<<" -> "cout<<endl;cout<<" 平均周轉(zhuǎn)時(shí)間為:"<<runTime/n<<endl; co
26、ut<<"平均帶權(quán)周轉(zhuǎn)時(shí)間為:"<<drunTime/n<<endl;cout<<"*"<<endl;5 測(cè)試與分析5.1 測(cè)試方案先選擇算法,輸入進(jìn)程數(shù)、作業(yè)名、優(yōu)先級(jí)、到達(dá)時(shí)間、估計(jì)運(yùn)行時(shí)間,得出相應(yīng)的作業(yè)名、提交時(shí)間 、開(kāi)始時(shí)間 、結(jié)束時(shí)間 、周轉(zhuǎn)時(shí)間、帶權(quán)周轉(zhuǎn)時(shí)間。通過(guò)四種算法之間的比較了解他們的優(yōu)缺點(diǎn)。5.2 測(cè)試結(jié)果 5.3 結(jié)果分析由測(cè)試結(jié)果可知每種算法的優(yōu)缺點(diǎn):a)先來(lái)先服務(wù)算法:有利于長(zhǎng)作業(yè)(進(jìn)程)而不利于短作業(yè)(進(jìn)程)有利于CPU繁忙型作業(yè)(進(jìn)程)而不利于I/O繁忙型作業(yè)(進(jìn)
27、程)。b)短作業(yè)優(yōu)先算法:比FCFS改善平均周轉(zhuǎn)時(shí)間和平均帶權(quán)周轉(zhuǎn)時(shí)間短作業(yè)的等待時(shí)間;提高系統(tǒng)的吞吐量;對(duì)長(zhǎng)作業(yè)非常不利,可能長(zhǎng)時(shí)間得不到執(zhí)行;未能依據(jù)作業(yè)的緊迫程度來(lái)劃分執(zhí)行的優(yōu)先級(jí);c)難以準(zhǔn)確估計(jì)作業(yè)(進(jìn)程)的執(zhí)行時(shí)間,從而影響調(diào)度性能。c)高優(yōu)先權(quán)算法:動(dòng)態(tài)優(yōu)先級(jí)優(yōu)點(diǎn)是使相應(yīng)的優(yōu)先級(jí)調(diào)度算法比較靈活、科學(xué),可防止有些進(jìn)程一直得不到調(diào)度,也可防止有些進(jìn)程長(zhǎng)期壟斷處理機(jī)。動(dòng)態(tài)優(yōu)先級(jí)缺點(diǎn)是需要花費(fèi)相當(dāng)多的執(zhí)行程序時(shí)間,因而花費(fèi)的系統(tǒng)開(kāi)銷比較大。d)高響應(yīng)比優(yōu)先算法:短作業(yè)與先后次序的兼顧,且不會(huì)使長(zhǎng)作業(yè)長(zhǎng)期得不到服務(wù)響應(yīng)比計(jì)算系統(tǒng)開(kāi)銷,增加系統(tǒng)開(kāi)銷。6 設(shè)計(jì)小結(jié) 通過(guò)改程序?qū)Σ僮飨到y(tǒng)的基礎(chǔ)
28、知識(shí)了解得更透徹了,同時(shí)對(duì)磁盤(pán)調(diào)度的四種算法先來(lái)先服務(wù)算法,短進(jìn)程優(yōu)先調(diào)度算法,優(yōu)先權(quán)算法,高響應(yīng)比調(diào)度算法有了更深刻的理解和掌握,使我能夠?yàn)檫M(jìn)程調(diào)度選擇適當(dāng)?shù)乃惴ǎ岣逤PU工作效率。進(jìn)行進(jìn)程調(diào)度程序設(shè)計(jì)的過(guò)程中,得到老師的大力指導(dǎo)和同學(xué)的支持,在此向他們表示感謝。經(jīng)過(guò)自己的動(dòng)手操作和同學(xué)老師的指導(dǎo)我成功的做出了課程設(shè)自己感到很高興。在整個(gè)過(guò)程中自己也感受到了集體團(tuán)結(jié)的力量,今后無(wú)論是在工作還是學(xué)習(xí)中我都會(huì)發(fā)樣這種精神。7 參考文獻(xiàn)1 韓立毛,李先鋒. 計(jì)算機(jī)操作系統(tǒng)實(shí)踐教程M,南京:南京大學(xué)出版社,2011.10.2 嚴(yán)蔚敏,吳偉民. 數(shù)據(jù)結(jié)構(gòu)M,北京:清華大學(xué)出版社,1997.43 張堯
29、學(xué),史美林. 計(jì)算機(jī)操作系統(tǒng)教程M,北京:清華大學(xué)出版社,2000.8.4 孫靜宇. 計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)指導(dǎo)書(shū)M,山西:太原理工出版社,2006.4.附錄 源程序代碼#include<iostream>#include<string>#include<iomanip>using namespace std;#define MAX_NUM 15typedef struct JCBchar name10;/作業(yè)名float htime;/作業(yè)到達(dá)時(shí)間float ntime;/作業(yè)估計(jì)運(yùn)行的時(shí)間float starttime;/作業(yè)開(kāi)始運(yùn)行時(shí)間float ft
30、ime;/作業(yè)完成的時(shí)間float zhouzhuan;/周轉(zhuǎn)時(shí)間float daiquan;/帶權(quán)周轉(zhuǎn)時(shí)間float xiangyingbi;/相應(yīng)比int super;/優(yōu)先級(jí)JCB *next;/定義指向下一個(gè)作業(yè)的指針JCB;int jnum;/定義作業(yè)數(shù)為jnumfloat total;/記錄所有作業(yè)的總時(shí)間double weight;/記錄所有作業(yè)的帶權(quán)周轉(zhuǎn)時(shí)間JCB *create(JCB *head);/創(chuàng)建作業(yè)隊(duì)列void dealFCFS(JCB *head);/FCFS記錄處理void sortFCFS(JCB *head);/將作業(yè)按到達(dá)的先后順序排列void FCFS
31、(JCB *head);/先來(lái)先服務(wù)算法void SJF(JCB *head,int n);/短作業(yè)優(yōu)先算法void SUPER(JCB *head,int n);/高優(yōu)先權(quán)優(yōu)先算法void HRN(JCB *head,int n);/高響應(yīng)比優(yōu)先算法void main()int choice;cout<<" *進(jìn)程調(diào)度算法實(shí)現(xiàn)*"<<endl;cout<<" *1.先來(lái)先服務(wù)算法*2.短作業(yè)優(yōu)先算法*"<<endl;cout<<" *3.高優(yōu)先權(quán)優(yōu)先算法*4.高響應(yīng)比優(yōu)先算法*&qu
32、ot;<<endl;cout<<"*5. 退出*"<<endl;l1:cout<<"請(qǐng)輸入您的選擇:"<<endl;l2:cin>>choice;JCB *head=NULL;switch(choice)case 1:head=create(head);FCFS(head);goto l1;case 2:head=create(head);SJF(head,jnum);goto l1;case 3:head=create(head);SUPER(head,jnum);goto l1;
33、case 4:head=create(head);HRN(head,jnum);goto l1;case 5:break;default:cout<<"輸入錯(cuò)誤!n請(qǐng)重新輸入:"<<endl;goto l2;/創(chuàng)建節(jié)點(diǎn)與作業(yè)輸入JCB *create(JCB *head)JCB *p1,*p2;p1=p2=new JCB;head=p1;cout<<"請(qǐng)輸入作業(yè)數(shù):"cin>>jnum;for(int i=0;i<jnum;i+)p2=p1;p1=new JCB;p1->next=NULL;co
34、ut<<"請(qǐng)依次輸入第"<<i+1<<"個(gè)作業(yè)的信息(作業(yè)名、優(yōu)先級(jí)、到達(dá)時(shí)間、估計(jì)運(yùn)行時(shí)間):"cin>>p1->name>>p1->super>>p1->htime>>p1->ntime; p2->next=p1;return head;/FCFS算法void sortFCFS(JCB *head)/將作業(yè)按到達(dá)的先后順序排列JCB *p,*q,*r,*s;if(head->next!=NULL)p=head->next-&g
35、t;next;head->next->next=NULL;while(p)q=p;p=p->next;r=head;s=head->next;while(s&&s->htime<=q->htime)r=s;s=s->next;r->next=q;q->next=s;void dealFCFS(JCB *head)/FCFS記錄處理sortFCFS(head);JCB *p,*q;q=head->next;q->starttime=q->htime;q->ftime=q->starttime
36、+q->ntime;q->zhouzhuan=q->ftime-q->htime; q->daiquan=q->zhouzhuan/(double)q->ntime;total+=q->zhouzhuan; weight+=q->daiquan;p=q->next; while(p!=NULL)p->starttime=q->ftime;p->ftime=p->starttime+p->ntime;p->zhouzhuan=p->ftime-p->htime; p->daiquan
37、=p->zhouzhuan/(double)p->ntime;total+=p->zhouzhuan; weight+=p->daiquan;q=p;p=p->next;void FCFS(JCB *head)/先來(lái)先服務(wù)算法dealFCFS(head);JCB *p,*q,*s;p=head->next;cout<<"作業(yè)執(zhí)行順序?yàn)椋?quot;while(p!=NULL)cout<<"-"<<p->name;p=p->next;cout<<endl;cout<
38、<"作業(yè)名 提交時(shí)間 開(kāi)始時(shí)間 結(jié)束時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n" s=head->next;while(s!=NULL)cout<<setw(4)<<s->name<<setw(7)<<s->htime<<setw(10)<<s->starttime<<setw(11)<<s->ftime<<setw(10)<<s->zhouzhuan<<setw(10)<<s->daiquan&
39、lt;<endl;s=s->next;cout<<endl; cout<<" 平均周轉(zhuǎn)時(shí)間:"<<total/(double)jnum<<endl;cout<<"平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<weight/(double)jnum<<endl;cout<<"*"<<endl;total=0;weight=0;/SJF短作業(yè)優(yōu)先算法void SJF(JCB *head,int n)JCB *p,*p1;JCB *flag=N
40、ULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ss<MAX_NUM;ss+)pnamess=""sortFCFS(head);cout<<endl;cout<<" 順序 作業(yè)名 提交時(shí)間 開(kāi)始時(shí)間 結(jié)束時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n"head=head->next;p=head;while(head)q=head;if(time < p->htime)
41、 /如果該作業(yè)提交時(shí)間早于其它作業(yè),則先執(zhí)行該作業(yè)time=p->htime;flag=head; /用于暫存將要執(zhí)行的作業(yè)while(q && q->htime <= time)if(q->ntime<flag->ntime)flag=q;q=q->next;/輸出當(dāng)前執(zhí)行作業(yè)的信息 cout<<setw(4)<<xuhao+1;cout<<setw(8)<<flag->name;cout<<setw(8)<<flag->ntime;cout<&
42、lt;setw(8)<<time;cout<<setw(10)<<(time + flag->ntime);cout<<setw(10)<<(time - flag->htime + flag->ntime);cout<<" "<<setw(11)<<(double)(time-flag->htime + flag->ntime)/flag->ntime)<<endl;j=(time-flag->htime+flag->
43、ntime); /當(dāng)前執(zhí)行作業(yè)的周轉(zhuǎn)時(shí)間runTime +=j; /記錄周轉(zhuǎn)時(shí)間time+=flag->ntime;drunTime+=j/flag->ntime; /帶權(quán)周轉(zhuǎn)時(shí)間pnamexuhao=flag->name;xuhao+;/將執(zhí)行過(guò)的作業(yè)從鏈表中刪除if(flag=head) /在鏈表頭head=head->next; else /在鏈表中p1=head;while(p1->next!=flag)p1=p1->next;p1->next=flag->next;delete flag; /刪除這個(gè)作業(yè)所占的節(jié)點(diǎn)cout<<
44、;"作業(yè)執(zhí)行順序?yàn)椋?quot;for(ss=0;ss<n;ss+)cout<<pnamess;if(pnamess+1 !="")cout<<" -> "cout<<endl;cout<<" 平均周轉(zhuǎn)時(shí)間為:"<<runTime/n<<endl; cout<<"平均帶權(quán)周轉(zhuǎn)時(shí)間為:"<<drunTime/n<<endl;cout<<"*"<<
45、endl;/高優(yōu)先權(quán)優(yōu)先算法void SUPER(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ss<MAX_NUM;ss+)pnamess=""sortFCFS(head);cout<<endl;cout<<" 順序 作業(yè)名 提交時(shí)間 開(kāi)始時(shí)間 結(jié)束時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間n"head=h
46、ead->next;p=head;while(head)q=head;if(time < p->htime) /如果該作業(yè)提交時(shí)間早于其它作業(yè),則先執(zhí)行該作業(yè)time=p->htime;flag=head; /用于暫存將要執(zhí)行的作業(yè)while(q && q->htime <= time)if(q->super>flag->super)flag=q;q=q->next;/輸出當(dāng)前執(zhí)行作業(yè)的信息 cout<<setw(4)<<xuhao+1;cout<<setw(8)<<fl
47、ag->name;cout<<setw(8)<<flag->ntime;cout<<setw(8)<<time;cout<<setw(10)<<(time + flag->ntime);cout<<setw(10)<<(time - flag->htime + flag->ntime);cout<<" "<<setw(11)<<(double)(time-flag->htime + flag->ntim
48、e)/flag->ntime)<<endl; j=(time-flag->htime+flag->ntime); /當(dāng)前執(zhí)行作業(yè)的周轉(zhuǎn)時(shí)間runTime +=j; /記錄周轉(zhuǎn)時(shí)間time+=flag->ntime;drunTime+=j/flag->ntime; /帶權(quán)周轉(zhuǎn)時(shí)間pnamexuhao=flag->name;xuhao+;/將執(zhí)行過(guò)的作業(yè)從鏈表中刪除if(flag=head) /在鏈表頭head=head->next; else /在鏈表中p1=head;while(p1->next!=flag)p1=p1->nex
49、t;p1->next=flag->next;delete flag; /刪除這個(gè)作業(yè)所占的節(jié)點(diǎn)cout<<"作業(yè)執(zhí)行順序?yàn)椋?quot;for(ss=0;ss<n;ss+)cout<<pnamess;if(pnamess+1 !="")cout<<" -> "cout<<endl;cout<<" 平均周轉(zhuǎn)時(shí)間為:"<<runTime/n<<endl; cout<<"平均帶權(quán)周轉(zhuǎn)時(shí)間為:"<<drunTime/n<<endl;cout<<"*"<<endl;/高相應(yīng)比優(yōu)先算法void HRN(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 皰性角結(jié)膜炎的臨床護(hù)理
- 長(zhǎng)期昏迷患者護(hù)理
- 腎上腺手術(shù)護(hù)理
- 二次根式加減教學(xué)設(shè)計(jì)
- 氣道出血相關(guān)知識(shí)與處理
- 微生物實(shí)驗(yàn)室工作總結(jié)模版
- 物業(yè)管理項(xiàng)目評(píng)優(yōu)培訓(xùn)
- 上肢出血點(diǎn)的臨床護(hù)理
- 項(xiàng)目部技術(shù)質(zhì)量管理體系構(gòu)建
- 游戲中的語(yǔ)文教學(xué)應(yīng)用研究
- 2萬(wàn)噸棉桿化機(jī)漿項(xiàng)目可行性報(bào)告
- 施工現(xiàn)場(chǎng)防汛應(yīng)急培訓(xùn)記錄
- 果蔬干制加工技術(shù)課件
- 個(gè)人承諾書(shū)(建造師)
- 應(yīng)急預(yù)案(危貨運(yùn)輸企業(yè))
- 氬氣崗位應(yīng)急處置卡
- 更換破碎機(jī)耦合器措施-
- SMT不良品維修作業(yè)指導(dǎo)書(shū)
- 四年級(jí)英語(yǔ)下冊(cè)Unit11IwasborninJanuary教案教科版(廣州三起)
- 【JIS日本標(biāo)準(zhǔn)】JIS Z 2371-2000 鹽霧試驗(yàn)方法
- 汽車(chē)4S店顧客抱怨處理
評(píng)論
0/150
提交評(píng)論