




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、西安文理學(xué)院軟件學(xué)院計(jì)算機(jī)操作系統(tǒng)設(shè)計(jì)題目: 銀行家算法的實(shí)現(xiàn) 學(xué)生學(xué)號: 專業(yè)班級: 學(xué)生姓名: 學(xué)生成績: 目 錄1摘要32設(shè)計(jì)思想43系統(tǒng)分析43.1 整個(gè)銀行家算法的思路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進(jìn)行資源的預(yù)分配53.3.6系統(tǒng)調(diào)用安全性檢查算法53.4 安全性檢查算法53.4.1設(shè)置兩個(gè)臨時(shí)變量53.4.2在進(jìn)程中查找符
2、合以下條件的進(jìn)程63.4.3如果查找成功則存儲(chǔ)安全序列并進(jìn)行資源的模擬回收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整個(gè)銀行家算法的思路105.4.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C語言說明105.4.3銀行家算法105.4.4安全性檢查算法106. 程序測試結(jié)果127心得體會(huì)148主要參考文獻(xiàn)15附錄:部分源程序代碼161摘要銀行家算法是一種最有代表性
3、的避免死鎖的算法,在避免死鎖方法中允許進(jìn)程動(dòng)態(tài)的申請資源,但系統(tǒng)在進(jìn)行資源分配之前,應(yīng)先計(jì)算此次分配資源的安全性,若分配不會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),則分配,否則等待。為實(shí)現(xiàn)銀行家算法,系統(tǒng)必須設(shè)置若干數(shù)據(jù)結(jié)構(gòu)。所以通過編寫一個(gè)模擬動(dòng)態(tài)資源分配的銀行家算法程序,進(jìn)一步深入理解死鎖、產(chǎn)生死鎖的必要條件、安全狀態(tài)等重要概念,并掌握避免死鎖的具體實(shí)施方法。關(guān)鍵詞:資源,分配,死鎖,狀態(tài)2設(shè)計(jì)思想 我們可以把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。為保證資金的安全,銀行家規(guī)定:(1)當(dāng)一個(gè)顧客對資金的最大需求量不超過銀行家現(xiàn)有的資
4、金是就可接納該顧客;(2)顧客可以分期貸款,但貸款的總數(shù)不能超過最大需求量;(3)當(dāng)銀行家現(xiàn)有的資金不能滿足顧客尚需的貸款數(shù)額時(shí),對顧客的貸款可推遲支付,但總能使顧客在有限的時(shí)間里得到貸款;(4)當(dāng)顧客得到所需的全部資金后,一定能在有限的時(shí)間里歸還所有的資金。操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請資源是,要測試該進(jìn)程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資金可以滿足它的最大需求量,則按當(dāng)前的申請量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請資源時(shí),先測試該進(jìn)程已占有的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進(jìn)程對資源的最大需求量。若超過了最大需求量則拒絕分配資源,若沒有則再
5、測試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,若能滿足則按當(dāng)前的申請量分配資源,否則也要延遲分配。3系統(tǒng)分析3.1 整個(gè)銀行家算法的思路 先對用戶提出的請求進(jìn)行合法性檢查,再進(jìn)行預(yù)分配,利用安全性檢查算法進(jìn)行安全性檢查。3.2 算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C+語言說明3.2.1可利用資源向量 int AvailableM M為資源的類型。3.2.2最大需求矩陣 int MaxNM N為進(jìn)程的數(shù)量。3.2.3已分配矩陣 int AllocationNM 3.2.4還需求矩陣 int NeedNN3.2.5申請各類資源數(shù)量int Requestx; int Workx;int Finishy; /
6、是否有足夠的資源分配給進(jìn)程,0為否,非0為是3.3 銀行家算法主程序3.3.1系統(tǒng)初始化調(diào)用函數(shù)chushihua(),輸入進(jìn)程數(shù)量,資源種類,各資源可用數(shù)量,各進(jìn)程已分配、最大需求各資源數(shù)量等3.3.2安全性算法調(diào)用函safe()檢查當(dāng)前資源分配狀態(tài)。3.3.3檢索用戶用bank()函數(shù),輸入用戶的請求三元組(I,J,K),為進(jìn)程I申請K個(gè)J類資源。3.3.4檢查用戶請求檢查用戶請求是否小于還需求量,條件是K=NEEDI,J。如果條件不符則提示重新輸入,即不允許索取大于需求量。檢查用戶的請求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K=AVALIABLEI,J。如果條件不符則申請失敗,阻塞該進(jìn)程
7、,重新進(jìn)行進(jìn)程動(dòng)態(tài)資源申請(使用goto語句跳轉(zhuǎn))3.3.5進(jìn)行資源的預(yù)分配 AVALIBLEIJ= AVALIBLEIJ-K; ALLOCATIONIJ= ALLOCATIONIJ+K; NEEDIJ=NEEDIJ-K; 3.3.6系統(tǒng)調(diào)用安全性檢查算法safe()函數(shù)進(jìn)行檢查,如果檢查不安全,則進(jìn)行回收,進(jìn)程資源申請失敗進(jìn)入等待。否則不用回收,并檢查該進(jìn)程是否已獲得所有需要資源,如是則進(jìn)行其擁有資源釋放,語句如下:Availablej=Availablej+Allocationkj; Allocationkj=0; 3.4 安全性檢查算法3.4.1設(shè)置兩個(gè)臨時(shí)變量 FINISHN記錄進(jìn)程模
8、擬執(zhí)行的結(jié)束狀態(tài),初值為0,如果可以模擬執(zhí)行結(jié)束,則可設(shè)為1。 WORKM記錄模擬執(zhí)行中資源的回收情況,初值為AVAILABLEM的值。3.4.2在進(jìn)程中查找符合以下條件的進(jìn)程 條件1:FINISHI=0 條件2:NEEDIJ=WORKJ 3.4.3如果查找成功則存儲(chǔ)安全序列并進(jìn)行資源的模擬回收 FINISHI=1 WORKJ=WORKJ+ALLOCATIONIJ;4函數(shù)調(diào)用關(guān)系4.1 程序流程圖開始請輸入資源數(shù)請輸入各類資源可利用的數(shù)請輸入當(dāng)前資源可利用的數(shù)量請輸入當(dāng)前可分配的資源數(shù)量請輸入當(dāng)前已分配的資源數(shù)請輸入進(jìn)程對資源的最大需求數(shù)量Max資源數(shù)提示錯(cuò)誤系統(tǒng)當(dāng)前狀態(tài)統(tǒng)計(jì)結(jié)束4.2 程序模
9、塊劃分4.2.1字符判斷模塊判斷輸入的字符是否為數(shù)字,如果不是則提示出錯(cuò)并重新輸入,主要處理輸入為非數(shù)字時(shí)程序出現(xiàn)運(yùn)行錯(cuò)誤現(xiàn)象。此模塊功能由數(shù)字判斷函數(shù)( int shuzi(int sz); )實(shí)現(xiàn)。4.2.2程序初始化模塊用于程序開始進(jìn)行初始化輸入數(shù)據(jù):進(jìn)程數(shù)量、資源種類、各種資源可利用數(shù)量、各進(jìn)程的各種資源已分配數(shù)量、各進(jìn)程對各類資源最大需求數(shù)等。此模塊功能在系統(tǒng)初始化函數(shù)(void chushihua(); )中實(shí)現(xiàn)。4.2.3當(dāng)前安全性檢查模塊用于判斷當(dāng)前狀態(tài)安全性,根據(jù)不同地方的調(diào)用提示處理不同,在安全性算函數(shù)(void safe(); )中實(shí)現(xiàn)。4.2.4銀行家算法模塊進(jìn)行銀行家
10、算法模擬實(shí)現(xiàn)的模塊,調(diào)用其他各個(gè)模塊進(jìn)行銀行家算法模擬過程,在銀行家算法函數(shù)(void bank();)中實(shí)現(xiàn)。4.2.5顯示分配模塊顯示當(dāng)前資源分配詳細(xì)情況,包括:各種資源的總數(shù)量(all)、系統(tǒng)目前各種資源可用的數(shù)量、各進(jìn)程已經(jīng)得到的資源數(shù)量、各進(jìn)程還需要的資源量,在顯示分配情況函數(shù)(void showdata(); )中實(shí)現(xiàn)。4.2.6簽名模塊:用于程序結(jié)束時(shí)顯示程序版權(quán)聲明簽名等,在簽名函數(shù)(void sign(); )中實(shí)現(xiàn)。5.數(shù)據(jù)結(jié)構(gòu)分析5.1定義全局變量const int x=50,y=100; /定義常量,便于修改int Availablex; /各種資源可利用的數(shù)量int
11、Allocationyy; /各進(jìn)程當(dāng)前已分配的資源數(shù)量int Maxyy; /各進(jìn)程對各類資源的最大需求數(shù)int Needyy; /還需求矩陣int Requestx; /申請各類資源的數(shù)量int Workx; /工作向量,表系統(tǒng)可提供給進(jìn)程運(yùn)行所需各類資源數(shù)量int Finishy; /表系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,1為是int py; /存儲(chǔ)安全序列int i,j; /全局變量,主要用于循環(huán)語句中int n,m; /n為進(jì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進(jìn)程(p0); /輸出安全序列,考慮顯示格式,先輸出第一個(gè) for (i=1; in; i+) cout進(jìn)程(pi); for (i=0; in; i+) Finishi=0; /所有進(jìn)程置為未分配狀態(tài) coutendlendl; bank(); /銀行家算法函數(shù)調(diào)用return 0
14、; 5.4各模塊含義5.4.1整個(gè)銀行家算法的思路 先對用戶提出的請求進(jìn)行合法性檢查,再進(jìn)行預(yù)分配,利用安全性檢查算法進(jìn)行安全性檢查。5.4.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C語言說明 (1)可利用資源向量 INT AVAILABLEM M為資源的類型; (2)最大需求矩陣 INT MAXNM N為進(jìn)程的數(shù)量; (3)已分配矩陣 INT ALLOCATIONNM; (4)還需求矩陣 INT NEEDNN; (5)申請各類資源數(shù)量int Requestx; (6)工作向量 int Workx。 (7)int Finishy; /表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,非0為是5.4.3銀行家算法
15、(1)系統(tǒng)初始化。輸入進(jìn)程數(shù)量,資源種類,各進(jìn)程已分配、還需求各資源數(shù)量,各資源可用數(shù)量等。 (2)輸入用戶的請求三元組(I,J,K),為進(jìn)程I申請K個(gè)J類資源。 (3)檢查用戶的請求是否小于還需求的數(shù)量,條件是 K=NEEDI,J。如果條件不符則提示重新輸入,即不允許索取大于需求量。 (4)檢查用戶的請求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K=AVALIABLEI,J。如果條件不符則申請失敗,阻塞該進(jìn)程,重新進(jìn)行進(jìn)程動(dòng)態(tài)資源申請(使用goto語句)。 (5)進(jìn)行資源的預(yù)分配,語句如下: AVALIBLEIJ= AVALIBLEIJ-K; ALLOCATIONIJ= ALLOCATIONIJ
16、+K; NEEDIJ=NEEDIJ-K;(6)系統(tǒng)調(diào)用安全性檢查算法(safe()函數(shù))進(jìn)行檢查,如果檢查通過,則不回收,否則進(jìn)行回收,進(jìn)程資源申請失敗進(jìn)入等待。5.4.4安全性檢查算法 (1)設(shè)置兩個(gè)臨時(shí)變量 FINISHN記錄進(jìn)程模擬執(zhí)行的結(jié)束狀態(tài),初值為0,如果可以模擬執(zhí)行束,則可設(shè)為1,也可設(shè)其它非零值以表示執(zhí)行的先后次序。 WORKM記錄模擬執(zhí)行中資源的回收情況,初值為AVAILABLEM的值。 (2)在進(jìn)程中查找符合以下條件的進(jìn)程 條件1:FINISHI=0 條件2:NEEDIJ=WORKJ. (3)如果查找成功則進(jìn)行資源的模擬回收,語句如下 WORKJ=WORKJ+ALLOCAT
17、IONIJ; FINISHI=1 或查找到的順序號.(4)、如果查找不成功,則檢查所有進(jìn)程的FINISH,如果有一個(gè)為0,則系統(tǒng)不為0,返回不成功標(biāo)志。否則返回成功標(biāo)志。6. 程序測試結(jié)果程序調(diào)試圖如下所示:顯示資源最大需求數(shù)界面資源管理界面需要資源數(shù)量界面7心得體會(huì) 在設(shè)計(jì)此程序的過程中,我遇到過許多問題,也學(xué)到了很多東西。本程序的設(shè)計(jì)實(shí)現(xiàn)主要是用C+語言實(shí)現(xiàn),通過對程序算法的設(shè)計(jì)優(yōu)化、輸出顯示的格式設(shè)計(jì)、輸入過程中的異常處理等一些設(shè)計(jì)過程中的問題的考慮解決,在C+學(xué)習(xí)上也有了很大的進(jìn)步。程序設(shè)計(jì)過程中開始遇到的最大的問題是算法的結(jié)構(gòu)設(shè)計(jì)問題,課本上只給了設(shè)計(jì)要求及簡單的算法,要真正實(shí)現(xiàn)還需
18、要考慮很多方面。在算法的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)上考慮了很長時(shí)間。在程序設(shè)計(jì)中先后參考了很多網(wǎng)絡(luò)資料,也參考了一些別人寫的的程序,綜合這些算法思想和自己的思路對程序做了很好的設(shè)計(jì)方式,對一些算法的優(yōu)越性等也作了一些考慮。此外考慮最多的就是異常錯(cuò)誤處理的設(shè)計(jì)。一個(gè)好的程序必須能在各種環(huán)境下都有其相應(yīng)的處理方式,至少能應(yīng)對一些常見的可能發(fā)生的錯(cuò)誤。比如一般的要求輸入為數(shù)字時(shí),如果輸入了一個(gè)非數(shù)字字符,程序就會(huì)立即出錯(cuò)無法繼續(xù)運(yùn)行,本程序針對這個(gè)問題設(shè)計(jì)了一個(gè)shuzi();函數(shù)進(jìn)行處理,處理方式為:接受鍵盤輸入的字符為字符串,然后對字符串的每個(gè)字符進(jìn)行判斷是否為數(shù)字,如果有非數(shù)字字符出現(xiàn)則提示出錯(cuò)并要求重新輸
19、入。又如在判斷是否繼續(xù)時(shí)要求輸入Y/N時(shí),按一般的方式,如果輸入為多個(gè)字符,則多余的字符會(huì)保存在緩沖區(qū),到下次要求輸入時(shí)輸入而導(dǎo)致出錯(cuò),對此問題設(shè)計(jì)處理方式為接受輸入字符保存為串然后只取其首字符進(jìn)行判斷。還有很多類似的錯(cuò)誤處理。還有在設(shè)置程序的顯示優(yōu)化時(shí),發(fā)現(xiàn)暫停函數(shù)在不同的情況下執(zhí)行順序不同,如此等等。在課程設(shè)計(jì)過程中遇到了許多問題,也向同宿舍的同學(xué)做了一些請教一起討論,也因此從他們身上學(xué)到了許多東西。8主要參考文獻(xiàn)1. 湯子瀛,哲鳳屏.計(jì)算機(jī)操作系統(tǒng).西安電子科技大學(xué)學(xué)出版社.2. 王清,李光明.計(jì)算機(jī)操作系統(tǒng).冶金工業(yè)出版社.3.孫鐘秀等. 操作系統(tǒng)教程. 高等教育出版社4.曾明. Li
20、nux操作系統(tǒng)應(yīng)用教程. 陜西科學(xué)技術(shù)出版社. 5. 張麗芬,劉利雄.操作系統(tǒng)實(shí)驗(yàn)教程. 清華大學(xué)出版社.6. 孟靜,操作系統(tǒng)教程原理和實(shí)例分析. 高等教育出版社7. 周長林,計(jì)算機(jī)操作系統(tǒng)教程. 高等教育出版社8. 張堯?qū)W,計(jì)算機(jī)操作系統(tǒng)教程,清華大學(xué)出版社9. 任滿杰,操作系統(tǒng)原理實(shí)用教程,電子工業(yè)出版社附錄:部分源程序代碼#include #include #include #include #include /=定義全局變量=const int x=50,y=100; /定義常量,便于修改int Availablex; /各種資源可利用的數(shù)量int Allocationyy; /各進(jìn)程
21、當(dāng)前已分配的資源數(shù)量int Maxyy; /各進(jìn)程對各類資源的最大需求數(shù)int Needyy; /還需求矩陣int Requestx; /申請各類資源的數(shù)量int Workx; /工作向量,表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類資源數(shù)量int Finishy; /表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,非0為是int py; /存儲(chǔ)安全序列int i,j;int n,m; /n為進(jì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; /臨時(shí)指針,存放輸入字符 int len; /存儲(chǔ)取字符的長度 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請輸入進(jìn)
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請輸入各進(jìn)程當(dāng)前已分配的資源數(shù)量Allocationnm: endlendl;
25、for (i=0; in; i+) for (j=0; jm; j+) cout 請輸入進(jìn)程 i 當(dāng)前已分配的資源 j 數(shù)量: ; Allocationij=shuzi(Allocationij); / coutendl; coutendl; Finishi=0;/初始化Finishi /break; coutendlendl; cout請輸入各進(jìn)程對各類資源的最大需求數(shù)Maxnm: endlendl; for (i=0; in; i+) for (j=0; jm; j+) cout 請輸入進(jìn)程 i 對資源 j=Allocationij) / Needij = Maxij-Allocation
26、ij; /計(jì)算還需求量 else Needij=0;/最大需求量小于已分配量時(shí)還需求量為0,即此類資源已足夠不需再申請 coutendl; coutendl% 初始化完成! %endl;/=安全性算法函數(shù)=void safe() l=0; for (i=0; in;) /i+ if (Finishi=0) /尋找Finishi=0的進(jìn)程 條件一 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) /進(jìn)程的每類資源量都符合條件Workj=Needij 條件二 pl=i; /存儲(chǔ)安全序列 Finishi=1; /標(biāo)志為可分配 for (j=0; j=Needij i= -1; /從第一個(gè)進(jìn)程開始繼續(xù)尋找滿足條件一二的進(jìn)程 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; /再加上每個(gè)進(jìn)程已分配量計(jì)算J類資源總量 coutAllj ; if (j+1)%5=0 ) coutendl; /每行顯示五個(gè) & j!=0 coutendlendl; cout% 系統(tǒng)目前各種資源可用的數(shù)為(available):endl; for (j=0;jm;j+) cout 資源j: Availablej ; if
29、(j+1)%5=0) coutendl; /每行最多顯示五個(gè) & j!=0 coutendlendl; cout% 各進(jìn)程已經(jīng)得到的資源量(allocation): endl; / l1=0; /歸零 for(i=0;i=m/5;i+) /設(shè)計(jì)每行最多顯示五種資源 for (j=i*5;ji*5+5 & jm;j+)cout 資源j; coutendl; for(l2=0;l2n;l2+) cout進(jìn)程l2:; for (j=i*5;ji*5+5 & jm;j+)coutAllocationl2j ; coutendl; coutendl; cout% 各進(jìn)程還需要的資源量(need):end
30、l; /endl /l1=0; for(i=0;i=m/5;i+) /設(shè)計(jì)每行顯示五種資源 for (j=i*5;ji*5+5 & jm;j+)cout 資源j; coutendl; for(l2=0;l2n;l2+) cout進(jìn)程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è)置程序運(yùn)行界面 system(pause);/暫停 比較兩種方式/* 經(jīng)過在不同的編輯器中調(diào)試發(fā)現(xiàn),不同的調(diào)試器對函數(shù)執(zhí)行的順序有差別 如在此處使用 getch() 和 system(pause) 函數(shù)時(shí),在visual c+6.0中先執(zhí)行此函數(shù)再顯示, 而在dev-c+ 中則按順序執(zhí)行 對此問題我在很多地方搜索查找
32、均未找到滿意的答案,本次換用調(diào)試器才發(fā)現(xiàn)理解-4.29 本次調(diào)試格式時(shí),將換行命令 n 改為 endl 時(shí),發(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中有這樣的一個(gè)inline函數(shù): inline _CRTIMP ostream& _cdecl endl(ostream& _outs) return _outs n flush; 也就是說 endl= return _outs n flush; endl除了寫
33、n進(jìn)外,還調(diào)用flush函數(shù),刷新緩沖區(qū),把緩沖區(qū)里的數(shù)據(jù)寫入文件或屏幕, 如果考慮效率就用n */ / coutl; coutttt ;/=銀行家算法函數(shù)=void bank() cout=endlendl; cout% 以下開始為進(jìn)程進(jìn)行資源分配申請 %endlendl; /=申請資源= int k=0;/用于輸入進(jìn)程編號 bool r=false; / 初值為假,輸入Y繼續(xù)申請則置為真 do /輸入請求 cout請輸入申請資源的進(jìn)程編號(輸入0-n-1之間): ; k=shuzi(k); coutn-1) /輸入異常處理 coutendl您輸入了錯(cuò)誤的進(jìn)程號,請重新輸入!endl; co
34、utendl請輸入申請資源的進(jìn)程編號(輸入0-n-1之間): ; k=shuzi(k); coutendl; coutendl請輸入該進(jìn)程申請各類資源的數(shù)量: endl; for (j=0; jm; j+) do /dowhile 循環(huán)判斷申請輸入的情況 cout進(jìn)程 k 申請資源j的數(shù)量:; Requestj=shuzi(Requestj); coutNeedkj) /申請大于需求量時(shí)出錯(cuò),提示重新輸入(貸款數(shù)目不允許超過需求數(shù)目) cout申請大于需要量!endl; cout您申請資源j的數(shù)量為Requestj,大于進(jìn)程k對該資源需求量Needkj。endl; cout請重新輸入!Avai
35、lablej) /申請大于可利用量, 應(yīng)該阻塞等待? ? coutn沒有那么多資源,目前可利用資源j數(shù)量為Availablej,本次申請不成功,進(jìn)程等待!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; /進(jìn)程置為未分配狀態(tài) else / system(cls); l=0; coutn申請資源成功!endl;/=/* /如果該進(jìn)程所有需要的資源都已申請到,即NEEDkj均為零,則進(jìn)程可以執(zhí)行,執(zhí)行完后需釋放其所有擁有的資源 /算法一: for(j=0;jm;j+) if(Needkj=0) l=l+1; if(l=m) /此處借用 l 做下計(jì)數(shù)器 for (j=0;jm;j+) /釋放該進(jìn)程的所有資源 Availablej=Availablej+Maxkj; Allocationkj=0; l=0; /歸零*/ /算法二: (相對第一種算法節(jié)省時(shí)間) 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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 營養(yǎng)師考試應(yīng)試技巧和試題及答案
- 2024演出經(jīng)紀(jì)人資格證考試復(fù)習(xí)計(jì)劃及試題答案
- 如何開展中介機(jī)構(gòu)的風(fēng)險(xiǎn)管理的試題及答案
- 房地產(chǎn)經(jīng)紀(jì)資格考試要點(diǎn)與試題關(guān)聯(lián)分析
- 2024年?duì)I養(yǎng)師考試過關(guān)技巧與答案
- 2024演出經(jīng)紀(jì)人資格考試題
- 社交媒體與演出經(jīng)紀(jì)人資格證試題及答案
- 演出經(jīng)紀(jì)人資格考試要點(diǎn)總結(jié)
- 疾速提升:2025年房地產(chǎn)經(jīng)紀(jì)試題及答案技巧
- 演出經(jīng)紀(jì)人資格證核心知識點(diǎn)與試題及答案
- 2025年北京平谷區(qū)高三一模高考數(shù)學(xué)模擬試卷(含答案詳解)
- TCHSA 081-2024 接受雙膦酸鹽治療患者拔牙圍手術(shù)期處理專家共識
- 2025年鐵嶺衛(wèi)生職業(yè)學(xué)院單招職業(yè)傾向性測試題庫新版
- 2025年陜西航空職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性考試題庫匯編
- 2025年安徽水利水電職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫參考答案
- 2025年時(shí)政題庫及答案(100題)
- 2025年鐘山職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫帶答案
- 2025年湖北科技職業(yè)學(xué)院單招職業(yè)技能測試題庫參考答案
- 急診與災(zāi)難醫(yī)學(xué)知到智慧樹章節(jié)測試課后答案2024年秋廣西中醫(yī)藥大學(xué)
- 2023年內(nèi)蒙古自治區(qū)高等職業(yè)院校對口招收中等職業(yè)學(xué)校畢業(yè)生單獨(dú)考試中職英語試卷
- 改建3萬噸大米加工項(xiàng)目可行性研究報(bào)告
評論
0/150
提交評論