版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 設(shè)計(jì)題目 操作系統(tǒng)課程設(shè)計(jì) </p><p> 學(xué)生姓名 </p><p> 學(xué) 號(hào) </p><p> 專業(yè)班級(jí) </p><p> 指導(dǎo)教師 </p><p>
2、 2012年 12 月 22 日</p><p><b> 目錄</b></p><p><b> 算法設(shè)計(jì)概述</b></p><p> 1、設(shè)計(jì)背景-------------------------------------------------------------------------1</
3、p><p> 2、運(yùn)行環(huán)境-------------------------------------------------------------------------1</p><p><b> 二、進(jìn)程調(diào)度算法</b></p><p> 1、進(jìn)程并發(fā)執(zhí)行-----------------------------------------
4、-------------------------1</p><p> 2、算法原理及設(shè)計(jì)--------------------------------------------------------------2</p><p> 3、代碼設(shè)計(jì)----------------------------------------------------------------------
5、---3</p><p><b> 三、銀行家算法</b></p><p> 1、進(jìn)程死鎖狀態(tài)-----------------------------------------------------------------13</p><p> 2、算法原理及設(shè)計(jì)-------------------------------------
6、-------------------------13</p><p> 3、代碼設(shè)計(jì)------------------------------------------------------------------------16</p><p><b> 四、頁(yè)面調(diào)度算法</b></p><p> 1、頁(yè)式虛擬存儲(chǔ)---------
7、--------------------------------------------------------20</p><p> 2、算法原理及設(shè)計(jì)--------------------------------------------------------------20</p><p> 3、代碼設(shè)計(jì)-------------------------------------
8、-----------------------------------21</p><p><b> 五、課程設(shè)計(jì)總結(jié)</b></p><p> 1、知識(shí)總結(jié)------------------------------------------------------------------------26</p><p> 2、實(shí)踐感悟-
9、-----------------------------------------------------------------------26</p><p><b> 算法設(shè)計(jì)概述</b></p><p><b> 1、設(shè)計(jì)背景</b></p><p> 操作系統(tǒng)是管理計(jì)算機(jī)硬件資源,控制其他程序運(yùn)行并為用戶提
10、供交互操作界面的系統(tǒng)軟件的集合。操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)的關(guān)鍵組成部分,負(fù)責(zé)管理與配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序、控制輸入與輸出設(shè)備、操作網(wǎng)絡(luò)與管理文件系統(tǒng)等基本任務(wù)。操作系統(tǒng)作為系統(tǒng)與用戶之間的接口,極大方便了用戶使用操作系統(tǒng),同時(shí)也推動(dòng)了計(jì)算機(jī)科學(xué)的發(fā)展。</p><p> 《操作系統(tǒng)原理》課程設(shè)計(jì)是信息計(jì)算科學(xué)專業(yè)實(shí)踐性環(huán)節(jié)之一,是對(duì)學(xué)習(xí)完《操 作系統(tǒng)原理》 課程后進(jìn)行的一次較全面的
11、綜合訓(xùn)練。 其目的在于加深對(duì)操作系統(tǒng) 的理論、 方法和基礎(chǔ)知識(shí)的理解, 掌握操作系統(tǒng)結(jié)構(gòu)、 實(shí)現(xiàn)機(jī)理和各種典型算法, 系統(tǒng)地了解操作系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)思路,培養(yǎng)學(xué)系統(tǒng)設(shè)計(jì)能力, 并了解操作 系統(tǒng)的發(fā)展動(dòng)向和趨勢(shì)。對(duì)以后工作或者進(jìn)一步研究都有促進(jìn)作用。</p><p><b> 2、設(shè)計(jì)環(huán)境</b></p&g
12、t;<p> 開發(fā)環(huán)境:Visual C++ 6.0</p><p> 運(yùn)行環(huán)境:Windows 7 / XP</p><p><b> 進(jìn)程調(diào)度算法</b></p><p><b> 1、進(jìn)程的并發(fā)執(zhí)行</b></p><p> 并發(fā)性是操作系統(tǒng)的重要特征</p>
13、;<p> 在多道程序環(huán)境下,并發(fā)性是指在一段時(shí)間內(nèi)宏觀上有多個(gè)程序在同時(shí)運(yùn)行,但在單處理機(jī)系統(tǒng)中,每一時(shí)刻卻只能有一道程序執(zhí)行,故在微觀上這些程序只能是分時(shí)地交替運(yùn)行。倘若在計(jì)算機(jī)系統(tǒng)有多個(gè)處理機(jī),則這些可以并發(fā)執(zhí)行的程序便可以被分配到多個(gè)處理機(jī)上,實(shí)現(xiàn)執(zhí)行,即利用每個(gè)處理機(jī)來處理一個(gè)可以并發(fā)執(zhí)行的程序,這樣,多個(gè)程序便可同時(shí)執(zhí)行。</p><p> 程序是靜態(tài)實(shí)體,進(jìn)程是動(dòng)態(tài)的,通過對(duì)進(jìn)程調(diào)
14、度實(shí)現(xiàn),實(shí)現(xiàn)程序運(yùn)行。調(diào)度的實(shí)質(zhì)是系統(tǒng)按照某種特定的分配策略來分配資源。進(jìn)程調(diào)度的目的是分配CPU資源。由于進(jìn)程調(diào)度程序執(zhí)行的頻率很高,因此調(diào)度算法的好壞將直接影響到操作系統(tǒng)的性能。本實(shí)驗(yàn)的目的是模擬實(shí)現(xiàn)幾種常見的進(jìn)程調(diào)度算法,通過對(duì)幾組進(jìn)程分別使用不同的調(diào)度算法,計(jì)算進(jìn)程的平均周轉(zhuǎn)時(shí)間和平均帶權(quán)周轉(zhuǎn)時(shí)間,比較各種算法的性能優(yōu)劣。</p><p><b> 2、算法原理及設(shè)計(jì)</b><
15、;/p><p><b> ?。?)進(jìn)程調(diào)度算法</b></p><p> 進(jìn)程調(diào)度算法包括先來先服務(wù)調(diào)度算法、優(yōu)先數(shù)調(diào)度算法、時(shí)間片論轉(zhuǎn)算法和分級(jí)調(diào)度算法等4種。本實(shí)驗(yàn)包括3種算法,有興趣的讀者可以在完成這些算法的基礎(chǔ)上實(shí)現(xiàn)第四種算法。下面對(duì)前3種算法作一一簡(jiǎn)單介紹。</p><p> <1> 先來先服務(wù)(FCFS)調(diào)度算法<
16、/p><p> 本算法在進(jìn)行調(diào)度時(shí),總是選擇一個(gè)最先進(jìn)入進(jìn)程就緒隊(duì)列的進(jìn)程,把處理器分配給它,使之開始運(yùn)行。該進(jìn)程一直運(yùn)行到完成或發(fā)生阻塞事件時(shí),才放棄處理器。</p><p> <2> 優(yōu)先數(shù)調(diào)度算法</p><p> 對(duì)每個(gè)進(jìn)程確定一個(gè)優(yōu)先數(shù),進(jìn)程調(diào)度總是讓具有最高優(yōu)先數(shù)的進(jìn)程先使用處理器。如果就緒隊(duì)列中出現(xiàn)優(yōu)先數(shù)相同的進(jìn)程,則對(duì)這些有相同優(yōu)先數(shù)的
17、進(jìn)程采用先來先服務(wù)算法進(jìn)行調(diào)度。</p><p> 對(duì)于占用處理器的進(jìn)程,系統(tǒng)可以使用“搶占式”或“非搶占式”的策略?!胺菗屨际健敝高M(jìn)程一旦占用處理器,除非自己愿意,否則操作系統(tǒng)不能將處理器強(qiáng)行奪走,即使該進(jìn)程的優(yōu)先數(shù)已經(jīng)小于就緒隊(duì)列中的某個(gè)進(jìn)程?!皳屨际健眲t相反,一旦就緒隊(duì)列中的某個(gè)進(jìn)程優(yōu)先數(shù)大于正在執(zhí)行的進(jìn)程,立刻進(jìn)行進(jìn)程切換。</p><p> 進(jìn)程的優(yōu)先數(shù)可以發(fā)生變化。本實(shí)驗(yàn)的
18、基本要求是實(shí)現(xiàn)固定優(yōu)先數(shù)的調(diào)度算法,讀者可以在這個(gè)基礎(chǔ)上添加動(dòng)態(tài)優(yōu)先數(shù)功能。</p><p> <3> 時(shí)間片輪轉(zhuǎn)調(diào)度算法</p><p> 在需要保證響應(yīng)時(shí)間的場(chǎng)合通常采用時(shí)間片輪轉(zhuǎn)算法來分配處理器。本算法將所有的就緒進(jìn)程按先來先服務(wù)的原則排成一個(gè)隊(duì)列,每次調(diào)度時(shí)把CPU分配給隊(duì)首進(jìn)程,令其執(zhí)行一個(gè)時(shí)間片。時(shí)間片用完,調(diào)度程序自動(dòng)停止該進(jìn)程的執(zhí)行,將它放到進(jìn)程就緒隊(duì)列的末
19、尾,等待下一次執(zhí)行,然后將CPU分配給就緒隊(duì)列中新的隊(duì)首進(jìn)程,也讓它執(zhí)行一個(gè)時(shí)間片。重復(fù)這個(gè)過程,直到所有的進(jìn)程執(zhí)行完畢。</p><p> (2)衡量算法性能的參數(shù)</p><p> 下面引入兩個(gè)衡量調(diào)度算法性能的參數(shù)。</p><p><b> 平均周轉(zhuǎn)時(shí)間:</b></p><p><b> 平均
20、帶權(quán)周轉(zhuǎn)時(shí)間:</b></p><p><b> 其中:n為進(jìn)程數(shù)目</b></p><p> Ti為第i個(gè)進(jìn)程的周轉(zhuǎn)時(shí)間,即進(jìn)程從開始運(yùn)行到結(jié)束的時(shí)間</p><p> Tsi為第i個(gè)進(jìn)程要求執(zhí)行的時(shí)間,即需要在CPU上的執(zhí)行時(shí)間。</p><p><b> 3、代碼設(shè)計(jì)</b>
21、;</p><p> (1)建立進(jìn)程控制塊</p><p> 進(jìn)程控制塊至少應(yīng)該包括:</p><p><b> 進(jìn)程名稱</b></p><p><b> 進(jìn)程需要執(zhí)行時(shí)間</b></p><p><b> 進(jìn)入就緒隊(duì)列時(shí)間</b></
22、p><p><b> 進(jìn)程執(zhí)行結(jié)束時(shí)間</b></p><p> (2)就緒進(jìn)程序列如上右表所示</p><p><b> 3、代碼設(shè)計(jì)</b></p><p> #include<stdio.h> </p><p> #include<string.
23、h> </p><p> #include<iostream.h> </p><p> const int timeslice=5; //定義時(shí)間片的長(zhǎng)度 </p><p> const int MAXPCB=100; //定義最大進(jìn)程數(shù) </p><p> //定義進(jìn)程結(jié)構(gòu)體 </p
24、><p> typedef struct node{ </p><p> char sNum[4]; //進(jìn)程編號(hào)</p><p> int ArriveTime; //進(jìn)程到達(dá)時(shí)間</p><p> int RunTime; //進(jìn)程要求執(zhí)行的時(shí)間</p><p>
25、; int Privilege; //進(jìn)程的優(yōu)先數(shù)</p><p> int Finished; //標(biāo)志進(jìn)程是否執(zhí)行完成</p><p> int Time; //求進(jìn)程的等待時(shí)間的借助變量</p><p> int WaitTime; //進(jìn)程的等待時(shí)間</p>
26、;<p> int TurnoverTime; //進(jìn)程的周轉(zhuǎn)時(shí)間</p><p> float WeighTurnTime; //進(jìn)程的帶權(quán)周轉(zhuǎn)時(shí)間</p><p><b> }pcb; </b></p><p> pcb pcbs[MAXPCB]; </p><p> in
27、t PCBNum; //進(jìn)程數(shù)</p><p> //PCB初始化函數(shù) </p><p> void initPCB() </p><p><b> { </b></p><p><b> int i; </b></p><
28、;p> for(i=0;i<MAXPCB;i++)</p><p><b> { </b></p><p> strcpy(pcbs[i].sNum,""); </p><p> pcbs[i].ArriveTime=0; </p><p> pcbs[i].RunTime=0;
29、 </p><p> pcbs[i].Privilege=0; </p><p> pcbs[i].Finished=0;</p><p> pcbs[i].Time=0; </p><p> pcbs[i].WaitTime=0;</p><p> pcbs[i].TurnoverTime=0; &l
30、t;/p><p> pcbs[i].WeighTurnTime=0;</p><p> } //for(i=0;i<MAXPCB;i++)</p><p> PCBNum=0; </p><p> } //void initPCB()</p><p> //讀進(jìn)程流文件數(shù)據(jù)函數(shù)</p><
31、;p> int readData() </p><p><b> { </b></p><p> FILE *fp; </p><p> char sFile[20]; </p><p><b> int i; </b></p><p>
32、 cout<<"請(qǐng)輸入進(jìn)程流文件名(注意:包括后綴名): "; </p><p> cin>>sFile; </p><p> if((fp=fopen(sFile,"r"))==NULL)</p><p><b> { </b></p><p>
33、; cout<<"錯(cuò)誤,文件打不開,請(qǐng)檢查文件名"<<endl; </p><p><b> } </b></p><p><b> else{ </b></p><p> while(!feof(fp))</p><p><b>
34、{ </b></p><p> fscanf(fp,"%s %d %d %d",pcbs[PCBNum].sNum,&pcbs[PCBNum].ArriveTime,&pcbs[PCBNum].RunTime,&pcbs[PCBNum].Privilege); </p><p> PCBNum++; </p><
35、;p> }//while(!feof(fp))</p><p> //輸出所讀入的數(shù)據(jù) </p><p> cout<<endl<<"輸出所讀入的數(shù)據(jù):"<<endl<<endl; </p><p> cout<<"進(jìn)程編號(hào) 進(jìn)程到達(dá)時(shí)間 要求執(zhí)行時(shí)間
36、 優(yōu)先數(shù)"<<endl; </p><p> for(i=0;i<PCBNum-1;i++)</p><p><b> { </b></p><p> cout<<" "<<pcbs[i].sNum<<" "&l
37、t;<pcbs[i].ArriveTime<<" "<<pcbs[i].RunTime<<" "<<pcbs[i].Privilege<<endl; </p><p><b> } </b></p><p> retu
38、rn(1); </p><p> }//if((fp=fopen(sFile,"r"))==NULL)</p><p> return(0); </p><p> }// int readData()</p><p> //重置PCB數(shù)據(jù),以供另一個(gè)算法使用</p><p> void
39、reInitPCB() </p><p><b> { </b></p><p><b> int i; </b></p><p> for(i=0;i<MAXPCB;i++)</p><p><b> { </b></p><p>
40、 pcbs[i].Finished=0; </p><p> pcbs[i].Time=0;</p><p> pcbs[i].WaitTime=0;</p><p> pcbs[i].TurnoverTime=0;</p><p> pcbs[i].WeighTurnTime=0;</p><p><b
41、> } </b></p><p> } //void reInitPCB()</p><p> //先來先服務(wù)調(diào)度算法</p><p> void FCFS() </p><p><b> { </b></p><p><b> int i; </b&
42、gt;</p><p> int Total1; </p><p> float Total2;</p><p> reInitPCB();//重置PCB數(shù)據(jù),以供另一個(gè)算法使用</p><p> //輸出先來先服務(wù)調(diào)度算法執(zhí)行流 </p><p> cout<<endl<<&quo
43、t;---------------------------------------------------------------"<<endl; </p><p> cout<<"先來先服務(wù)調(diào)度算法執(zhí)行流:"<<endl; </p><p> cout<<"進(jìn)程編號(hào) 到達(dá)時(shí)間 等待時(shí)間
44、運(yùn)行時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間"<<endl; </p><p> pcbs[0].TurnoverTime=pcbs[0].RunTime+pcbs[0].ArriveTime;</p><p> pcbs[0].WeighTurnTime=(float)pcbs[0].TurnoverTime/pcbs[0].RunTime;</p>&l
45、t;p> for(i=0;i<PCBNum-1;i++)</p><p><b> { </b></p><p> cout<<" "<<pcbs[i].sNum<<" "<<pcbs[i].ArriveTime<<"
46、 "<<pcbs[i].WaitTime <<" "<<pcbs[i].RunTime<<" "<<pcbs[i].TurnoverTime<<" "<<pcbs[i].WeighTurnTime<<endl; <
47、;/p><p> pcbs[i+1].Time=pcbs[i].Time+pcbs[i].RunTime;</p><p> pcbs[i+1].WaitTime=pcbs[i+1].Time-pcbs[i+1].ArriveTime;</p><p> pcbs[i+1].TurnoverTime=pcbs[i+1].WaitTime+pcbs[i+1].Run
48、Time;</p><p> pcbs[i+1].WeighTurnTime=(float) pcbs[i+1].TurnoverTime/pcbs[i+1].RunTime; </p><p><b> } </b></p><p> Total1 = 0;</p><p> Total2 = 0.0;<
49、;/p><p> for(i=0;i<PCBNum-1;i++)</p><p><b> {</b></p><p> Total1+=pcbs[i].TurnoverTime; </p><p> Total2+=(float) pcbs[i].TurnoverTime/pcbs[i].RunTime;&l
50、t;/p><p><b> } </b></p><p> cout<<" 總周轉(zhuǎn)時(shí)間:"<<Total1<<" 平均周轉(zhuǎn)時(shí)間:"<<Total1/PCBNum<<endl<<" 總帶權(quán)周轉(zhuǎn)時(shí)間:"
51、;<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2/(PCBNum-1)<<endl; </p><p> cout<<endl<<"---------------------------------------------------------------"<<endl
52、; </p><p> } //void FCFS()</p><p> //優(yōu)先數(shù)調(diào)度算法 </p><p> void privilege()</p><p><b> { </b></p><p> int i,j,CurMin; </p><p> i
53、nt Time=0; </p><p> int Total1;</p><p> float Total2;</p><p> int Queue[MAXPCB]; </p><p> int CurPriority=1000; </p><p> reInitPCB();//重置PCB數(shù)據(jù),以供另一個(gè)
54、算法使用</p><p> for(i=0;i<PCBNum-1;i++) //按優(yōu)先數(shù)遞增排序PCB</p><p><b> { </b></p><p> CurPriority=1000; </p><p> for(j=0;j<PCBNum-1;j++)</p><p&
55、gt;<b> {</b></p><p> if((pcbs[j].Finished==0)&&(pcbs[j].Privilege<CurPriority))</p><p><b> { </b></p><p> CurMin=j; </p><p> Cur
56、Priority=pcbs[j].Privilege; </p><p><b> } </b></p><p> } //for(j=0;j<PCBNum;j++)</p><p> Queue[i]=CurMin; </p><p> pcbs[CurMin].Finished=1; </p>
57、;<p> pcbs[CurMin].TurnoverTime=pcbs[CurMin].RunTime+Time;</p><p> pcbs[CurMin].WeighTurnTime=(float)pcbs[CurMin].TurnoverTime/pcbs[CurMin].RunTime;</p><p> Time+=pcbs[CurMin].RunTime;
58、 </p><p> }//for(i=0;i<PCBNum;i++) </p><p> //輸出優(yōu)先數(shù)調(diào)度執(zhí)行流 </p><p> cout<<endl<<"---------------------------------------------------------------"<<e
59、ndl; </p><p> cout<<"優(yōu)先數(shù)調(diào)度執(zhí)行流:"<<endl; </p><p> cout<<"進(jìn)程編號(hào) 優(yōu)先數(shù) 運(yùn)行時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間"<<endl; </p><p> for(i=0;i<PCBNum-1;i++)<
60、/p><p><b> { </b></p><p> cout<<" "<<pcbs[Queue[i]].sNum<<" "<<pcbs[Queue[i]].Privilege<<" "<<pcbs[Que
61、ue[i]].RunTime<<" "<<pcbs[Queue[i]].TurnoverTime<<" "<<pcbs[Queue[i]].WeighTurnTime<<endl; </p><p><b> } </b></p><p>
62、 Total1=0; </p><p> Total2=0.0; </p><p> for(i=0;i<PCBNum-1;i++)</p><p><b> {</b></p><p> Total1+=pcbs[i].TurnoverTime; </p><p> Total
63、2+=(float) pcbs[i].TurnoverTime/pcbs[i].RunTime;</p><p><b> } </b></p><p> cout<<"總周轉(zhuǎn)時(shí)間:"<<Total1<<" 平均周轉(zhuǎn)時(shí)間:"<<Total1/PCBNum&l
64、t;<endl<<" 總帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2/(PCBNum-1)<<endl; </p><p> cout<<endl<<"-----------------------------------
65、----------------------------"<<endl; </p><p> } //void privilege()</p><p> //時(shí)間片輪轉(zhuǎn)調(diào)度算法</p><p> void timer() </p><p><b> { </b></p
66、><p> int i,Num,Flag=1; </p><p> int Round=0; //輪轉(zhuǎn)周期數(shù)</p><p> int Total=0; //總時(shí)間片數(shù)</p><p> reInitPCB(); //重置PCB數(shù)據(jù),以供另一個(gè)算法使用</p><p> cout&
67、lt;<endl<<"---------------------------------------------------------------"<<endl; </p><p> cout<<"時(shí)間片輪轉(zhuǎn)調(diào)度執(zhí)行流(時(shí)間片的長(zhǎng)度為5秒):"<<endl; </p><p> while
68、(Flag==1)</p><p><b> {</b></p><p><b> Flag=0; </b></p><p><b> Num=0; </b></p><p> for(i=0;i<PCBNum-1;i++)//統(tǒng)計(jì)末執(zhí)行完的進(jìn)程數(shù)Num<
69、/p><p><b> {</b></p><p> if(pcbs[i].Finished==0)</p><p><b> { </b></p><p><b> Num++;</b></p><p> } //if(pcbs[i].Finis
70、hed==0)</p><p> } //for(i=0;i<PCBNum;i++)</p><p><b> if(Num>0)</b></p><p><b> {</b></p><p><b> Round++;</b></p><
71、;p> cout<<endl<<""<<Round<<"輪:";</p><p> for(i=0;i<PCBNum-1;i++)</p><p><b> { </b></p><p> if(pcbs[i].Finished==0)
72、</p><p><b> { </b></p><p><b> Flag=1;</b></p><p> cout<<pcbs[i].sNum<<" ";</p><p><b> Total++; </b></p&
73、gt;<p> if(pcbs[i].RunTime<=timeslice*(Round))</p><p><b> { </b></p><p> pcbs[i].Finished=1; </p><p> } //if(pcbs[i].RunTime<=block_time*(Round+1))</
74、p><p> }//if(pcbs[i].Finished==0) </p><p> } //for(i=0;i<PCBNum;i++)</p><p> } //if(Num>0)</p><p> } //while(Flag==1)</p><p> cout<<endl<
75、;<"輪轉(zhuǎn)周期數(shù):"<<Round<<"總時(shí)間片數(shù):"<<Total<<endl;</p><p> cout<<endl<<"---------------------------------------------------------------"<<
76、endl; </p><p> }//void timer() </p><p> void SPF() //短進(jìn)程優(yōu)先調(diào)度算法</p><p><b> { </b></p><p> reInitPCB();</p><p> cout<<endl
77、<<"---------------------------------------------------------------"<<endl; </p><p> cout<<"短進(jìn)程優(yōu)先調(diào)度算法執(zhí)行流:"<<endl; </p><p> cout<<"進(jìn)程編號(hào)
78、到達(dá)時(shí)間 等待時(shí)間 運(yùn)行時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間"<<endl; </p><p><b> int i,j;</b></p><p> for(i=1;i<PCBNum-1;i++)</p><p><b> {</b></p><p> for(j
79、=0;j<PCBNum-i-1;j++)</p><p><b> {</b></p><p> if(pcbs[j].RunTime>pcbs[j+1].RunTime)</p><p><b> {</b></p><p><b> pcb temp;</b&
80、gt;</p><p> strcpy(temp.sNum,pcbs[j+1].sNum);</p><p> temp.ArriveTime=pcbs[j+1].ArriveTime; </p><p> temp.RunTime=pcbs[j+1].RunTime;</p><p> temp.Privilege=pcbs[j+1
81、].Privilege;</p><p> strcpy(pcbs[j+1].sNum,pcbs[j].sNum); </p><p> pcbs[j+1].ArriveTime=pcbs[j].ArriveTime;</p><p> pcbs[j+1].RunTime=pcbs[j].RunTime;</p><p> pcbs[
82、j+1].Privilege=pcbs[j].Privilege;</p><p> strcpy(pcbs[j+1].sNum,temp.sNum);</p><p> pcbs[j].ArriveTime=temp.ArriveTime;</p><p> pcbs[j].RunTime=temp.RunTime;</p><p>
83、 pcbs[j].Privilege=temp.Privilege;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> pcbs[0].Finished=1;</p>&l
84、t;p> pcbs[0].WaitTime=0;</p><p> pcbs[0].TurnoverTime=pcbs[0].RunTime+pcbs[0].ArriveTime;</p><p> pcbs[0].WeighTurnTime=(float)((pcbs[0].TurnoverTime)/(pcbs[0].RunTime));</p><p&
85、gt; int Total1= pcbs[0].WaitTime;</p><p> float Total2= 0.0;</p><p> cout<<" "<<pcbs[0].sNum<<" "<<pcbs[0].ArriveTime<<"
86、 "<<pcbs[0].WaitTime <<" "<<pcbs[0].RunTime<<" "<<pcbs[i].TurnoverTime<<" "<<pcbs[i].WeighTurnTime<<endl;<
87、;/p><p> for(i=1;i<PCBNum-1;i++)</p><p><b> {</b></p><p> pcbs[i].Time+=pcbs[i-1].Time+pcbs[i-1].RunTime;</p><p> pcbs[i].WaitTime=pcbs[i].Time-pcbs[i].
88、ArriveTime;</p><p> pcbs[i].TurnoverTime=pcbs[i].WaitTime+pcbs[i].RunTime;</p><p> Total1+=pcbs[i].TurnoverTime;</p><p> Total2+=pcbs[i].TurnoverTime/pcbs[i].RunTime;</p>
89、<p> pcbs[i].Finished=1;</p><p> cout<<" "<<pcbs[i].sNum<<" "<<pcbs[i].ArriveTime<<" "<<pcbs[i].WaitTime <&l
90、t;" "<<pcbs[i].RunTime<<" "<<pcbs[i].TurnoverTime<<" "<<pcbs[i].WeighTurnTime<<endl;</p><p><b> }</b><
91、;/p><p> cout<<"總周轉(zhuǎn)時(shí)間:"<<Total1<<" 平均周轉(zhuǎn)時(shí)間:"<<Total1/(PCBNum-1)<<"總帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時(shí)間:"<<Total2/(PCBNum-1)<
92、<endl; </p><p> cout<<endl<<"---------------------------------------------------------------"<<endl;</p><p> } //void SPF() </p><p> void interface
93、()//顯示界面信息</p><p><b> { </b></p><p> cout<<endl<<endl; </p><p> cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl;</p><p&
94、gt; cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl; </p><p> cout<<"▓▓ ▓▓ "<<endl;</p><p>
95、 cout<<"▓▓ ▓▓ "<<endl;</p><p> cout<<"▓▓ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ▓▓ "<<endl;</p><p&g
96、t; cout<<"▓▓ ☆ ★ ▓▓ "<<endl; </p><p> cout<<"▓▓ ★ 歡迎進(jìn)入進(jìn)程調(diào)度模擬系統(tǒng) ☆ ▓▓ "<<endl;</p>&l
97、t;p> cout<<"▓▓ ☆ ★ ▓▓ "<<endl;</p><p> cout<<"▓▓ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ▓▓ "<<endl;</p><
98、;p> cout<<"▓▓ ▓▓ "<<endl;</p><p> cout<<"▓▓ ▓▓ "<
99、<endl;</p><p> cout<<"▓▓ ┏━━━━━━━━━━━━━━━━━━┓ ▓▓ "<<endl; </p><p> cout<<"▓▓ ┃ 實(shí)驗(yàn)一:進(jìn)程調(diào)度算法 ┃ ▓▓ "<<endl;
100、</p><p> cout<<"▓▓ ▓▓ "<<endl;</p><p> cout<<"▓▓
101、 ▓▓ "<<endl;</p><p> cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl;</p><p> cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl;</p&g
102、t;<p> cout<<endl<<endl; </p><p> } //void interface()</p><p><b> //主函數(shù) </b></p><p> void main() </p><p><b> { </b></
103、p><p> int Input; </p><p> bool bGoOn;</p><p> char sGoOn[1]; </p><p> interface(); //顯示界面信息</p><p> initPCB(); //PCB初始化函數(shù)</p><p>
104、bGoOn= true;</p><p> strcpy(sGoOn," ");</p><p> if(readData()==1) //標(biāo)志 讀進(jìn)程流文件數(shù)據(jù)函數(shù) 執(zhí)行是否正確</p><p><b> {</b></p><p> while (bGoOn)</p>&
105、lt;p><b> {</b></p><p> cout<<endl<<"請(qǐng)選擇進(jìn)程調(diào)度功能,輸入(1 or 2 or 3 or 4)"<<endl<<endl;</p><p> cout<<"1 先來先服務(wù)(FCFS)算法"<<en
106、dl<<"2 優(yōu)先數(shù)(privilege)調(diào)度算法"<<endl<<"3 時(shí)間片輪轉(zhuǎn)(HRN)調(diào)度算法"<<endl<<"4 短進(jìn)程優(yōu)先(SPF)調(diào)度算法"<<endl;</p><p> cin>>Input;</p><p>
107、 switch(Input)</p><p><b> {</b></p><p><b> case 1:</b></p><p> FCFS(); //先來先服務(wù)算法</p><p><b> break;</b></p><p>&
108、lt;b> case 2:</b></p><p> privilege();//優(yōu)先數(shù)調(diào)度算法</p><p><b> break;</b></p><p><b> case 3:</b></p><p> timer();//時(shí)間片輪轉(zhuǎn)調(diào)度算法</p&
109、gt;<p><b> break;</b></p><p><b> case 4:</b></p><p> SPF(); //短進(jìn)程優(yōu)先調(diào)度算法</p><p><b> break;</b></p><p><b> defa
110、ult:</b></p><p> printf("\n輸入的算法編號(hào)錯(cuò)誤!!\n");</p><p><b> break;</b></p><p> }//switch(Input)</p><p> bGoOn= false;</p><p>
111、 strcpy(sGoOn," ");</p><p> cout<<endl;</p><p> cout<<"要繼續(xù)進(jìn)行進(jìn)程調(diào)度算法模擬嗎?(Y/N)";</p><p> cin>>sGoOn;</p><p> bGoOn=(sGoOn[0]
112、=='y'||sGoOn[0]=='Y');</p><p> }//while bGoOn</p><p> } //if(readData()==1)</p><p> }//void main()</p><p><b> e、運(yùn)行截圖</b></p><
113、p><b> 銀行家算法</b></p><p><b> 1、進(jìn)程死鎖狀態(tài)</b></p><p> 在多道程序系統(tǒng)中,雖然可借助于多個(gè)進(jìn)程的并發(fā)執(zhí)行來改善系統(tǒng)的資源利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險(xiǎn)——死鎖。所謂死鎖(Deadlock),是指多個(gè)進(jìn)程在運(yùn)行過程中因爭(zhēng)奪資源而造成的一種僵局(DeadlyEmbrace),當(dāng)
114、進(jìn)程處于這種僵持狀態(tài)時(shí),若無外力作用,他們都將無法向前推進(jìn)。</p><p> 具有代表性的避免死鎖的算法,是Djikstra的銀行家算法,這是由于該算法能用于系統(tǒng)現(xiàn)金貸款的發(fā)放而得名的。</p><p><b> 2、算法原理及設(shè)計(jì)</b></p><p> ?。?)銀行家算法思想:對(duì)用戶提出的請(qǐng)求進(jìn)行合法性檢查,即檢查請(qǐng)求的是不大于需要
115、的,是否不大于可利用的。若請(qǐng)求合法,則進(jìn)行試分配。最后對(duì)試分配后的狀態(tài)調(diào)用安全性檢查算法進(jìn)行安全性檢查。若安全,則分配,否則,不分配,恢復(fù)原來狀態(tài),拒絕申請(qǐng)。</p><p> ?。?)銀行家算法數(shù)據(jù)結(jié)構(gòu):</p><p><b> ?。?)銀行家算法</b></p><p> 進(jìn)程i發(fā)出請(qǐng)求申請(qǐng)k個(gè)j資源,Request i[j]=k &l
116、t;/p><p> a、檢查申請(qǐng)量是否不大于需求量:Request i[j]<=need[i,j],若條件不符重新輸入,不允許申請(qǐng)大于需求量。</p><p> b、檢查申請(qǐng)量是否小于系統(tǒng)中的可利用資源數(shù)量:Request i[j]<=available[i,j],若條件不符就申請(qǐng)失敗,阻塞該進(jìn)程,用goto語(yǔ)句跳轉(zhuǎn)到重新申請(qǐng)資源。</p><p>
117、c、若以上兩個(gè)條件都滿足,則系統(tǒng)試探著將資源分配給申請(qǐng)的進(jìn)程,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:</p><p> Available[i,j]= Available[i,j]- Request i[j];</p><p> Allocation[i][j]= Allocation[i][j]+ Request i[j];</p><p> need[i][j]=
118、need[i][j]- Request i[j];</p><p> d、試分配后,執(zhí)行安全性檢查,調(diào)用safe()函數(shù)檢查此次資源分配后系統(tǒng)是否處于安全狀態(tài)。若安全,才正式將資源分配給進(jìn)程;否則本次試探分配作廢,恢復(fù)原來的資源分配狀態(tài),讓該進(jìn)程等待。</p><p> e、用do{…}while 循環(huán)語(yǔ)句實(shí)現(xiàn)輸入字符y/n判斷是否繼續(xù)進(jìn)行資源申請(qǐng)。</p><p&
119、gt; ?。?)安全性檢查算法</p><p><b> a、設(shè)置兩個(gè)向量:</b></p><p> 工作向量Work,它表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類資源數(shù)目,在執(zhí)行安全性算法開始時(shí),Work= Available。</p><p> Finish,它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成。開始時(shí)先做Finish[i
120、]=0;當(dāng)有足夠的資源分配給進(jìn)程時(shí),再令Finish[i]=1。</p><p> b、在進(jìn)程中查找符合以下條件的進(jìn)程:</p><p> 條件1:Finish[i]=0;</p><p> 條件2:need[i][j]<=Work[j]</p><p> 若找到,則執(zhí)行步驟(3)否則,執(zhí)行步驟(4)</p>&l
121、t;p> c、當(dāng)進(jìn)程獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:</p><p> Work[j]= Work[j]+ Allocation[i][j];</p><p> Finish[i]=1;</p><p> goto step 2;</p><p> d、如果所有的Finish[i]=1都滿足
122、,則表示系統(tǒng)處于安全狀態(tài),否則,處于不安全狀態(tài)。</p><p> (5)操作系統(tǒng)銀行家算法流程圖:</p><p><b> 3、代碼設(shè)計(jì)</b></p><p> #include <iostream.h></p><p> #include <vector> </p>
123、<p> #include <iomanip></p><p> #include <stdlib.h></p><p> using namespace std; </p><p> #define TRUE 1 //定義 TRUE =1</p><p> #define FALS
124、E 0 //定義 FLASE=0</p><p> void bank(vector<int>,vector<vector<int> >,vector<vector<int> >,int ,int ); //聲明bank(應(yīng)行家算法)</p><p> in
125、t safe(vector<int> Available,vector<vector<int> > Need,vector<vector<int> > Allocation,int n,int m);//聲明safe()安全性算法</p><p> void init();</p><p> /***************
126、**********************主函數(shù)main()**************************************************************/</p><p> void main()</p><p><b> {</b></p><p><b> init();</b>
127、</p><p> int safe(vector<int> Available,vector<vector<int> > Need,vector<vector<int> > Allocation,int n,int m);</p><p><b> }</b></p><p>
128、 /**************************************初始化函數(shù)init()*********************************************************/</p><p> void init()</p><p><b> {</b></p><p> int m; //m
129、資源類數(shù)</p><p> int n; //進(jìn)程數(shù)</p><p> system("color 0B");</p><p> cout<<endl<<endl; </p><p> cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
130、"<<endl;</p><p> cout<<"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ "<<endl; </p><p> cout<<"▓▓ ▓▓ &qu
131、ot;<<endl;</p><p> cout<<"▓▓ ▓▓ "<<endl;</p><p> cout<<"▓▓ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ▓▓ &
132、quot;<<endl;</p><p> cout<<"▓▓ ☆ ★ ▓▓ "<<endl; </p><p> cout<<"▓▓ ★ 歡迎進(jìn)入銀行家算法調(diào)度系統(tǒng) ☆
133、▓▓ "<<endl;</p><p> cout<<"▓▓ ☆ ★ ▓▓ "<<endl;</p><p> cout<<"▓▓ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ▓
134、▓ "<<endl;</p><p> cout<<"▓▓ ▓▓ "<<endl;</p><p> cout<<"▓▓
135、 ▓▓ "<<endl;</p><p> cout<<"▓▓ ┏━━━━━━━━━━━━━━━━━━┓ ▓▓ "<<endl; </p><p> cout<<"▓▓ ┃ 實(shí)驗(yàn)二:銀行家算法
136、 ┃ ▓▓ "<<endl; </p><p> cout<<"▓▓ ┃ 作者:學(xué)習(xí) ┃ ▓▓ "<<endl; </p><p> cout<<"▓▓ ┃ 2012.12.16
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)
- 操作系統(tǒng)課程設(shè)計(jì)-銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)(銀行家算法設(shè)計(jì))
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法 (3)
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法 (2)
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法 (2)
- 操作系統(tǒng)課程設(shè)計(jì)---模擬銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告—銀行家算法
- 操作系統(tǒng)原理課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告—銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)-模擬銀行家算法-課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---模擬實(shí)現(xiàn)銀行家算法
評(píng)論
0/150
提交評(píng)論