銀行家算法實現(xiàn)_第1頁
銀行家算法實現(xiàn)_第2頁
銀行家算法實現(xiàn)_第3頁
銀行家算法實現(xiàn)_第4頁
銀行家算法實現(xiàn)_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、西安文理學(xué)院軟件學(xué)院計算機操作系統(tǒng)設(shè)計題目: 銀行家算法的實現(xiàn) 學(xué)生學(xué)號: 專業(yè)班級: 學(xué)生姓名: 學(xué)生成績: 目 錄1摘要32設(shè)計思想43系統(tǒng)分析43.1 整個銀行家算法的思路43.2 算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C+語言說明43.2.1可利用資源向量43.2.2最大需求矩陣43.2.3已分配矩陣43.2.4還需求矩陣53.2.5申請各類資源數(shù)量53.3 銀行家算法主程序53.3.1系統(tǒng)初始化53.3.2安全性算法53.3.3檢索用戶53.3.4檢查用戶請求53.3.5進行資源的預(yù)分配53.3.6系統(tǒng)調(diào)用安全性檢查算法53.4 安全性檢查算法53.4.1設(shè)置兩個臨時變量53.4.2在進程中查找符

2、合以下條件的進程63.4.3如果查找成功則存儲安全序列并進行資源的模擬回收64函數(shù)調(diào)用關(guān)系74.1 程序流程圖74.2 程序模塊劃分84.2.1字符判斷模塊84.2.2程序初始化模塊84.2.3當(dāng)前安全性檢查模塊84.2.4銀行家算法模塊84.2.5顯示分配模塊85.數(shù)據(jù)結(jié)構(gòu)分析85.1定義全局變量85.2函數(shù)聲明95.3主函數(shù)結(jié)構(gòu)95.4各模塊含義105.4.1整個銀行家算法的思路105.4.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C語言說明105.4.3銀行家算法105.4.4安全性檢查算法106. 程序測試結(jié)果127心得體會148主要參考文獻15附錄:部分源程序代碼161摘要銀行家算法是一種最有代表性

3、的避免死鎖的算法,在避免死鎖方法中允許進程動態(tài)的申請資源,但系統(tǒng)在進行資源分配之前,應(yīng)先計算此次分配資源的安全性,若分配不會導(dǎo)致系統(tǒng)進入不安全狀態(tài),則分配,否則等待。為實現(xiàn)銀行家算法,系統(tǒng)必須設(shè)置若干數(shù)據(jù)結(jié)構(gòu)。所以通過編寫一個模擬動態(tài)資源分配的銀行家算法程序,進一步深入理解死鎖、產(chǎn)生死鎖的必要條件、安全狀態(tài)等重要概念,并掌握避免死鎖的具體實施方法。關(guān)鍵詞:資源,分配,死鎖,狀態(tài)2設(shè)計思想 我們可以把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。為保證資金的安全,銀行家規(guī)定:(1)當(dāng)一個顧客對資金的最大需求量不超過銀行家現(xiàn)有的資

4、金是就可接納該顧客;(2)顧客可以分期貸款,但貸款的總數(shù)不能超過最大需求量;(3)當(dāng)銀行家現(xiàn)有的資金不能滿足顧客尚需的貸款數(shù)額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間里得到貸款;(4)當(dāng)顧客得到所需的全部資金后,一定能在有限的時間里歸還所有的資金。操作系統(tǒng)按照銀行家制定的規(guī)則為進程分配資源,當(dāng)進程首次申請資源是,要測試該進程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資金可以滿足它的最大需求量,則按當(dāng)前的申請量分配資源,否則就推遲分配。當(dāng)進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占有的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進程對資源的最大需求量。若超過了最大需求量則拒絕分配資源,若沒有則再

5、測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當(dāng)前的申請量分配資源,否則也要延遲分配。3系統(tǒng)分析3.1 整個銀行家算法的思路 先對用戶提出的請求進行合法性檢查,再進行預(yù)分配,利用安全性檢查算法進行安全性檢查。3.2 算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C+語言說明3.2.1可利用資源向量 int AvailableM M為資源的類型。3.2.2最大需求矩陣 int MaxNM N為進程的數(shù)量。3.2.3已分配矩陣 int AllocationNM 3.2.4還需求矩陣 int NeedNN3.2.5申請各類資源數(shù)量int Requestx; int Workx;int Finishy; /

6、是否有足夠的資源分配給進程,0為否,非0為是3.3 銀行家算法主程序3.3.1系統(tǒng)初始化調(diào)用函數(shù)chushihua(),輸入進程數(shù)量,資源種類,各資源可用數(shù)量,各進程已分配、最大需求各資源數(shù)量等3.3.2安全性算法調(diào)用函safe()檢查當(dāng)前資源分配狀態(tài)。3.3.3檢索用戶用bank()函數(shù),輸入用戶的請求三元組(I,J,K),為進程I申請K個J類資源。3.3.4檢查用戶請求檢查用戶請求是否小于還需求量,條件是K=NEEDI,J。如果條件不符則提示重新輸入,即不允許索取大于需求量。檢查用戶的請求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K=AVALIABLEI,J。如果條件不符則申請失敗,阻塞該進程

7、,重新進行進程動態(tài)資源申請(使用goto語句跳轉(zhuǎn))3.3.5進行資源的預(yù)分配 AVALIBLEIJ= AVALIBLEIJ-K; ALLOCATIONIJ= ALLOCATIONIJ+K; NEEDIJ=NEEDIJ-K; 3.3.6系統(tǒng)調(diào)用安全性檢查算法safe()函數(shù)進行檢查,如果檢查不安全,則進行回收,進程資源申請失敗進入等待。否則不用回收,并檢查該進程是否已獲得所有需要資源,如是則進行其擁有資源釋放,語句如下:Availablej=Availablej+Allocationkj; Allocationkj=0; 3.4 安全性檢查算法3.4.1設(shè)置兩個臨時變量 FINISHN記錄進程模

8、擬執(zhí)行的結(jié)束狀態(tài),初值為0,如果可以模擬執(zhí)行結(jié)束,則可設(shè)為1。 WORKM記錄模擬執(zhí)行中資源的回收情況,初值為AVAILABLEM的值。3.4.2在進程中查找符合以下條件的進程 條件1:FINISHI=0 條件2:NEEDIJ=WORKJ 3.4.3如果查找成功則存儲安全序列并進行資源的模擬回收 FINISHI=1 WORKJ=WORKJ+ALLOCATIONIJ;4函數(shù)調(diào)用關(guān)系4.1 程序流程圖開始請輸入資源數(shù)請輸入各類資源可利用的數(shù)請輸入當(dāng)前資源可利用的數(shù)量請輸入當(dāng)前可分配的資源數(shù)量請輸入當(dāng)前已分配的資源數(shù)請輸入進程對資源的最大需求數(shù)量Max資源數(shù)提示錯誤系統(tǒng)當(dāng)前狀態(tài)統(tǒng)計結(jié)束4.2 程序模

9、塊劃分4.2.1字符判斷模塊判斷輸入的字符是否為數(shù)字,如果不是則提示出錯并重新輸入,主要處理輸入為非數(shù)字時程序出現(xiàn)運行錯誤現(xiàn)象。此模塊功能由數(shù)字判斷函數(shù)( int shuzi(int sz); )實現(xiàn)。4.2.2程序初始化模塊用于程序開始進行初始化輸入數(shù)據(jù):進程數(shù)量、資源種類、各種資源可利用數(shù)量、各進程的各種資源已分配數(shù)量、各進程對各類資源最大需求數(shù)等。此模塊功能在系統(tǒng)初始化函數(shù)(void chushihua(); )中實現(xiàn)。4.2.3當(dāng)前安全性檢查模塊用于判斷當(dāng)前狀態(tài)安全性,根據(jù)不同地方的調(diào)用提示處理不同,在安全性算函數(shù)(void safe(); )中實現(xiàn)。4.2.4銀行家算法模塊進行銀行家

10、算法模擬實現(xiàn)的模塊,調(diào)用其他各個模塊進行銀行家算法模擬過程,在銀行家算法函數(shù)(void bank();)中實現(xiàn)。4.2.5顯示分配模塊顯示當(dāng)前資源分配詳細情況,包括:各種資源的總數(shù)量(all)、系統(tǒng)目前各種資源可用的數(shù)量、各進程已經(jīng)得到的資源數(shù)量、各進程還需要的資源量,在顯示分配情況函數(shù)(void showdata(); )中實現(xiàn)。4.2.6簽名模塊:用于程序結(jié)束時顯示程序版權(quán)聲明簽名等,在簽名函數(shù)(void sign(); )中實現(xiàn)。5.數(shù)據(jù)結(jié)構(gòu)分析5.1定義全局變量const int x=50,y=100; /定義常量,便于修改int Availablex; /各種資源可利用的數(shù)量int

11、Allocationyy; /各進程當(dāng)前已分配的資源數(shù)量int Maxyy; /各進程對各類資源的最大需求數(shù)int Needyy; /還需求矩陣int Requestx; /申請各類資源的數(shù)量int Workx; /工作向量,表系統(tǒng)可提供給進程運行所需各類資源數(shù)量int Finishy; /表系統(tǒng)是否有足夠的資源分配給進程,0為否,1為是int py; /存儲安全序列int i,j; /全局變量,主要用于循環(huán)語句中int n,m; /n為進程的數(shù)量,m為資源種類數(shù)int l=0,counter=0;5.2函數(shù)聲明int shuzi(int sz); /數(shù)字判斷函數(shù),還可使用 void shuz

12、i(int& sz); 方式void chushihua(); /系統(tǒng)初始化函數(shù)void safe(); /安全性算法函數(shù)void bank(); /銀行家算法函數(shù)void showdata(); /函數(shù)showdata,輸出當(dāng)前資源分配情況void sign(); /簽名函數(shù)5.3主函數(shù)結(jié)構(gòu)int main()system(color 06f); /設(shè)置當(dāng)前窗口的背景色和前景色 cout /顯示程序開始提示信息 chushihua(); /初始化函數(shù)調(diào)用 coutendlendl; showdata(); /輸出初始化后的狀態(tài) /=判斷當(dāng)前狀態(tài)的安全性= safe(); /安全性算法函數(shù)調(diào)用

13、 if (ln) coutn當(dāng)前狀態(tài)不安全,無法申請,程序退出!endl; coutendl; system(pause); sign(); /調(diào)用簽名函數(shù) return 0; / break; else int i; /局部變量 l=0;coutn安全的狀態(tài)!endl; cout安全序列為: ; coutendl進程(p0); /輸出安全序列,考慮顯示格式,先輸出第一個 for (i=1; in; i+) cout進程(pi); for (i=0; in; i+) Finishi=0; /所有進程置為未分配狀態(tài) coutendlendl; bank(); /銀行家算法函數(shù)調(diào)用return 0

14、; 5.4各模塊含義5.4.1整個銀行家算法的思路 先對用戶提出的請求進行合法性檢查,再進行預(yù)分配,利用安全性檢查算法進行安全性檢查。5.4.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C語言說明 (1)可利用資源向量 INT AVAILABLEM M為資源的類型; (2)最大需求矩陣 INT MAXNM N為進程的數(shù)量; (3)已分配矩陣 INT ALLOCATIONNM; (4)還需求矩陣 INT NEEDNN; (5)申請各類資源數(shù)量int Requestx; (6)工作向量 int Workx。 (7)int Finishy; /表示系統(tǒng)是否有足夠的資源分配給進程,0為否,非0為是5.4.3銀行家算法

15、(1)系統(tǒng)初始化。輸入進程數(shù)量,資源種類,各進程已分配、還需求各資源數(shù)量,各資源可用數(shù)量等。 (2)輸入用戶的請求三元組(I,J,K),為進程I申請K個J類資源。 (3)檢查用戶的請求是否小于還需求的數(shù)量,條件是 K=NEEDI,J。如果條件不符則提示重新輸入,即不允許索取大于需求量。 (4)檢查用戶的請求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K=AVALIABLEI,J。如果條件不符則申請失敗,阻塞該進程,重新進行進程動態(tài)資源申請(使用goto語句)。 (5)進行資源的預(yù)分配,語句如下: AVALIBLEIJ= AVALIBLEIJ-K; ALLOCATIONIJ= ALLOCATIONIJ

16、+K; NEEDIJ=NEEDIJ-K;(6)系統(tǒng)調(diào)用安全性檢查算法(safe()函數(shù))進行檢查,如果檢查通過,則不回收,否則進行回收,進程資源申請失敗進入等待。5.4.4安全性檢查算法 (1)設(shè)置兩個臨時變量 FINISHN記錄進程模擬執(zhí)行的結(jié)束狀態(tài),初值為0,如果可以模擬執(zhí)行束,則可設(shè)為1,也可設(shè)其它非零值以表示執(zhí)行的先后次序。 WORKM記錄模擬執(zhí)行中資源的回收情況,初值為AVAILABLEM的值。 (2)在進程中查找符合以下條件的進程 條件1:FINISHI=0 條件2:NEEDIJ=WORKJ. (3)如果查找成功則進行資源的模擬回收,語句如下 WORKJ=WORKJ+ALLOCAT

17、IONIJ; FINISHI=1 或查找到的順序號.(4)、如果查找不成功,則檢查所有進程的FINISH,如果有一個為0,則系統(tǒng)不為0,返回不成功標(biāo)志。否則返回成功標(biāo)志。6. 程序測試結(jié)果程序調(diào)試圖如下所示:顯示資源最大需求數(shù)界面資源管理界面需要資源數(shù)量界面7心得體會 在設(shè)計此程序的過程中,我遇到過許多問題,也學(xué)到了很多東西。本程序的設(shè)計實現(xiàn)主要是用C+語言實現(xiàn),通過對程序算法的設(shè)計優(yōu)化、輸出顯示的格式設(shè)計、輸入過程中的異常處理等一些設(shè)計過程中的問題的考慮解決,在C+學(xué)習(xí)上也有了很大的進步。程序設(shè)計過程中開始遇到的最大的問題是算法的結(jié)構(gòu)設(shè)計問題,課本上只給了設(shè)計要求及簡單的算法,要真正實現(xiàn)還需

18、要考慮很多方面。在算法的數(shù)據(jù)結(jié)構(gòu)設(shè)計上考慮了很長時間。在程序設(shè)計中先后參考了很多網(wǎng)絡(luò)資料,也參考了一些別人寫的的程序,綜合這些算法思想和自己的思路對程序做了很好的設(shè)計方式,對一些算法的優(yōu)越性等也作了一些考慮。此外考慮最多的就是異常錯誤處理的設(shè)計。一個好的程序必須能在各種環(huán)境下都有其相應(yīng)的處理方式,至少能應(yīng)對一些常見的可能發(fā)生的錯誤。比如一般的要求輸入為數(shù)字時,如果輸入了一個非數(shù)字字符,程序就會立即出錯無法繼續(xù)運行,本程序針對這個問題設(shè)計了一個shuzi();函數(shù)進行處理,處理方式為:接受鍵盤輸入的字符為字符串,然后對字符串的每個字符進行判斷是否為數(shù)字,如果有非數(shù)字字符出現(xiàn)則提示出錯并要求重新輸

19、入。又如在判斷是否繼續(xù)時要求輸入Y/N時,按一般的方式,如果輸入為多個字符,則多余的字符會保存在緩沖區(qū),到下次要求輸入時輸入而導(dǎo)致出錯,對此問題設(shè)計處理方式為接受輸入字符保存為串然后只取其首字符進行判斷。還有很多類似的錯誤處理。還有在設(shè)置程序的顯示優(yōu)化時,發(fā)現(xiàn)暫停函數(shù)在不同的情況下執(zhí)行順序不同,如此等等。在課程設(shè)計過程中遇到了許多問題,也向同宿舍的同學(xué)做了一些請教一起討論,也因此從他們身上學(xué)到了許多東西。8主要參考文獻1. 湯子瀛,哲鳳屏.計算機操作系統(tǒng).西安電子科技大學(xué)學(xué)出版社.2. 王清,李光明.計算機操作系統(tǒng).冶金工業(yè)出版社.3.孫鐘秀等. 操作系統(tǒng)教程. 高等教育出版社4.曾明. Li

20、nux操作系統(tǒng)應(yīng)用教程. 陜西科學(xué)技術(shù)出版社. 5. 張麗芬,劉利雄.操作系統(tǒng)實驗教程. 清華大學(xué)出版社.6. 孟靜,操作系統(tǒng)教程原理和實例分析. 高等教育出版社7. 周長林,計算機操作系統(tǒng)教程. 高等教育出版社8. 張堯?qū)W,計算機操作系統(tǒng)教程,清華大學(xué)出版社9. 任滿杰,操作系統(tǒng)原理實用教程,電子工業(yè)出版社附錄:部分源程序代碼#include #include #include #include #include /=定義全局變量=const int x=50,y=100; /定義常量,便于修改int Availablex; /各種資源可利用的數(shù)量int Allocationyy; /各進程

21、當(dāng)前已分配的資源數(shù)量int Maxyy; /各進程對各類資源的最大需求數(shù)int Needyy; /還需求矩陣int Requestx; /申請各類資源的數(shù)量int Workx; /工作向量,表示系統(tǒng)可提供給進程繼續(xù)運行所需的各類資源數(shù)量int Finishy; /表示系統(tǒng)是否有足夠的資源分配給進程,0為否,非0為是int py; /存儲安全序列int i,j;int n,m; /n為進程的數(shù)量,m為資源種類數(shù)int l=0,counter=0;/函數(shù)聲明int shuzi(int sz); /數(shù)字判斷函數(shù) 或者使用 void shuzi(int& sz); 方式void chushihua()

22、; /系統(tǒng)初始化函數(shù)void safe(); /安全性算法函數(shù)void bank(); /銀行家算法函數(shù)void showdata(); /函數(shù)showdata,輸出當(dāng)前資源分配情況void sign(); /簽名函數(shù) /=數(shù)字判斷函數(shù)=int shuzi(int sz) /輸入數(shù)據(jù)并判斷是否為數(shù)字 char *temp; temp=new char; /臨時指針,存放輸入字符 int len; /存儲取字符的長度 sz=0 ; /清零 char s; / do /輸入賭注,只能輸入數(shù)字 / gets(temp); /getline(cin,temp) cintemp; len=strlen(

23、temp); /取字符長度 for(int i=0;ilen;i+) s= *(temp+i); if(s9) cout 請輸入數(shù)字 nn; cout請重新輸入:; break; while(s9); for(int i=0;ilen;i+) /輸入字符串轉(zhuǎn)化為整形數(shù)字 int t=1; for(int j=1;jlen-i;j+) t*=10; sz+=(*(temp+i)-48)*t; return sz;/=系統(tǒng)初始化函數(shù)=void chushihua() /=系統(tǒng)初始化輸入= cout% 程序開始,系統(tǒng)初始化輸入 %endl; /endl cout=endlendl; cout請輸入進

24、程的數(shù)量: ;/從此開始輸入有關(guān)數(shù)據(jù) n=shuzi(n); cout請輸入資源種類數(shù): ; m=shuzi(m); coutendlendl請輸入各種資源可利用的數(shù)量( m 種): endl; coutendl; for (j=0; jm; j+) cout 輸入資源 j 可利用的數(shù)量Availablej: ; Availablej=shuzi(Availablej); Workj=Availablej; /初始化Workj / coutendl; /system(cls); /清屏 coutendl; cout請輸入各進程當(dāng)前已分配的資源數(shù)量Allocationnm: endlendl;

25、for (i=0; in; i+) for (j=0; jm; j+) cout 請輸入進程 i 當(dāng)前已分配的資源 j 數(shù)量: ; Allocationij=shuzi(Allocationij); / coutendl; coutendl; Finishi=0;/初始化Finishi /break; coutendlendl; cout請輸入各進程對各類資源的最大需求數(shù)Maxnm: endlendl; for (i=0; in; i+) for (j=0; jm; j+) cout 請輸入進程 i 對資源 j=Allocationij) / Needij = Maxij-Allocation

26、ij; /計算還需求量 else Needij=0;/最大需求量小于已分配量時還需求量為0,即此類資源已足夠不需再申請 coutendl; coutendl% 初始化完成! %endl;/=安全性算法函數(shù)=void safe() l=0; for (i=0; in;) /i+ if (Finishi=0) /尋找Finishi=0的進程 條件一 counter=0; /記數(shù)器 /* 算法一: for (j=0; j=Needij) /可用大于等于需求 counter=counter+1;/記數(shù) if(counter=m)*/ /算法二: for (j=0; j=Needij); /可用大于等于

27、需求 else counter=1; break; if(counter!=1) /進程的每類資源量都符合條件Workj=Needij 條件二 pl=i; /存儲安全序列 Finishi=1; /標(biāo)志為可分配 for (j=0; j=Needij i= -1; /從第一個進程開始繼續(xù)尋找滿足條件一二的進程 i+; /for循環(huán)繼續(xù)尋找 /=顯示分配情況函數(shù) =void showdata() /函數(shù)showdata,輸出當(dāng)前資源分配情況 int i,j; /局部變量 int Ally; /各種資源的總數(shù)量 int l2; /局部變量 l1, cout=endlendl; cout% 系統(tǒng)當(dāng)前狀態(tài)

28、如下:%endlendl; cout% 各種資源的總數(shù)量(all):endl; for (j=0;jm;j+) cout 資源j: ; Allj=Availablej; /初始化 先賦值加上可利用量 for (i=0;in;i+) Allj+=Allocationij; /再加上每個進程已分配量計算J類資源總量 coutAllj ; if (j+1)%5=0 ) coutendl; /每行顯示五個 & j!=0 coutendlendl; cout% 系統(tǒng)目前各種資源可用的數(shù)為(available):endl; for (j=0;jm;j+) cout 資源j: Availablej ; if

29、(j+1)%5=0) coutendl; /每行最多顯示五個 & j!=0 coutendlendl; cout% 各進程已經(jīng)得到的資源量(allocation): endl; / l1=0; /歸零 for(i=0;i=m/5;i+) /設(shè)計每行最多顯示五種資源 for (j=i*5;ji*5+5 & jm;j+)cout 資源j; coutendl; for(l2=0;l2n;l2+) cout進程l2:; for (j=i*5;ji*5+5 & jm;j+)coutAllocationl2j ; coutendl; coutendl; cout% 各進程還需要的資源量(need):end

30、l; /endl /l1=0; for(i=0;i=m/5;i+) /設(shè)計每行顯示五種資源 for (j=i*5;ji*5+5 & jm;j+)cout 資源j; coutendl; for(l2=0;l2n;l2+) cout進程l2:; for (j=i*5;ji*5+5 & jm;j+)coutNeedl2j ; coutendl; coutendl; cout=endl; coutendl; system(pause); / 暫停/=簽名函數(shù) =void sign() system(cls); / 清屏 coutendlendlendlendlendlendl; couttt =end

31、l; couttt = =endl;couttt = 謝謝你的使用 =endl; couttt = =endl;couttt =endl; coutendlendlendlendlendlendlendlendlendl; / getch(); /等待鍵盤輸入,不返回任何值,用于設(shè)置程序運行界面 system(pause);/暫停 比較兩種方式/* 經(jīng)過在不同的編輯器中調(diào)試發(fā)現(xiàn),不同的調(diào)試器對函數(shù)執(zhí)行的順序有差別 如在此處使用 getch() 和 system(pause) 函數(shù)時,在visual c+6.0中先執(zhí)行此函數(shù)再顯示, 而在dev-c+ 中則按順序執(zhí)行 對此問題我在很多地方搜索查找

32、均未找到滿意的答案,本次換用調(diào)試器才發(fā)現(xiàn)理解-4.29 本次調(diào)試格式時,將換行命令 n 改為 endl 時,發(fā)現(xiàn) system(pause) 函數(shù)執(zhí)行變?yōu)轫樞?執(zhí)行,由此領(lǐng)悟到 n 命令和system(pause)調(diào)用了一樣系統(tǒng)函數(shù),在調(diào)用的順序上system(pause) 優(yōu)先所以它就先執(zhí)行了查找了一下相關(guān)幫助: 在OSTREAM.H中有這樣的一個inline函數(shù): inline _CRTIMP ostream& _cdecl endl(ostream& _outs) return _outs n flush; 也就是說 endl= return _outs n flush; endl除了寫

33、n進外,還調(diào)用flush函數(shù),刷新緩沖區(qū),把緩沖區(qū)里的數(shù)據(jù)寫入文件或屏幕, 如果考慮效率就用n */ / coutl; coutttt ;/=銀行家算法函數(shù)=void bank() cout=endlendl; cout% 以下開始為進程進行資源分配申請 %endlendl; /=申請資源= int k=0;/用于輸入進程編號 bool r=false; / 初值為假,輸入Y繼續(xù)申請則置為真 do /輸入請求 cout請輸入申請資源的進程編號(輸入0-n-1之間): ; k=shuzi(k); coutn-1) /輸入異常處理 coutendl您輸入了錯誤的進程號,請重新輸入!endl; co

34、utendl請輸入申請資源的進程編號(輸入0-n-1之間): ; k=shuzi(k); coutendl; coutendl請輸入該進程申請各類資源的數(shù)量: endl; for (j=0; jm; j+) do /dowhile 循環(huán)判斷申請輸入的情況 cout進程 k 申請資源j的數(shù)量:; Requestj=shuzi(Requestj); coutNeedkj) /申請大于需求量時出錯,提示重新輸入(貸款數(shù)目不允許超過需求數(shù)目) cout申請大于需要量!endl; cout您申請資源j的數(shù)量為Requestj,大于進程k對該資源需求量Needkj。endl; cout請重新輸入!Avai

35、lablej) /申請大于可利用量, 應(yīng)該阻塞等待? ? coutn沒有那么多資源,目前可利用資源j數(shù)量為Availablej,本次申請不成功,進程等待!Needkj); /RequestjAvailablej| /改變Avilable、Allocation、Need的值 for (j=0; jm; j+) Availablej = Availablej-Requestj; Allocationkj = Allocationkj+Requestj; Needkj = Needkj-Requestj; Workj = Availablej; /判斷當(dāng)前狀態(tài)的安全性 safe(); /調(diào)用安全性算

36、法函數(shù) if (ln) l=0; coutn當(dāng)前狀態(tài)不安全,不予分配!endl; /恢復(fù)數(shù)據(jù) for (j=0; jm; j+) Availablej = Availablej+Requestj; Allocationkj = Allocationkj-Requestj; Needkj = Needkj+Requestj; Workj = Availablej; for (i=0; in; i+) Finishi=0; /進程置為未分配狀態(tài) else / system(cls); l=0; coutn申請資源成功!endl;/=/* /如果該進程所有需要的資源都已申請到,即NEEDkj均為零,則進程可以執(zhí)行,執(zhí)行完后需釋放其所有擁有的資源 /算法一: for(j=0;jm;j+) if(Needkj=0) l=l+1; if(l=m) /此處借用 l 做下計數(shù)器 for (j=0;jm;j+) /釋放該進程的所有資源 Availablej=Availablej+Maxkj; Allocationkj=0; l=0; /歸零*/ /算法二: (相對第一種算法節(jié)省時間) for(j=0;jm;j+) if(Needkj=0); else /有一

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論