操作系統(tǒng)課程設計進程_銀行家_頁面調(diào)度_第1頁
操作系統(tǒng)課程設計進程_銀行家_頁面調(diào)度_第2頁
操作系統(tǒng)課程設計進程_銀行家_頁面調(diào)度_第3頁
操作系統(tǒng)課程設計進程_銀行家_頁面調(diào)度_第4頁
操作系統(tǒng)課程設計進程_銀行家_頁面調(diào)度_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、設計題目 操作系統(tǒng)課程設計 學生姓名 李飛吾 學 號 20106637 專業(yè)班級 信息計10-2 班 指導教師 2012年 12 月 22 日設 計題 目共3題如下描述成績課 程 設 計 主 要 內(nèi) 容首先感謝老師和同學的指導1、設計目的:操作系統(tǒng)原理課程設計是信息計算科學專業(yè)實踐性環(huán)節(jié)之一,是對學習完操 作系統(tǒng)原理 課程后進行的一次較全面的綜合訓練。 其目的在于加深對操作系統(tǒng) 的理論、 方法和基礎知識的理解, 掌握操作系統(tǒng)結(jié)構(gòu)、 實現(xiàn)機理和各種典型算法, 系統(tǒng)地了解操作系統(tǒng)的設計和實現(xiàn)思路,培養(yǎng)學系統(tǒng)設計能力,&

2、#160;并了解操作 系統(tǒng)的發(fā)展動向和趨勢。對以后工作或者進一步研究都有促進作用。2、設計題目:進程調(diào)度算法銀行家算法-頁面調(diào)度算法3、設計總結(jié):a、知識總結(jié)有效性一直是操作系統(tǒng)所追求的目標之一。操作系統(tǒng)的有效性包含以下兩個方面:1、提高資源利用率;2、提高系統(tǒng)吞吐率。引入進程管理,處理機調(diào)度,存儲器管理,設備管理,文件管理等等機制,都是為了實現(xiàn)該特性的。而實現(xiàn)各種機制卻有著不同算法,算法的優(yōu)劣就顯得尤為重要了。b、實踐感悟由于時間倉促,此次課程設計并未投入大量時間,依然存在許多不足。但是通過對算法的進一步理解,加以程序?qū)崿F(xiàn),讓我對本專業(yè)的學習興趣更加濃厚了。課程設計時,遇到了一些問

3、題,通過與老師及同學的交流,和網(wǎng)上查閱資料,學到了更多的知識。在此對老師和同學表示感謝。指 導 老 師 評 語建議:從學生的工作態(tài)度、工作量、設計(論文的)創(chuàng)造性、學術性、使用性及書面表達能力等方面給出評價。 簽名: 20 年 月 日 目錄一、 算法設計概述1、設計背景-12、運行環(huán)境-1二、進程調(diào)度算法1、進程并發(fā)執(zhí)行-12、算法原理及設計-23、代碼設計-3三、銀行家算法1、進程死鎖狀態(tài)-132、算法原理及設計-133、代碼設計-16四、頁面調(diào)度算法1、頁式虛擬存儲-202、算法原理及設計-203、代碼設計-21五、課程設計總結(jié) 1、知識總結(jié)-26 2、實踐感悟-26一、 算法設計概述1、

4、設計背景操作系統(tǒng)是管理計算機硬件資源,控制其他程序運行并為用戶提供交互操作界面的系統(tǒng)軟件的集合。操作系統(tǒng)是計算機系統(tǒng)的關鍵組成部分,負責管理與配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序、控制輸入與輸出設備、操作網(wǎng)絡與管理文件系統(tǒng)等基本任務。操作系統(tǒng)作為系統(tǒng)與用戶之間的接口,極大方便了用戶使用操作系統(tǒng),同時也推動了計算機科學的發(fā)展。操作系統(tǒng)原理課程設計是信息計算科學專業(yè)實踐性環(huán)節(jié)之一,是對學習完操 作系統(tǒng)原理 課程后進行的一次較全面的綜合訓練。 其目的在于加深對操作系統(tǒng) 的理論、 方法和基礎知識的理解, 掌握操作系統(tǒng)結(jié)構(gòu)、 實現(xiàn)機理

5、和各種典型算法, 系統(tǒng)地了解操作系統(tǒng)的設計和實現(xiàn)思路,培養(yǎng)學系統(tǒng)設計能力, 并了解操作 系統(tǒng)的發(fā)展動向和趨勢。對以后工作或者進一步研究都有促進作用。2、設計環(huán)境開發(fā)環(huán)境:Visual C+ 6.0運行環(huán)境:Windows 7 / XP二、 進程調(diào)度算法1、進程的并發(fā)執(zhí)行并發(fā)性是操作系統(tǒng)的重要特征在多道程序環(huán)境下,并發(fā)性是指在一段時間內(nèi)宏觀上有多個程序在同時運行,但在單處理機系統(tǒng)中,每一時刻卻只能有一道程序執(zhí)行,故在微觀上這些程序只能是分時地交替運行。倘若在計算機系統(tǒng)有多個處理機,則這些可以并發(fā)執(zhí)行的程序便可以被分配到多個處理機上,實現(xiàn)執(zhí)行,即利用每個處理機來處理一

6、個可以并發(fā)執(zhí)行的程序,這樣,多個程序便可同時執(zhí)行。程序是靜態(tài)實體,進程是動態(tài)的,通過對進程調(diào)度實現(xiàn),實現(xiàn)程序運行。調(diào)度的實質(zhì)是系統(tǒng)按照某種特定的分配策略來分配資源。進程調(diào)度的目的是分配CPU資源。由于進程調(diào)度程序執(zhí)行的頻率很高,因此調(diào)度算法的好壞將直接影響到操作系統(tǒng)的性能。本實驗的目的是模擬實現(xiàn)幾種常見的進程調(diào)度算法,通過對幾組進程分別使用不同的調(diào)度算法,計算進程的平均周轉(zhuǎn)時間和平均帶權(quán)周轉(zhuǎn)時間,比較各種算法的性能優(yōu)劣。2、算法原理及設計(1)進程調(diào)度算法 進程調(diào)度算法包括先來先服務調(diào)度算法、優(yōu)先數(shù)調(diào)度算法、時間片論轉(zhuǎn)算法和分級調(diào)度算法等4種。本實驗包括3種算法,有興趣的讀者可以在完成這些算法

7、的基礎上實現(xiàn)第四種算法。下面對前3種算法作一一簡單介紹。<1> 先來先服務(FCFS)調(diào)度算法本算法在進行調(diào)度時,總是選擇一個最先進入進程就緒隊列的進程,把處理器分配給它,使之開始運行。該進程一直運行到完成或發(fā)生阻塞事件時,才放棄處理器。<2> 優(yōu)先數(shù)調(diào)度算法對每個進程確定一個優(yōu)先數(shù),進程調(diào)度總是讓具有最高優(yōu)先數(shù)的進程先使用處理器。如果就緒隊列中出現(xiàn)優(yōu)先數(shù)相同的進程,則對這些有相同優(yōu)先數(shù)的進程采用先來先服務算法進行調(diào)度。對于占用處理器的進程,系統(tǒng)可以使用“搶占式”或“非搶占式”的策略?!胺菗屨际健敝高M程一旦占用處理器,除非自己愿意,否則操作系統(tǒng)不能將處理器強行奪走,即使

8、該進程的優(yōu)先數(shù)已經(jīng)小于就緒隊列中的某個進程?!皳屨际健眲t相反,一旦就緒隊列中的某個進程優(yōu)先數(shù)大于正在執(zhí)行的進程,立刻進行進程切換。進程的優(yōu)先數(shù)可以發(fā)生變化。本實驗的基本要求是實現(xiàn)固定優(yōu)先數(shù)的調(diào)度算法,讀者可以在這個基礎上添加動態(tài)優(yōu)先數(shù)功能。<3> 時間片輪轉(zhuǎn)調(diào)度算法在需要保證響應時間的場合通常采用時間片輪轉(zhuǎn)算法來分配處理器。本算法將所有的就緒進程按先來先服務的原則排成一個隊列,每次調(diào)度時把CPU分配給隊首進程,令其執(zhí)行一個時間片。時間片用完,調(diào)度程序自動停止該進程的執(zhí)行,將它放到進程就緒隊列的末尾,等待下一次執(zhí)行,然后將CPU分配給就緒隊列中新的隊首進程,也讓它執(zhí)行一個時間片。重復

9、這個過程,直到所有的進程執(zhí)行完畢。(2)衡量算法性能的參數(shù)下面引入兩個衡量調(diào)度算法性能的參數(shù)。平均周轉(zhuǎn)時間:平均帶權(quán)周轉(zhuǎn)時間:其中:n為進程數(shù)目Ti為第i個進程的周轉(zhuǎn)時間,即進程從開始運行到結(jié)束的時間Tsi為第i個進程要求執(zhí)行的時間,即需要在CPU上的執(zhí)行時間。3、代碼設計(1)建立進程控制塊進程控制塊至少應該包括:進程名稱進程需要執(zhí)行時間進入就緒隊列時間進程執(zhí)行結(jié)束時間進程控制塊代碼typedef struct node char sNum4; /進程編號int ArriveTime;/進程到達時間int RunTime; /進程要求執(zhí)行的時間int Privilege; /進程的優(yōu)先數(shù)in

10、t Finished; /標志進程是否執(zhí)行完成int Time; /進程等待時間的借助變量int WaitTime; /進程的等待時間int TurnoverTime; /進程的周轉(zhuǎn)時間float WeighTurnTime; /進程帶權(quán)周轉(zhuǎn)時間pcb; 進程號到達時間要求執(zhí)行時間00411352210335469572169357112381242913110147112051223313242214253115261(2)就緒進程序列如上右表所示3、代碼設計#include<stdio.h> #include<string.h> #include<iostre

11、am.h> const int timeslice=5; /定義時間片的長度 const int MAXPCB=100; /定義最大進程數(shù) /定義進程結(jié)構(gòu)體 typedef struct node char sNum4; /進程編號int ArriveTime; /進程到達時間int RunTime; /進程要求執(zhí)行的時間int Privilege; /進程的優(yōu)先數(shù)int Finished; /標志進程是否執(zhí)行完成int Time; /求進程的等待時間的借助變量int WaitTime; /進程的等待時間int TurnoverTime; /進程的周轉(zhuǎn)時間float WeighTurnT

12、ime; /進程的帶權(quán)周轉(zhuǎn)時間pcb; pcb pcbsMAXPCB; int PCBNum; /進程數(shù) /PCB初始化函數(shù) void initPCB() int i; for(i=0;i<MAXPCB;i+) strcpy(pcbsi.sNum,""); pcbsi.ArriveTime=0; pcbsi.RunTime=0; pcbsi.Privilege=0; pcbsi.Finished=0;pcbsi.Time=0; pcbsi.WaitTime=0; pcbsi.TurnoverTime=0; pcbsi.WeighTurnTime=0; /for(i=0

13、;i<MAXPCB;i+)PCBNum=0; /void initPCB() /讀進程流文件數(shù)據(jù)函數(shù)int readData() FILE *fp; char sFile20; int i; cout<<"請輸入進程流文件名(注意:包括后綴名): " cin>>sFile; if(fp=fopen(sFile,"r")=NULL) cout<<"錯誤,文件打不開,請檢查文件名"<<endl; else while(!feof(fp) fscanf(fp,"%s %d %d

14、 %d",pcbsPCBNum.sNum,&pcbsPCBNum.ArriveTime,&pcbsPCBNum.RunTime,&pcbsPCBNum.Privilege); PCBNum+; /while(!feof(fp)/輸出所讀入的數(shù)據(jù) cout<<endl<<"輸出所讀入的數(shù)據(jù):"<<endl<<endl; cout<<"進程編號 進程到達時間 要求執(zhí)行時間 優(yōu)先數(shù)"<<endl; for(i=0;i<PCBNum-1;i+) cou

15、t<<" "<<pcbsi.sNum<<" "<<pcbsi.ArriveTime<<" "<<pcbsi.RunTime<<" "<<pcbsi.Privilege<<endl; return(1); /if(fp=fopen(sFile,"r")=NULL)return(0); / int readData()/重置PCB數(shù)據(jù),以供另一個算法使用void reInitPCB() int

16、 i; for(i=0;i<MAXPCB;i+) pcbsi.Finished=0; pcbsi.Time=0;pcbsi.WaitTime=0;pcbsi.TurnoverTime=0;pcbsi.WeighTurnTime=0; /void reInitPCB()/先來先服務調(diào)度算法void FCFS() int i; int Total1; float Total2;reInitPCB();/重置PCB數(shù)據(jù),以供另一個算法使用/輸出先來先服務調(diào)度算法執(zhí)行流 cout<<endl<<"-"<<endl; cout<<

17、"先來先服務調(diào)度算法執(zhí)行流:"<<endl; cout<<"進程編號 到達時間 等待時間 運行時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間"<<endl; pcbs0.TurnoverTime=pcbs0.RunTime+pcbs0.ArriveTime; pcbs0.WeighTurnTime=(float)pcbs0.TurnoverTime/pcbs0.RunTime;for(i=0;i<PCBNum-1;i+) cout<<" "<<pcbsi.sNum<<&quo

18、t; "<<pcbsi.ArriveTime<<" "<<pcbsi.WaitTime <<" "<<pcbsi.RunTime<<" "<<pcbsi.TurnoverTime<<" "<<pcbsi.WeighTurnTime<<endl; pcbsi+1.Time=pcbsi.Time+pcbsi.RunTime;pcbsi+1.WaitTime=pcbsi+1.Time-pcbs

19、i+1.ArriveTime; pcbsi+1.TurnoverTime=pcbsi+1.WaitTime+pcbsi+1.RunTime; pcbsi+1.WeighTurnTime=(float) pcbsi+1.TurnoverTime/pcbsi+1.RunTime; Total1 = 0;Total2 = 0.0;for(i=0;i<PCBNum-1;i+)Total1+=pcbsi.TurnoverTime; Total2+=(float) pcbsi.TurnoverTime/pcbsi.RunTime; cout<<" 總周轉(zhuǎn)時間:"<

20、;<Total1<<" 平均周轉(zhuǎn)時間:"<<Total1/PCBNum<<endl<<" 總帶權(quán)周轉(zhuǎn)時間:"<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時間:"<<Total2/(PCBNum-1)<<endl; cout<<endl<<"-"<<endl; /void FCFS()/優(yōu)先數(shù)調(diào)度算法 void privilege() int i,j,CurMin; int Time=0;

21、 int Total1;float Total2;int QueueMAXPCB; int CurPriority=1000; reInitPCB();/重置PCB數(shù)據(jù),以供另一個算法使用for(i=0;i<PCBNum-1;i+) /按優(yōu)先數(shù)遞增排序PCB CurPriority=1000; for(j=0;j<PCBNum-1;j+)if(pcbsj.Finished=0)&&(pcbsj.Privilege<CurPriority) CurMin=j; CurPriority=pcbsj.Privilege; /for(j=0;j<PCBNum;j

22、+)Queuei=CurMin; pcbsCurMin.Finished=1; pcbsCurMin.TurnoverTime=pcbsCurMin.RunTime+Time;pcbsCurMin.WeighTurnTime=(float)pcbsCurMin.TurnoverTime/pcbsCurMin.RunTime;Time+=pcbsCurMin.RunTime; /for(i=0;i<PCBNum;i+) /輸出優(yōu)先數(shù)調(diào)度執(zhí)行流 cout<<endl<<"-"<<endl; cout<<"優(yōu)先數(shù)調(diào)度

23、執(zhí)行流:"<<endl; cout<<"進程編號 優(yōu)先數(shù) 運行時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間"<<endl; for(i=0;i<PCBNum-1;i+) cout<<" "<<pcbsQueuei.sNum<<" "<<pcbsQueuei.Privilege<<" "<<pcbsQueuei.RunTime<<" "<<pcbsQueuei.Tur

24、noverTime<<" "<<pcbsQueuei.WeighTurnTime<<endl; Total1=0; Total2=0.0; for(i=0;i<PCBNum-1;i+)Total1+=pcbsi.TurnoverTime; Total2+=(float) pcbsi.TurnoverTime/pcbsi.RunTime; cout<<"總周轉(zhuǎn)時間:"<<Total1<<" 平均周轉(zhuǎn)時間:"<<Total1/PCBNum<&l

25、t;endl<<" 總帶權(quán)周轉(zhuǎn)時間:"<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時間:"<<Total2/(PCBNum-1)<<endl; cout<<endl<<"-"<<endl; /void privilege()/時間片輪轉(zhuǎn)調(diào)度算法void timer() int i,Num,Flag=1; int Round=0; /輪轉(zhuǎn)周期數(shù)int Total=0; /總時間片數(shù)reInitPCB(); /重置PCB數(shù)據(jù),以供另一個算法使用cout

26、<<endl<<"-"<<endl; cout<<"時間片輪轉(zhuǎn)調(diào)度執(zhí)行流(時間片的長度為5秒):"<<endl; while(Flag=1)Flag=0; Num=0; for(i=0;i<PCBNum-1;i+)/統(tǒng)計末執(zhí)行完的進程數(shù)Numif(pcbsi.Finished=0) Num+; /if(pcbsi.Finished=0) /for(i=0;i<PCBNum;i+)if(Num>0)Round+;cout<<endl<<"&quo

27、t;<<Round<<"輪:"for(i=0;i<PCBNum-1;i+) if(pcbsi.Finished=0) Flag=1;cout<<pcbsi.sNum<<" "Total+; if(pcbsi.RunTime<=timeslice*(Round) pcbsi.Finished=1; /if(pcbsi.RunTime<=block_time*(Round+1)/if(pcbsi.Finished=0) /for(i=0;i<PCBNum;i+) /if(Num>0

28、) /while(Flag=1)cout<<endl<<"輪轉(zhuǎn)周期數(shù):"<<Round<<"總時間片數(shù):"<<Total<<endl;cout<<endl<<"-"<<endl; /void timer() void SPF() /短進程優(yōu)先調(diào)度算法 reInitPCB();cout<<endl<<"-"<<endl; cout<<"短進程優(yōu)先調(diào)度算法

29、執(zhí)行流:"<<endl; cout<<"進程編號 到達時間 等待時間 運行時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間"<<endl; int i,j;for(i=1;i<PCBNum-1;i+)for(j=0;j<PCBNum-i-1;j+) if(pcbsj.RunTime>pcbsj+1.RunTime) pcb temp; strcpy(temp.sNum,pcbsj+1.sNum); temp.ArriveTime=pcbsj+1.ArriveTime; temp.RunTime=pcbsj+1.RunTime; t

30、emp.Privilege=pcbsj+1.Privilege; strcpy(pcbsj+1.sNum,pcbsj.sNum); pcbsj+1.ArriveTime=pcbsj.ArriveTime; pcbsj+1.RunTime=pcbsj.RunTime; pcbsj+1.Privilege=pcbsj.Privilege; strcpy(pcbsj+1.sNum,temp.sNum); pcbsj.ArriveTime=temp.ArriveTime; pcbsj.RunTime=temp.RunTime; pcbsj.Privilege=temp.Privilege; pcbs0

31、.Finished=1; pcbs0.WaitTime=0; pcbs0.TurnoverTime=pcbs0.RunTime+pcbs0.ArriveTime; pcbs0.WeighTurnTime=(float)(pcbs0.TurnoverTime)/(pcbs0.RunTime); int Total1= pcbs0.WaitTime; float Total2= 0.0; cout<<" "<<pcbs0.sNum<<" "<<pcbs0.ArriveTime<<" &qu

32、ot;<<pcbs0.WaitTime <<" "<<pcbs0.RunTime<<" "<<pcbsi.TurnoverTime<<" "<<pcbsi.WeighTurnTime<<endl;for(i=1;i<PCBNum-1;i+) pcbsi.Time+=pcbsi-1.Time+pcbsi-1.RunTime; pcbsi.WaitTime=pcbsi.Time-pcbsi.ArriveTime; pcbsi.Turnov

33、erTime=pcbsi.WaitTime+pcbsi.RunTime; Total1+=pcbsi.TurnoverTime; Total2+=pcbsi.TurnoverTime/pcbsi.RunTime; pcbsi.Finished=1;cout<<" "<<pcbsi.sNum<<" "<<pcbsi.ArriveTime<<" "<<pcbsi.WaitTime <<" "<<pcbsi.RunTime&l

34、t;<" "<<pcbsi.TurnoverTime<<" "<<pcbsi.WeighTurnTime<<endl;cout<<"總周轉(zhuǎn)時間:"<<Total1<<" 平均周轉(zhuǎn)時間:"<<Total1/(PCBNum-1)<<"總帶權(quán)周轉(zhuǎn)時間:"<<Total2<<" 平均帶權(quán)周轉(zhuǎn)時間:"<<Total2/(PCBNum-1)

35、<<endl; cout<<endl<<"-"<<endl; /void SPF() void interface()/顯示界面信息 cout<<endl<<endl; cout<<" "<<endl;cout<<" "<<endl; cout<<" "<<endl; cout<<" "<<endl; cout<<&q

36、uot; "<<endl;cout<<" "<<endl; cout<<" 歡迎進入進程調(diào)度模擬系統(tǒng) "<<endl;cout<<" "<<endl; cout<<" "<<endl; cout<<" "<<endl; cout<<" "<<endl;cout<<" "<&l

37、t;endl; cout<<" 實驗一:進程調(diào)度算法 "<<endl; cout<<" "<<endl; cout<<" "<<endl; cout<<" "<<endl;cout<<" "<<endl;cout<<endl<<endl; /void interface()/主函數(shù) void main() int Input; bool bGoOn;ch

38、ar sGoOn1; interface(); /顯示界面信息initPCB(); /PCB初始化函數(shù)bGoOn= true;strcpy(sGoOn," ");if(readData()=1) /標志 讀進程流文件數(shù)據(jù)函數(shù) 執(zhí)行是否正確while (bGoOn)cout<<endl<<"請選擇進程調(diào)度功能,輸入(1 or 2 or 3 or 4)"<<endl<<endl;cout<<"1 先來先服務(FCFS)算法"<<endl<<"2

39、優(yōu)先數(shù)(privilege)調(diào)度算法"<<endl<<"3 時間片輪轉(zhuǎn)(HRN)調(diào)度算法"<<endl<<"4 短進程優(yōu)先(SPF)調(diào)度算法"<<endl;cin>>Input;switch(Input)case 1:FCFS(); /先來先服務算法break;case 2:privilege();/優(yōu)先數(shù)調(diào)度算法break;case 3:timer();/時間片輪轉(zhuǎn)調(diào)度算法break;case 4:SPF(); /短進程優(yōu)先調(diào)度算法break;default:printf

40、("n輸入的算法編號錯誤!n");break;/switch(Input)bGoOn= false;strcpy(sGoOn," ");cout<<endl;cout<<"要繼續(xù)進行進程調(diào)度算法模擬嗎?(Y/N)"cin>>sGoOn;bGoOn=(sGoOn0='y'|sGoOn0='Y');/while bGoOn /if(readData()=1)/void main()e、運行截圖三、 銀行家算法1、進程死鎖狀態(tài) 在多道程序系統(tǒng)中,雖然可借助于多個進程的并發(fā)執(zhí)

41、行來改善系統(tǒng)的資源利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險死鎖。所謂死鎖(Deadlock),是指多個進程在運行過程中因爭奪資源而造成的一種僵局(DeadlyEmbrace),當進程處于這種僵持狀態(tài)時,若無外力作用,他們都將無法向前推進。 具有代表性的避免死鎖的算法,是Djikstra的銀行家算法,這是由于該算法能用于系統(tǒng)現(xiàn)金貸款的發(fā)放而得名的。2、算法原理及設計(1)銀行家算法思想:對用戶提出的請求進行合法性檢查,即檢查請求的是不大于需要的,是否不大于可利用的。若請求合法,則進行試分配。最后對試分配后的狀態(tài)調(diào)用安全性檢查算法進行安全性檢查。若安全,則分配,否則,不分配,恢復原來狀態(tài),拒絕

42、申請。(2)銀行家算法數(shù)據(jù)結(jié)構(gòu):可利用資源向量int Availablej j為資源的種類最大需求矩陣int Maxij i為進程的數(shù)量分配矩陣int Allocationij需求矩陣int needij= Maxij- Allocationij申請各類資源數(shù)量int Request ij i進程申請j資源的數(shù)量工作向量int Workx int Finishy(3)銀行家算法進程i發(fā)出請求申請k個j資源,Request ij=k a、檢查申請量是否不大于需求量:Request ij<=needi,j,若條件不符重新輸入,不允許申請大于需求量。b、檢查申請量是否小于系統(tǒng)中的可利用資源數(shù)量

43、:Request ij<=availablei,j,若條件不符就申請失敗,阻塞該進程,用goto語句跳轉(zhuǎn)到重新申請資源。c、若以上兩個條件都滿足,則系統(tǒng)試探著將資源分配給申請的進程,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:Availablei,j= Availablei,j- Request ij;Allocationij= Allocationij+ Request ij;needij= needij- Request ij;d、試分配后,執(zhí)行安全性檢查,調(diào)用safe()函數(shù)檢查此次資源分配后系統(tǒng)是否處于安全狀態(tài)。若安全,才正式將資源分配給進程;否則本次試探分配作廢,恢復原來的資源分配狀態(tài),讓該進

44、程等待。e、用dowhile 循環(huán)語句實現(xiàn)輸入字符y/n判斷是否繼續(xù)進行資源申請。(4)安全性檢查算法a、設置兩個向量:工作向量Work,它表示系統(tǒng)可提供給進程繼續(xù)運行所需的各類資源數(shù)目,在執(zhí)行安全性算法開始時,Work= Available。Finish,它表示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成。開始時先做Finishi=0;當有足夠的資源分配給進程時,再令Finishi=1。b、在進程中查找符合以下條件的進程:條件1:Finishi=0;條件2:needij<=Workj若找到,則執(zhí)行步驟(3)否則,執(zhí)行步驟(4)c、當進程獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它

45、的資源,故應執(zhí)行:Workj= Workj+ Allocationij;Finishi=1;goto step 2;d、如果所有的Finishi=1都滿足,則表示系統(tǒng)處于安全狀態(tài),否則,處于不安全狀態(tài)。初始化函數(shù)chushihua()開始(5)操作系統(tǒng)銀行家算法流程圖:輸入各進程當前已分配的資源數(shù)輸入各進程對各類資源的最大需求輸出提示:輸入有誤,請重新輸入初始化函數(shù)chushihua()結(jié)束,銀行家函數(shù)Bank()提出請求REQUESTiError;REQUESTi<=NEEDi輸出提示:你的請求被拒!REQUESTi<=AVAILABLEiError;Safe();AVAILAB

46、LEi-=REQUESTi;ALLOCATIONi-=REQUESTi;NEEDi+=REQUESTi;輸出提示:同意分配請求是否進行再次分配退出程序,銀行家算法Bank()結(jié)束;Work=AVAILABLE;FINISH=false;安全性算法Safe()開始輸出提示:系統(tǒng)是不安全的NEEDi<=Work&&FINISHi=false;Work+=ALLOCATIONi;FINISHi=ture;安全算法safe()結(jié)束安全,輸出安全序列Return ture;3、代碼設計#include <iostream.h>#include <vector>

47、; #include <iomanip>#include <stdlib.h>using namespace std; #define TRUE 1 /定義 TRUE =1#define FALSE 0 /定義 FLASE=0void bank(vector<int>,vector<vector<int> >,vector<vector<int> >,int ,int ); /聲明bank(應行家算法)int safe(vector<int> Available,vector<vector&l

48、t;int> > Need,vector<vector<int> > Allocation,int n,int m);/聲明safe()安全性算法void init();/*主函數(shù)main()*/void main()init();int safe(vector<int> Available,vector<vector<int> > Need,vector<vector<int> > Allocation,int n,int m);/*初始化函數(shù)init()*/void init()int m; /m資源類數(shù)int n; /進程數(shù)syste

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論