操作系統(tǒng)課程設(shè)計(jì)---銀行家算法_第1頁(yè)
已閱讀1頁(yè),還剩25頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  操作系統(tǒng)課程設(shè)計(jì)報(bào)告</p><p><b>  題目:銀行家算法</b></p><p>  院 (系): 計(jì)算機(jī)科學(xué)與工程學(xué)院 </p><p>  專業(yè)班級(jí): 電子信息技術(shù)及儀器10-2 </p><p>  姓名: 王中課

2、 </p><p>  學(xué)號(hào): 2010302978 </p><p>  指導(dǎo)教師: 任萍 </p><p>  操作系統(tǒng)課程設(shè)計(jì)報(bào)告</p><p><b>  摘 要</b><

3、;/p><p>  Dijkstra提出的銀行家算法,是最具代表性的避免死鎖的算法。</p><p>  本文對(duì)如何用銀行家算法來(lái)處理操作系統(tǒng)給進(jìn)程分配資源做了詳細(xì)的說(shuō)明,包括需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、測(cè)試與分析、總結(jié)、源程序清單。 </p><p>  首先做了需求分析,解釋了什么是銀行家算法,并指出它在資源分配中的</p><p&g

4、t;<b>  重要作用。</b></p><p>  然后給出了銀行家算法的概要設(shè)計(jì),包括算法思路、步驟,以及要用到的主要數(shù)據(jù)結(jié)構(gòu)、函數(shù)模塊及其之間的調(diào)用關(guān)系等。</p><p>  在概要設(shè)計(jì)的基礎(chǔ)上,又給出了詳細(xì)的算法設(shè)計(jì),實(shí)現(xiàn)概要設(shè)計(jì)中定義的所有函數(shù),對(duì)每個(gè)函數(shù)寫(xiě)出核心算法,并畫(huà)出了流程圖。</p><p>  接著對(duì)編碼進(jìn)行了測(cè)試與分

5、析(并在最后附上Java編寫(xiě)的程序代碼)。</p><p>  最后對(duì)整個(gè)設(shè)計(jì)過(guò)程進(jìn)行了總結(jié)。</p><p>  關(guān)鍵詞:安全狀態(tài);安全序列;銀行家算法;安全性算法;安全序列;流程圖。</p><p><b>  目錄:</b></p><p><b>  摘要1</b></p>

6、<p><b>  1緒論4</b></p><p><b>  1.1前言5</b></p><p><b>  1.2研究意義5</b></p><p><b>  1.3結(jié)構(gòu)安排5</b></p><p><b>  2需

7、求分析4</b></p><p><b>  2.1題目描述5</b></p><p>  2.2銀行家算法5</p><p><b>  2.3基本要求5</b></p><p><b>  2.4目的5</b></p><p>

8、<b>  3概要設(shè)計(jì)4</b></p><p><b>  3.1基本思路5</b></p><p>  3.2銀行家算法步驟5</p><p>  3.3安全型算法步驟5</p><p><b>  3.4數(shù)據(jù)結(jié)構(gòu)5</b></p><p>

9、;  3.4.1主要用到的數(shù)據(jù)結(jié)構(gòu)6</p><p>  3.4.2程序模塊6</p><p>  3.4.3各模塊間的調(diào)用關(guān)系6</p><p><b>  4詳細(xì)設(shè)計(jì)4</b></p><p>  4.1主要函數(shù)的核心代碼5</p><p>  4.1程序流程圖5</p>

10、;<p><b>  5測(cè)試4</b></p><p><b>  5.1測(cè)試用例5</b></p><p>  5.1測(cè)試結(jié)果分析和截圖5</p><p><b>  6總結(jié)4</b></p><p><b>  參考文獻(xiàn)4</b>

11、;</p><p>  附錄:原程序清單4</p><p><b>  1緒論</b></p><p><b>  1.1前言 :</b></p><p>  Dijkstra (1965)提出了一種能夠避免死鎖的調(diào)度算法,稱為銀行家算法。</p><p>  它的模型基于

12、一個(gè)小城鎮(zhèn)的銀行家,他向一群客戶分別承諾了一定的貸款額度,每個(gè)客戶都有一個(gè)貸款額度,銀行家知道不可能所有客戶同時(shí)都需要最大貸款額,所以他只保留一定單位的資金來(lái)為客戶服務(wù),而不是滿足所有客戶貸款需求的最大單位。</p><p>  這里將客戶比作進(jìn)程,貸款比作設(shè)備,銀行家比作系統(tǒng)。</p><p>  客戶們各自做自己的生意,在某些時(shí)刻需要貸款。在某一時(shí)刻,客戶已獲得的貸款和可用的最大數(shù)額貸

13、款稱為與資源分配相關(guān)的系統(tǒng)狀態(tài)。一個(gè)狀態(tài)被稱為是安全的,其條件是存在一個(gè)狀態(tài)序列能夠使所有的客戶均得到其所需的貸款。如果忽然所有的客戶都申請(qǐng),希望得到最大貸款額,而銀行家無(wú)法滿足其中任何一個(gè)的要求,則發(fā)生死鎖。不安全狀態(tài)并不一定導(dǎo)致死鎖,因?yàn)榭蛻粑幢匦枰渥畲筚J款額度,但銀行家不敢抱這種僥幸心理。</p><p>  銀行家算法就是對(duì)每一個(gè)請(qǐng)求進(jìn)行檢查,檢查如果滿足它是否會(huì)導(dǎo)致不安全狀態(tài)。若是,則不滿足該請(qǐng)求;否

14、則便滿足。</p><p>  檢查狀態(tài)是否安全的方法是看他是否有足夠的資源滿足一個(gè)距最大需求最近的客戶。如果可以,則這筆投資認(rèn)為是能夠收回的,然后接著檢查下一個(gè)距最大需求最近的客戶,如此反復(fù)下去。</p><p>  如果所有投資最終都被收回,則該狀態(tài)是安全的,最初的請(qǐng)求可以批準(zhǔn)。</p><p><b>  1.2研究意義 :</b><

15、;/p><p>  在多道程序系統(tǒng)中,多個(gè)進(jìn)程的并發(fā)執(zhí)行來(lái)改善系統(tǒng)的資源利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險(xiǎn)——死鎖。所謂死鎖(Deadlock),是指多個(gè)進(jìn)程在運(yùn)行過(guò)程中因爭(zhēng)奪資源而造成的一種僵局(DeadlyEmbrace),當(dāng)進(jìn)程處于這種狀態(tài)時(shí),若無(wú)外力作用,他們都無(wú)法在向前推進(jìn)。</p><p>  要預(yù)防死鎖,有摒棄“請(qǐng)求和保持”條件,摒棄“不剝奪”條件,摒棄“環(huán)路等待”條件

16、等方法。</p><p>  但是,在預(yù)防死鎖的幾種方法之中,都施加了較強(qiáng)的限制條件;而在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)狀態(tài)分為安全狀態(tài)和不安全狀態(tài),便可避免死鎖的發(fā)生。</p><p>  而最具代表性的避免死鎖的算法,便是Dijkstra的銀行家算法。</p><p>  利用銀行家算法,我們可以來(lái)檢測(cè)CP

17、U為進(jìn)程分配資源的情況,決定CPU是否響應(yīng)某進(jìn)程的的請(qǐng)求并為其分配資源,從而很好避免了死鎖的產(chǎn)生。</p><p><b>  1.3結(jié)構(gòu)安排 :</b></p><p>  一、緒論: 介紹了題目背景以及研究意義。</p><p>  二、需求分析: 介紹了題目描述、銀行家算法、以及基本要求和所需達(dá)到的目的。</p><p

18、>  三、概要設(shè)計(jì):介紹了基本的算法思路、步驟,以及數(shù)據(jù)結(jié)構(gòu)和主要的函數(shù)模塊及其調(diào)用關(guān)系。</p><p>  四、詳細(xì)設(shè)計(jì):介紹了主要函數(shù)及其核心代碼,以及程序流程圖。</p><p><b>  五、測(cè)試</b></p><p><b>  六、總結(jié)</b></p><p><b&g

19、t;  參考文獻(xiàn)</b></p><p><b>  附錄:原程序清單</b></p><p><b>  2 需求分析</b></p><p><b>  2.1題目描述 :</b></p><p>  銀行家算法是一種最具有代表性的避免死鎖的算法。</p&

20、gt;<p>  要解釋銀行家算法,必須先解釋操作系統(tǒng)的安全狀態(tài)和不安全狀態(tài)。</p><p>  所謂安全狀態(tài),是指系統(tǒng)能按照某種進(jìn)程順序{P1,P2,…,Pn}(稱{P1,P2,…,Pn }序列為安全序列),來(lái)為每個(gè)進(jìn)程Pi分配其所需資源,直至滿足每個(gè)進(jìn)程對(duì)資源的最大需求,使每個(gè)進(jìn)程都可以順利完成。安全狀態(tài)一定沒(méi)有死鎖發(fā)生。</p><p>  如果系統(tǒng)無(wú)法找到這樣一個(gè)安

21、全序列,則稱系統(tǒng)處于不安全狀態(tài)。</p><p>  那么,什么是安全序列呢?</p><p>  如果對(duì)每一個(gè)進(jìn)程Pi(1<i<n),它以后尚需要的資源量不超過(guò)系統(tǒng)當(dāng)前可利用的資源量與所有的進(jìn)程Pj(j<n)所占有的資源量之和,則稱此進(jìn)程序列{P1,P2,…,Pn}是安全的,稱作安全序列。</p><p>  2.2銀行家算法 :</p&g

22、t;<p>  我們可以把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請(qǐng)求資源相當(dāng)于客戶向銀行家貸款。</p><p>  操作系統(tǒng)按銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請(qǐng)資源時(shí),要測(cè)試該進(jìn)程尚需求的資源量,若是系統(tǒng)現(xiàn)存的資源可以滿足它尚需求的資源量,則按當(dāng)前的申請(qǐng)量來(lái)分配資源,否則就推遲分配。</p><p>  當(dāng)進(jìn)程在執(zhí)行中繼續(xù)

23、申請(qǐng)資源時(shí),先測(cè)試該進(jìn)程申請(qǐng)的資源量是否超過(guò)了它尚需的資源量。若超過(guò)則拒絕分配,若沒(méi)有超過(guò)則再測(cè)試系統(tǒng)尚存的資源是否滿足該進(jìn)程尚需的資源量,若滿足即可按當(dāng)前的申請(qǐng)量來(lái)分配,若不滿足亦推遲分配。</p><p><b>  2.3基本要求 :</b></p><p> ?。?)可以輸入某系統(tǒng)的資源以及T0時(shí)刻進(jìn)程對(duì)資源的占用及需求情況的表項(xiàng),以及T0時(shí)刻系統(tǒng)的可利用資源

24、數(shù)。</p><p> ?。?)對(duì)T0時(shí)刻的進(jìn)行安全性檢測(cè),即檢測(cè)在T0時(shí)刻該狀態(tài)是否安全。</p><p>  (3)進(jìn)程申請(qǐng)資源,用銀行家算法對(duì)其進(jìn)行檢測(cè),分為以下三種情況:</p><p>  A. 所申請(qǐng)的資源大于其所需資源,提示分配不合理不予分配并返回</p><p>  B. 所申請(qǐng)的資源未大于其所需資源,但大于系統(tǒng)此時(shí)的可利用資

25、源,提示分配不合理不予分配并返回。</p><p>  C. 所申請(qǐng)的資源未大于其所需資源,亦未大于系統(tǒng)此時(shí)的可利用資源,預(yù)分配并進(jìn)行安全性檢查:</p><p>  a. 預(yù)分配后系統(tǒng)是安全的,將該進(jìn)程所申請(qǐng)的資源予以實(shí)際分配并打印后返回。</p><p>  b. 與分配后系統(tǒng)進(jìn)入不安全狀態(tài),提示系統(tǒng)不安全并返回。</p><p>  (

26、4)對(duì)輸入進(jìn)行檢查,即若輸入不符合條件,應(yīng)當(dāng)報(bào)錯(cuò)并返回重新輸入。</p><p><b>  2.4目的:</b></p><p>  根據(jù)設(shè)計(jì)題目的要求,充分地分析和理解題目,敘述系統(tǒng)的要求,明確程序要求實(shí)現(xiàn)的功能以及限制條件。</p><p>  明白自己需要用代碼實(shí)現(xiàn)的功能,清楚編寫(xiě)每部分代碼的目的,做到有的放矢,有條理不遺漏的用代碼實(shí)現(xiàn)

27、銀行家算法。</p><p><b>  3 概要設(shè)計(jì)</b></p><p><b>  3.1算法思路:</b></p><p>  先對(duì)用戶提出的請(qǐng)求進(jìn)行合法性檢查,即檢查請(qǐng)求是否大于需要的,是否大于可利用的。若請(qǐng)求合法,則進(jìn)行預(yù)分配,對(duì)分配后的狀態(tài)調(diào)用安全性算法進(jìn)行檢查。若安全,則分配;若不安全,則拒絕申請(qǐng),恢復(fù)到

28、原來(lái)的狀態(tài),拒絕申請(qǐng)。</p><p>  3.2銀行家算法步驟</p><p>  (1)如果Requesti<o(jì)r =Need,則轉(zhuǎn)向步驟(2);否則,認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過(guò)它所宣布的最大值。</p><p>  (2)如果Request<o(jì)r=Available,則轉(zhuǎn)向步驟(3);否則,表示系統(tǒng)中尚無(wú)足夠的資源,進(jìn)程必須等待。</p>

29、<p> ?。?)系統(tǒng)試探把要求的資源分配給進(jìn)程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:</p><p>  Available=Available-Request[i];</p><p>  Allocation=Allocation+Request;</p><p>  Need=Need-Request;</p><p>  (

30、4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。</p><p>  3.3安全性算法步驟</p><p><b>  (1)設(shè)置兩個(gè)向量</b></p><p> ?、俟ぷ飨蛄縒ork。它表示系統(tǒng)可提供進(jìn)程繼續(xù)運(yùn)行所需要的各類資源數(shù)目,執(zhí)行安全算法開(kāi)始時(shí),Work=Allocation;</p><p&g

31、t; ?、诓紶栂蛄縁inish。它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成,開(kāi)始時(shí)先做Finish[i]=false,當(dāng)有足夠資源分配給進(jìn)程時(shí),令Finish[i]=true。</p><p> ?。?)從進(jìn)程集合中找到一個(gè)能滿足下述條件的進(jìn)程:</p><p>  ①Finish[i]=false</p><p> ?、贜eed<or=Work<

32、;/p><p>  如找到,執(zhí)行步驟(3);否則,執(zhí)行步驟(4)。</p><p>  (3)當(dāng)進(jìn)程P獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:</p><p>  Work=Work+Allocation;</p><p>  Finish[i]=true; </p><p><b>

33、  轉(zhuǎn)向步驟(2)。</b></p><p> ?。?)如果所有進(jìn)程的Finish[i]=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。</p><p><b>  3.4數(shù)據(jù)結(jié)構(gòu):</b></p><p>  3.4. 1主要用到的數(shù)據(jù)結(jié)構(gòu):</p><p>  最大需求矩陣Max[][]&l

34、t;/p><p>  已分配矩陣Allocation[][]</p><p>  仍需求矩陣Need[][]=Max[][]-Allocation[][]</p><p>  可利用資源向量Available[]</p><p>  申請(qǐng)各類資源向量Request[]</p><p>  工作向量 work[] , Fin

35、ish[]</p><p>  3.4. 2程序模塊: </p><p>  public static void main(String[] args) //系統(tǒng)的主函數(shù)</p><p>  public void printFrame() //初始化</p><p>  public void print() //打印輸

36、出 </p><p>  public void Safty() //利用安全性算法進(jìn)行安全性檢測(cè)</p><p>  public void changdata(int i) //進(jìn)行資源分配</p><p>  void judge() //利用銀行家算法對(duì)申請(qǐng)資源進(jìn)行判定</p><p>  3.4. 3各模塊間的調(diào)用

37、關(guān)系:</p><p>  主函數(shù)void main()</p><p>  要調(diào)用: printFrame(),print(),Safty(),judge()</p><p>  安全性檢測(cè)函數(shù)Safty()</p><p>  要調(diào)用:print()</p><p>  銀行家算法函數(shù)judge()</p&g

38、t;<p>  要調(diào)用print()、Safty()、和judge()本身</p><p><b>  4 詳細(xì)設(shè)計(jì) </b></p><p>  4.1主要函數(shù)的核心代碼:</p><p>  進(jìn)行初始化輸入的函數(shù)</p><p><b>  打印輸出的函數(shù)</b></p>

39、;<p>  利用安全性算法進(jìn)行檢測(cè)的函數(shù)</p><p><b>  進(jìn)行資源分配的函數(shù)</b></p><p>  利用行家算法進(jìn)行判定的函數(shù)</p><p>  注:具體代碼請(qǐng)見(jiàn)附錄—源程序清單。</p><p><b>  4.2程序流程圖:</b></p>&l

40、t;p>  1.系統(tǒng)主要過(guò)程流程圖</p><p><b>  銀行家算法流程圖</b></p><p><b>  安全性算法流程圖</b></p><p>  注:程序流程圖是根據(jù)自己程序的整個(gè)流程制成,再插入進(jìn)來(lái)。</p><p><b>  5 測(cè)試</b><

41、;/p><p><b>  5.1測(cè)試用例:</b></p><p>  測(cè)試用例為課本上的例題:</p><p>  某系統(tǒng)有R1、R2和R3共3種資源,在T0時(shí)刻P1、P2、P3和P4這4個(gè)進(jìn)程對(duì)資源的占用和需求情況見(jiàn)下表,此刻系統(tǒng)的可用資源為(2,1,2)。</p><p>  進(jìn)程 最大需求量 占有量

42、 </p><p>  R1 R2 R3 R1 R2 R3</p><p>  P1 3 2 2 1 0 0</p><p>  P2 6 1 3 4 1 1</p><p>  P3 3 1 4 2 1 1</p>

43、<p>  P4 4 2 2 0 0 2 </p><p>  取了4種不同的例子,來(lái)測(cè)試系統(tǒng)的主要功能是否 實(shí)現(xiàn):</p><p>  進(jìn)程i Request[i] 檢測(cè)結(jié)果</p><p>  1 2 1 2 Request>Need<

44、;/p><p>  0 2 2 2 Request>Available</p><p>  1 1 0 1 可以分配</p><p>  0 1 0 1 系統(tǒng)不安全</p><p>  5.2測(cè)試結(jié)果截圖:</

45、p><p><b>  1.開(kāi)始界面</b></p><p><b>  初始化并打印輸出</b></p><p>  用例測(cè)試a:進(jìn)程1發(fā)出請(qǐng)求Request(2,1,2)——Request>Need,不予分配。</p><p>  用例測(cè)試b:進(jìn)程0發(fā)出請(qǐng)求Request(2,2,2)——Re

46、quest>Available, 不予分配。</p><p>  用例測(cè)試c:進(jìn)程1發(fā)出請(qǐng)求Request(1,0,1)——可以分配。</p><p>  用例測(cè)試d:進(jìn)程0發(fā)出請(qǐng)求Request(1,0,1)——系統(tǒng)不安全。</p><p>  輸入測(cè)試a:如果所輸入的要分配資源的進(jìn)程號(hào)不在存在的進(jìn)程,則報(bào)錯(cuò)請(qǐng)求重新輸入。</p><p&

47、gt;  輸入測(cè)試b:在選擇繼續(xù)分配還是退出中,如果輸入不符合要求,則報(bào)錯(cuò)請(qǐng)求重新輸入,連續(xù)錯(cuò)誤5次后系統(tǒng)將自動(dòng)關(guān)閉。</p><p><b>  6 總結(jié)</b></p><p>  在銀行家算法這個(gè)系統(tǒng)之中,所采用的數(shù)據(jù)結(jié)構(gòu)應(yīng)是最基本的部分。銀行家算法的數(shù)據(jù)結(jié)構(gòu)我們采用了一維數(shù)組與二維數(shù)組來(lái)存儲(chǔ),比如最大需求量Max[][]、已分配資源數(shù)Allocation[][

48、]、仍需求資源數(shù)Need[][]、以及系統(tǒng)可利用的資源數(shù)、申請(qǐng)各類資源等數(shù)組。</p><p>  數(shù)據(jù)結(jié)構(gòu)雖然重要但卻只是基礎(chǔ),而最主要的用以實(shí)現(xiàn)系統(tǒng)功能的應(yīng)該有兩個(gè)部分,一是用銀行家算法來(lái)判斷,二是用安全性算法來(lái)檢測(cè)系統(tǒng)的安全性。</p><p>  在本程序代碼中,銀行家算法用judge( )函數(shù)來(lái)實(shí)現(xiàn)。</p><p>  首先,輸入欲申請(qǐng)資源的進(jìn)程以及其所

49、申請(qǐng)的資源數(shù),存放在Request數(shù)組中。</p><p>  然后,判斷進(jìn)程請(qǐng)求的資源數(shù)是否大于其所需的資源數(shù),若大于則報(bào)錯(cuò)并返回,若不大于則繼續(xù)判斷它是否大于系統(tǒng)在此時(shí)刻可利用的資源數(shù),同樣,如果大于則報(bào)錯(cuò)并反回,如果不大于則調(diào)用changedata( )函數(shù)來(lái)進(jìn)行預(yù)分配,之后再調(diào)用安全型算法safty檢查。</p><p>  最后,無(wú)論此次分配是否成功,我們都可以選擇繼續(xù)分配或者退

50、出系統(tǒng)。</p><p>  安全性檢測(cè)我們是用safty( )函數(shù)來(lái)實(shí)現(xiàn)的。</p><p>  首先,F(xiàn)inish[]為布爾型,默認(rèn)是False,即該進(jìn)程未完成。而Work——即該系統(tǒng)中可以用來(lái)工作的資源數(shù)——最開(kāi)始為系統(tǒng)最初可以用的資源數(shù)。</p><p>  然后,我們從第一個(gè)進(jìn)程開(kāi)始判斷該進(jìn)程未完成且其所需求的資源量不大于該系統(tǒng)中可以用來(lái)工作的資源量這個(gè)條

51、件是否成立,即Finish[]=False且Need[][]<=Work[]是否成立。成立的話則將當(dāng)前在工作的資源量與該進(jìn)程已分配的資源量相加,存放于當(dāng)前可用來(lái)工作的資源量當(dāng)中,即Work[]=Work[]+Allocation,并將Finish[]的值改為T(mén)rue。否則便將此進(jìn)程的優(yōu)先級(jí)減一,排在隊(duì)位,然后開(kāi)始往后循環(huán)。</p><p>  待所有的進(jìn)程循環(huán)完畢,我們?cè)俅闻袛嗍欠襁€存在進(jìn)程的Finish[

52、]=False,如果仍存在,則說(shuō)明系統(tǒng)沒(méi)有安全序列,處于不安全狀態(tài),不可以進(jìn)行分配;否則,系統(tǒng)處于安全狀態(tài),將預(yù)分配變?yōu)閷?shí)際分配,求出安全序列并且將實(shí)際分配后的資源分配情況打印輸出。</p><p>  除此之外,在程序當(dāng)中,我們也得強(qiáng)調(diào)一下對(duì)輸入的合法性的判斷。比如,我們輸入的欲申請(qǐng)資源的進(jìn)程號(hào)沒(méi)有在系統(tǒng)已存在的進(jìn)程當(dāng)中,或者進(jìn)程號(hào)定義為整型,但是卻錯(cuò)輸成字母等情況,我們需要對(duì)這些情況進(jìn)行判斷,讓程序報(bào)錯(cuò)返回而

53、并非因錯(cuò)誤而中斷。</p><p>  這樣的情況處理起來(lái)比較麻煩,相當(dāng)于對(duì)每次輸入針對(duì)各種不同的情況都得做判斷。我也沒(méi)有涵蓋全部的輸入,僅僅只是對(duì)輸入的進(jìn)程號(hào)不在已存在進(jìn)程當(dāng)中、以及輸入的操作選擇不存在兩種情況分別作了判斷,并且針對(duì)第二種情況設(shè)定了五次輸入錯(cuò)誤的話系統(tǒng)關(guān)閉的功能。而因?yàn)閷?duì)于某些——比如進(jìn)程號(hào)——本來(lái)設(shè)定就是整型,因此對(duì)輸入的是字母的判別因比較復(fù)雜而未能加上。</p><p&g

54、t;  總之,銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來(lái)學(xué)習(xí)借鑒。</p><p><b>  參考文獻(xiàn)</b></p><p>  湯小丹,梁紅兵,哲鳳屏,湯子瀛.計(jì)算機(jī)操作系統(tǒng). 西安:西安電子科技大學(xué)出版社,2007.</p><p>  嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu). 北京:清華大學(xué)出版社,2006.</p&g

55、t;<p>  趙莉,楊國(guó)梁,孫喁喁,徐飛. Java程序設(shè)計(jì)教程. 西安:西安科技大學(xué)出版社,2009.</p><p>  [4] http://www.zhiwenweb.cn/default.asp?id=204 (志文工作室: 銀行家算法模擬實(shí)現(xiàn))</p><p><b>  附錄:源程序清單</b></p><p>

56、;<b>  /**</b></p><p><b>  * </b></p><p><b>  */</b></p><p><b>  /**</b></p><p>  * @author Administrator</p><

57、p><b>  *</b></p><p><b>  */</b></p><p>  package bank;</p><p>  import java.util.Scanner;</p><p>  public class Test </p><p><

58、;b>  {</b></p><p>  int no1, no2;</p><p>  static int Max[][]; //最大需求</p><p>  static int Allocation[][]; //已分配資源數(shù)</p><p>  static int Need[][];

59、 //仍需資源數(shù)</p><p>  static int Available[]; //可利用資源數(shù)</p><p>  static String name1[]; </p><p>  static String name2[]; </p><p>  static boolean[] Finish;

60、 </p><p>  static int[] temp = { 0 }; //存放安全序列</p><p>  static int work[];</p><p>  static int[] Request;</p><p>  Scanner input = new Scanner(System.in);</p&

61、gt;<p>  public static void main(String[] args) {</p><p>  Test t = new Test();</p><p>  t.printFrame();</p><p>  //t.print();</p><p>  t.Safty();</p><

62、;p>  t.judge();</p><p><b>  }</b></p><p>  /* 輸入初始化數(shù)據(jù)*/</p><p>  public void printFrame() </p><p><b>  {</b></p><p>  System.out

63、.println("*****************************************************");</p><p>  System.out.println("* *");</p><p>  System.

64、out.println("* 銀行家算法設(shè)計(jì)與實(shí)現(xiàn) *");</p><p>  System.out.println("* *");</p><p>  System.ou

65、t.println("*****************************************************");</p><p>  System.out.print("請(qǐng)輸入系統(tǒng)中進(jìn)程的個(gè)數(shù):");</p><p>  no1 = input.nextInt();</p><p>  System.ou

66、t.print("請(qǐng)輸入資源的種類數(shù):");</p><p>  no2 = input.nextInt();</p><p>  Max = new int[no1][no2];</p><p>  Allocation = new int[no1][no2];</p><p>  Need = new int[no1]

67、[no2];</p><p>  Available = new int[no2];</p><p>  name1 = new String[no1];</p><p>  name2 = new String[no2];</p><p>  int sum[] = new int[3];</p><p>  for

68、 (int i = 0; i < no1; i++) </p><p><b>  {</b></p><p>  System.out.print("請(qǐng)輸入進(jìn)程" + i + "的名字:");</p><p>  name1[i] = input.next();</p><p

69、><b>  }</b></p><p>  for (int i = 0; i < no2; i++) </p><p><b>  {</b></p><p>  System.out.print("請(qǐng)輸入資源" + i + "的名字:");</p>

70、<p>  name2[i] = input.next();</p><p><b>  }</b></p><p>  for (int i = 0; i < no1; i++) </p><p><b>  {</b></p><p>  for (int j = 0; j &l

71、t; no2; j++)</p><p><b>  {</b></p><p>  System.out.print("請(qǐng)輸入進(jìn)程" + name1[i] + "的" + name2[j]</p><p>  + "類資源最大需求量:");</p><p> 

72、 Max[i][j] = input.nextInt();</p><p><b>  }</b></p><p><b>  }</b></p><p>  for (int i = 0; i < no1; i++)</p><p><b>  {</b></p&

73、gt;<p>  for (int j = 0; j < no2; j++) </p><p><b>  {</b></p><p>  System.out.print("請(qǐng)輸入進(jìn)程" + name1[i] + "的" + name2[j]</p><p>  + "類資

74、源已占有資源量:");</p><p>  Allocation[i][j] = input.nextInt();</p><p>  Need[i][j] = Max[i][j] - Allocation[i][j];</p><p><b>  }</b></p><p><b>  }</

75、b></p><p>  for (int i = 0; i < no2; i++)</p><p><b>  {</b></p><p>  System.out.print("請(qǐng)輸入類資源" + name2[i] + "的可利用資源數(shù):");</p><p>  

76、Available[i] = input.nextInt();</p><p><b>  }</b></p><p>  //for (int i = 0; i < no2; i++) // 算出資源分配后,系統(tǒng)的可利用資源數(shù)</p><p><b>  // { </b></p><

77、p>  //for (int j = 0; j < no1; j++) </p><p>  //{sum[i] += Allocation[j][i]; }</p><p><b>  //}</b></p><p>  for (int i = 0; i < no2; i++)</p><p>

78、  {Available[i] = Available[i] - sum[i];}</p><p><b>  }</b></p><p><b>  /*打印輸出*/</b></p><p>  public void print()</p><p><b>  {</b>&

79、lt;/p><p>  System.out.println("**************此時(shí)刻資源分配情況**************");</p><p>  System.out.println(" Number Name Max Allocation Need");</p><p>  for

80、 (int i = 0; i < no1; i++)</p><p><b>  {</b></p><p>  System.out.print( " "+ i +" ");</p><p>  System.out.print(name1[i]+" "

81、);</p><p>  for (int j = 0; j < no2; j++) </p><p>  {System.out.print(Max[i][j]+" ");}</p><p>  for (int j = 0; j < no2; j++) </p><p>  {System.out.prin

82、t(" "+ Allocation[i][j]);}</p><p>  for (int j = 0; j < no2; j++)</p><p>  {System.out.print(" " + Need[i][j]);}</p><p>  System.out.println();</p>

83、<p><b>  }</b></p><p>  System.out.print("各個(gè)類資源可利用的資源數(shù)分別為:");</p><p>  for (int j = 0; j < no2; j++) </p><p>  {System.out.print(" " + Avail

84、able[j]);}</p><p>  System.out.println();</p><p><b>  }</b></p><p><b>  /**</b></p><p><b>  * 進(jìn)行安全性檢測(cè)</b></p><p><b&

85、gt;  */</b></p><p>  public void Safty() {</p><p>  Finish = new boolean[no1];</p><p>  temp = new int[no1];</p><p>  int i, k = 0, m, apply,j;//k為安全序列的序列數(shù)</p&

86、gt;<p>  work = new int[no2];</p><p>  for (i = 0; i < no2; i++) </p><p>  {work[i] = Available[i];}</p><p>  for (i = 0; i < no1; i++) //當(dāng)前執(zhí)行換后,重第一個(gè)開(kāi)始檢測(cè)</p>&

87、lt;p><b>  {</b></p><p>  apply = 0;</p><p>  for (j = 0; j < no2; j++) </p><p><b>  {</b></p><p>  if (Finish[i] == false && Need[

88、i][j] <= work[j]) //</p><p><b>  {</b></p><p><b>  apply++;</b></p><p>  if (apply == no2)</p><p><b>  {</b></p><p&g

89、t;  for (m = 0; m < no2; m++)</p><p>  work[m] = work[m] + Allocation[i][m];// 變分配數(shù)</p><p>  Finish[i] = true;</p><p>  temp[k] = i+1; //保存安全序列</p><p>  i = -1;

90、 //</p><p><b>  k++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b

91、></p><p>  for (i = 0; i < no2; i++)</p><p><b>  {</b></p><p>  if (Finish[i] == false) {System.out.println("系統(tǒng)不安全!");}</p><p><b>  el

92、se </b></p><p><b>  {</b></p><p>  System.out.print("系統(tǒng)安全,安全序列為:");</p><p>  for (i = 0; i < no1; i++) // 輸出運(yùn)行進(jìn)程數(shù)組</p><p>  { System

93、.out.print(temp[i] + "-->"); }</p><p>  System.out.println();</p><p><b>  print();</b></p><p><b>  }</b></p><p><b>  }</b&

94、gt;</p><p><b>  }</b></p><p>  /* 進(jìn)行資源分配 */</p><p>  public void changdata(int i) </p><p><b>  {</b></p><p><b>  int j;</b

95、></p><p>  for (j = 0; j < no2; j++) </p><p><b>  {</b></p><p>  Available[j] = Available[j] - Request[j];</p><p>  Allocation[i][j] = Allocation[i][j

96、] + Request[j];</p><p>  Need[i][j] = Need[i][j] - Request[j];</p><p><b>  }</b></p><p><b>  }</b></p><p>  /* 利用銀行家算法對(duì)申請(qǐng)資源對(duì)進(jìn)行判定*/</p>&l

97、t;p>  void judge() </p><p><b>  {</b></p><p>  Request = new int[no2];</p><p>  char ch='y';</p><p>  int i = 0, j = 0;</p><p>  Sys

98、tem.out.print("請(qǐng)輸入要分配的資源進(jìn)程號(hào):");</p><p>  for(j=0;j<10;j++)</p><p><b>  {</b></p><p>  i = input.nextInt();</p><p>  if(i>no1) </p>&l

99、t;p>  {System.out.println("輸入錯(cuò)誤,請(qǐng)重新輸入:");continue;}</p><p>  else break; </p><p><b>  }</b></p><p>  // System.out.println("錯(cuò)誤次數(shù)太多,看來(lái)你丫今天不適合進(jìn)行操作,系統(tǒng)退

100、出!");</p><p>  // System.exit(0);}</p><p>  System.out.println("請(qǐng)輸入進(jìn)程" + i + "申請(qǐng)的資源:");</p><p>  for (j = 0; j < no2; j++)</p><p><b> 

101、 {</b></p><p>  System.out.print(name2[j] + "類資源請(qǐng)求:");</p><p>  Request[j] = input.nextInt();// 輸入需要申請(qǐng)的資源</p><p><b>  }</b></p><p>  for (j

102、= 0; j < no2; j++)</p><p><b>  {</b></p><p>  if (Request[j] > Need[i][j]) // 判斷申請(qǐng)是否大于需求,若大于則出錯(cuò)</p><p><b>  {</b></p><p>  System.out.pri

103、ntln("進(jìn)程" + i + "申請(qǐng)的資源大于它所需要的資源。");</p><p>  System.out.println("分配不合理,不予分配!");</p><p><b>  ch = 'n';</b></p><p><b>  break;&

104、lt;/b></p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if (Request[j] > Available[j])// 判斷申請(qǐng)是否大于當(dāng)前資源,若大于則&l

105、t;/p><p><b>  {</b></p><p>  System.out.println("進(jìn)程" + i + "申請(qǐng)的資源大于系統(tǒng)現(xiàn)在可利用的資源。");</p><p>  System.out.println("分配不合理,不予分配!"); </p>&

106、lt;p><b>  ch = 'n';</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b&

107、gt;</p><p>  if (ch == 'y') </p><p><b>  {</b></p><p>  changdata(i); // 根據(jù)進(jìn)程需求量變換資源</p><p>  Safty(); // 根據(jù)進(jìn)程需求量進(jìn)行銀行家算法判斷</p><p&g

108、t;<b>  }</b></p><p>  System.out.println("請(qǐng)輸入您所要進(jìn)行的操作:1:繼續(xù)分配 2:退出");</p><p>  for(i=0;i<5;i++)</p><p><b>  {</b></p><p>  int choic

109、e = input.nextInt();</p><p>  if (choice == 1) judge();</p><p>  else if (choice == 2) System.exit(0);</p><p>  else System.out.println("輸入錯(cuò)誤,請(qǐng)重新輸入:");</p><p

110、><b>  }</b></p><p>  System.out.println("錯(cuò)誤次數(shù)太多,看來(lái)你丫的今天不適合進(jìn)行操作,系統(tǒng)退出!");</p><p>  System.exit(0);</p><p><b>  }</b></p><p><b>

溫馨提示

  • 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論