版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 操作系統(tǒng)課程設計報告</p><p><b> 題目:銀行家算法</b></p><p> 院 (系): 計算機科學與工程學院 </p><p> 專業(yè)班級: 電子信息技術及儀器10-2 </p><p> 姓名: 王中課
2、 </p><p> 學號: 2010302978 </p><p> 指導教師: 任萍 </p><p> 操作系統(tǒng)課程設計報告</p><p><b> 摘 要</b><
3、;/p><p> Dijkstra提出的銀行家算法,是最具代表性的避免死鎖的算法。</p><p> 本文對如何用銀行家算法來處理操作系統(tǒng)給進程分配資源做了詳細的說明,包括需求分析、概要設計、詳細設計、測試與分析、總結、源程序清單。 </p><p> 首先做了需求分析,解釋了什么是銀行家算法,并指出它在資源分配中的</p><p&g
4、t;<b> 重要作用。</b></p><p> 然后給出了銀行家算法的概要設計,包括算法思路、步驟,以及要用到的主要數(shù)據(jù)結構、函數(shù)模塊及其之間的調(diào)用關系等。</p><p> 在概要設計的基礎上,又給出了詳細的算法設計,實現(xiàn)概要設計中定義的所有函數(shù),對每個函數(shù)寫出核心算法,并畫出了流程圖。</p><p> 接著對編碼進行了測試與分
5、析(并在最后附上Java編寫的程序代碼)。</p><p> 最后對整個設計過程進行了總結。</p><p> 關鍵詞:安全狀態(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結構安排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概要設計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ù)結構5</b></p><p>
9、; 3.4.1主要用到的數(shù)據(jù)結構6</p><p> 3.4.2程序模塊6</p><p> 3.4.3各模塊間的調(diào)用關系6</p><p><b> 4詳細設計4</b></p><p> 4.1主要函數(shù)的核心代碼5</p><p> 4.1程序流程圖5</p>
10、;<p><b> 5測試4</b></p><p><b> 5.1測試用例5</b></p><p> 5.1測試結果分析和截圖5</p><p><b> 6總結4</b></p><p><b> 參考文獻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、一個小城鎮(zhèn)的銀行家,他向一群客戶分別承諾了一定的貸款額度,每個客戶都有一個貸款額度,銀行家知道不可能所有客戶同時都需要最大貸款額,所以他只保留一定單位的資金來為客戶服務,而不是滿足所有客戶貸款需求的最大單位。</p><p> 這里將客戶比作進程,貸款比作設備,銀行家比作系統(tǒng)。</p><p> 客戶們各自做自己的生意,在某些時刻需要貸款。在某一時刻,客戶已獲得的貸款和可用的最大數(shù)額貸
13、款稱為與資源分配相關的系統(tǒng)狀態(tài)。一個狀態(tài)被稱為是安全的,其條件是存在一個狀態(tài)序列能夠使所有的客戶均得到其所需的貸款。如果忽然所有的客戶都申請,希望得到最大貸款額,而銀行家無法滿足其中任何一個的要求,則發(fā)生死鎖。不安全狀態(tài)并不一定導致死鎖,因為客戶未必需要其最大貸款額度,但銀行家不敢抱這種僥幸心理。</p><p> 銀行家算法就是對每一個請求進行檢查,檢查如果滿足它是否會導致不安全狀態(tài)。若是,則不滿足該請求;否
14、則便滿足。</p><p> 檢查狀態(tài)是否安全的方法是看他是否有足夠的資源滿足一個距最大需求最近的客戶。如果可以,則這筆投資認為是能夠收回的,然后接著檢查下一個距最大需求最近的客戶,如此反復下去。</p><p> 如果所有投資最終都被收回,則該狀態(tài)是安全的,最初的請求可以批準。</p><p><b> 1.2研究意義 :</b><
15、;/p><p> 在多道程序系統(tǒng)中,多個進程的并發(fā)執(zhí)行來改善系統(tǒng)的資源利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險——死鎖。所謂死鎖(Deadlock),是指多個進程在運行過程中因爭奪資源而造成的一種僵局(DeadlyEmbrace),當進程處于這種狀態(tài)時,若無外力作用,他們都無法在向前推進。</p><p> 要預防死鎖,有摒棄“請求和保持”條件,摒棄“不剝奪”條件,摒棄“環(huán)路等待”條件
16、等方法。</p><p> 但是,在預防死鎖的幾種方法之中,都施加了較強的限制條件;而在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)狀態(tài)分為安全狀態(tài)和不安全狀態(tài),便可避免死鎖的發(fā)生。</p><p> 而最具代表性的避免死鎖的算法,便是Dijkstra的銀行家算法。</p><p> 利用銀行家算法,我們可以來檢測CP
17、U為進程分配資源的情況,決定CPU是否響應某進程的的請求并為其分配資源,從而很好避免了死鎖的產(chǎn)生。</p><p><b> 1.3結構安排 :</b></p><p> 一、緒論: 介紹了題目背景以及研究意義。</p><p> 二、需求分析: 介紹了題目描述、銀行家算法、以及基本要求和所需達到的目的。</p><p
18、> 三、概要設計:介紹了基本的算法思路、步驟,以及數(shù)據(jù)結構和主要的函數(shù)模塊及其調(diào)用關系。</p><p> 四、詳細設計:介紹了主要函數(shù)及其核心代碼,以及程序流程圖。</p><p><b> 五、測試</b></p><p><b> 六、總結</b></p><p><b&g
19、t; 參考文獻</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)能按照某種進程順序{P1,P2,…,Pn}(稱{P1,P2,…,Pn }序列為安全序列),來為每個進程Pi分配其所需資源,直至滿足每個進程對資源的最大需求,使每個進程都可以順利完成。安全狀態(tài)一定沒有死鎖發(fā)生。</p><p> 如果系統(tǒng)無法找到這樣一個安
21、全序列,則稱系統(tǒng)處于不安全狀態(tài)。</p><p> 那么,什么是安全序列呢?</p><p> 如果對每一個進程Pi(1<i<n),它以后尚需要的資源量不超過系統(tǒng)當前可利用的資源量與所有的進程Pj(j<n)所占有的資源量之和,則稱此進程序列{P1,P2,…,Pn}是安全的,稱作安全序列。</p><p> 2.2銀行家算法 :</p&g
22、t;<p> 我們可以把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當于銀行家管理的資金,進程向操作系統(tǒng)請求資源相當于客戶向銀行家貸款。</p><p> 操作系統(tǒng)按銀行家制定的規(guī)則為進程分配資源,當進程首次申請資源時,要測試該進程尚需求的資源量,若是系統(tǒng)現(xiàn)存的資源可以滿足它尚需求的資源量,則按當前的申請量來分配資源,否則就推遲分配。</p><p> 當進程在執(zhí)行中繼續(xù)
23、申請資源時,先測試該進程申請的資源量是否超過了它尚需的資源量。若超過則拒絕分配,若沒有超過則再測試系統(tǒng)尚存的資源是否滿足該進程尚需的資源量,若滿足即可按當前的申請量來分配,若不滿足亦推遲分配。</p><p><b> 2.3基本要求 :</b></p><p> ?。?)可以輸入某系統(tǒng)的資源以及T0時刻進程對資源的占用及需求情況的表項,以及T0時刻系統(tǒng)的可利用資源
24、數(shù)。</p><p> ?。?)對T0時刻的進行安全性檢測,即檢測在T0時刻該狀態(tài)是否安全。</p><p> ?。?)進程申請資源,用銀行家算法對其進行檢測,分為以下三種情況:</p><p> A. 所申請的資源大于其所需資源,提示分配不合理不予分配并返回</p><p> B. 所申請的資源未大于其所需資源,但大于系統(tǒng)此時的可利用資
25、源,提示分配不合理不予分配并返回。</p><p> C. 所申請的資源未大于其所需資源,亦未大于系統(tǒng)此時的可利用資源,預分配并進行安全性檢查:</p><p> a. 預分配后系統(tǒng)是安全的,將該進程所申請的資源予以實際分配并打印后返回。</p><p> b. 與分配后系統(tǒng)進入不安全狀態(tài),提示系統(tǒng)不安全并返回。</p><p> ?。?/p>
26、4)對輸入進行檢查,即若輸入不符合條件,應當報錯并返回重新輸入。</p><p><b> 2.4目的:</b></p><p> 根據(jù)設計題目的要求,充分地分析和理解題目,敘述系統(tǒng)的要求,明確程序要求實現(xiàn)的功能以及限制條件。</p><p> 明白自己需要用代碼實現(xiàn)的功能,清楚編寫每部分代碼的目的,做到有的放矢,有條理不遺漏的用代碼實現(xiàn)
27、銀行家算法。</p><p><b> 3 概要設計</b></p><p><b> 3.1算法思路:</b></p><p> 先對用戶提出的請求進行合法性檢查,即檢查請求是否大于需要的,是否大于可利用的。若請求合法,則進行預分配,對分配后的狀態(tài)調(diào)用安全性算法進行檢查。若安全,則分配;若不安全,則拒絕申請,恢復到
28、原來的狀態(tài),拒絕申請。</p><p> 3.2銀行家算法步驟</p><p> ?。?)如果Requesti<or =Need,則轉向步驟(2);否則,認為出錯,因為它所需要的資源數(shù)已超過它所宣布的最大值。</p><p> ?。?)如果Request<or=Available,則轉向步驟(3);否則,表示系統(tǒng)中尚無足夠的資源,進程必須等待。</p>
29、<p> ?。?)系統(tǒng)試探把要求的資源分配給進程Pi,并修改下面數(shù)據(jù)結構中的數(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)設置兩個向量</b></p><p> ?、俟ぷ飨蛄縒ork。它表示系統(tǒng)可提供進程繼續(xù)運行所需要的各類資源數(shù)目,執(zhí)行安全算法開始時,Work=Allocation;</p><p&g
31、t; ?、诓紶栂蛄縁inish。它表示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成,開始時先做Finish[i]=false,當有足夠資源分配給進程時,令Finish[i]=true。</p><p> ?。?)從進程集合中找到一個能滿足下述條件的進程:</p><p> ?、貴inish[i]=false</p><p> ?、贜eed<or=Work<
32、;/p><p> 如找到,執(zhí)行步驟(3);否則,執(zhí)行步驟(4)。</p><p> ?。?)當進程P獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應執(zhí)行:</p><p> Work=Work+Allocation;</p><p> Finish[i]=true; </p><p><b>
33、 轉向步驟(2)。</b></p><p> ?。?)如果所有進程的Finish[i]=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。</p><p><b> 3.4數(shù)據(jù)結構:</b></p><p> 3.4. 1主要用到的數(shù)據(jù)結構:</p><p> 最大需求矩陣Max[][]&l
34、t;/p><p> 已分配矩陣Allocation[][]</p><p> 仍需求矩陣Need[][]=Max[][]-Allocation[][]</p><p> 可利用資源向量Available[]</p><p> 申請各類資源向量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() //利用安全性算法進行安全性檢測</p><p> public void changdata(int i) //進行資源分配</p><p> void judge() //利用銀行家算法對申請資源進行判定</p><p> 3.4. 3各模塊間的調(diào)用
37、關系:</p><p> 主函數(shù)void main()</p><p> 要調(diào)用: printFrame(),print(),Safty(),judge()</p><p> 安全性檢測函數(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 詳細設計 </b></p><p> 4.1主要函數(shù)的核心代碼:</p><p> 進行初始化輸入的函數(shù)</p><p><b> 打印輸出的函數(shù)</b></p>
39、;<p> 利用安全性算法進行檢測的函數(shù)</p><p><b> 進行資源分配的函數(shù)</b></p><p> 利用行家算法進行判定的函數(shù)</p><p> 注:具體代碼請見附錄—源程序清單。</p><p><b> 4.2程序流程圖:</b></p>&l
40、t;p> 1.系統(tǒng)主要過程流程圖</p><p><b> 銀行家算法流程圖</b></p><p><b> 安全性算法流程圖</b></p><p> 注:程序流程圖是根據(jù)自己程序的整個流程制成,再插入進來。</p><p><b> 5 測試</b><
41、;/p><p><b> 5.1測試用例:</b></p><p> 測試用例為課本上的例題:</p><p> 某系統(tǒng)有R1、R2和R3共3種資源,在T0時刻P1、P2、P3和P4這4個進程對資源的占用和需求情況見下表,此刻系統(tǒng)的可用資源為(2,1,2)。</p><p> 進程 最大需求量 占有量
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種不同的例子,來測試系統(tǒng)的主要功能是否 實現(xiàn):</p><p> 進程i Request[i] 檢測結果</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測試結果截圖:</
45、p><p><b> 1.開始界面</b></p><p><b> 初始化并打印輸出</b></p><p> 用例測試a:進程1發(fā)出請求Request(2,1,2)——Request>Need,不予分配。</p><p> 用例測試b:進程0發(fā)出請求Request(2,2,2)——Re
46、quest>Available, 不予分配。</p><p> 用例測試c:進程1發(fā)出請求Request(1,0,1)——可以分配。</p><p> 用例測試d:進程0發(fā)出請求Request(1,0,1)——系統(tǒng)不安全。</p><p> 輸入測試a:如果所輸入的要分配資源的進程號不在存在的進程,則報錯請求重新輸入。</p><p&
47、gt; 輸入測試b:在選擇繼續(xù)分配還是退出中,如果輸入不符合要求,則報錯請求重新輸入,連續(xù)錯誤5次后系統(tǒng)將自動關閉。</p><p><b> 6 總結</b></p><p> 在銀行家算法這個系統(tǒng)之中,所采用的數(shù)據(jù)結構應是最基本的部分。銀行家算法的數(shù)據(jù)結構我們采用了一維數(shù)組與二維數(shù)組來存儲,比如最大需求量Max[][]、已分配資源數(shù)Allocation[][
48、]、仍需求資源數(shù)Need[][]、以及系統(tǒng)可利用的資源數(shù)、申請各類資源等數(shù)組。</p><p> 數(shù)據(jù)結構雖然重要但卻只是基礎,而最主要的用以實現(xiàn)系統(tǒng)功能的應該有兩個部分,一是用銀行家算法來判斷,二是用安全性算法來檢測系統(tǒng)的安全性。</p><p> 在本程序代碼中,銀行家算法用judge( )函數(shù)來實現(xiàn)。</p><p> 首先,輸入欲申請資源的進程以及其所
49、申請的資源數(shù),存放在Request數(shù)組中。</p><p> 然后,判斷進程請求的資源數(shù)是否大于其所需的資源數(shù),若大于則報錯并返回,若不大于則繼續(xù)判斷它是否大于系統(tǒng)在此時刻可利用的資源數(shù),同樣,如果大于則報錯并反回,如果不大于則調(diào)用changedata( )函數(shù)來進行預分配,之后再調(diào)用安全型算法safty檢查。</p><p> 最后,無論此次分配是否成功,我們都可以選擇繼續(xù)分配或者退
50、出系統(tǒng)。</p><p> 安全性檢測我們是用safty( )函數(shù)來實現(xiàn)的。</p><p> 首先,F(xiàn)inish[]為布爾型,默認是False,即該進程未完成。而Work——即該系統(tǒng)中可以用來工作的資源數(shù)——最開始為系統(tǒng)最初可以用的資源數(shù)。</p><p> 然后,我們從第一個進程開始判斷該進程未完成且其所需求的資源量不大于該系統(tǒng)中可以用來工作的資源量這個條
51、件是否成立,即Finish[]=False且Need[][]<=Work[]是否成立。成立的話則將當前在工作的資源量與該進程已分配的資源量相加,存放于當前可用來工作的資源量當中,即Work[]=Work[]+Allocation,并將Finish[]的值改為True。否則便將此進程的優(yōu)先級減一,排在隊位,然后開始往后循環(huán)。</p><p> 待所有的進程循環(huán)完畢,我們再次判斷是否還存在進程的Finish[
52、]=False,如果仍存在,則說明系統(tǒng)沒有安全序列,處于不安全狀態(tài),不可以進行分配;否則,系統(tǒng)處于安全狀態(tài),將預分配變?yōu)閷嶋H分配,求出安全序列并且將實際分配后的資源分配情況打印輸出。</p><p> 除此之外,在程序當中,我們也得強調(diào)一下對輸入的合法性的判斷。比如,我們輸入的欲申請資源的進程號沒有在系統(tǒng)已存在的進程當中,或者進程號定義為整型,但是卻錯輸成字母等情況,我們需要對這些情況進行判斷,讓程序報錯返回而
53、并非因錯誤而中斷。</p><p> 這樣的情況處理起來比較麻煩,相當于對每次輸入針對各種不同的情況都得做判斷。我也沒有涵蓋全部的輸入,僅僅只是對輸入的進程號不在已存在進程當中、以及輸入的操作選擇不存在兩種情況分別作了判斷,并且針對第二種情況設定了五次輸入錯誤的話系統(tǒng)關閉的功能。而因為對于某些——比如進程號——本來設定就是整型,因此對輸入的是字母的判別因比較復雜而未能加上。</p><p&g
54、t; 總之,銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來學習借鑒。</p><p><b> 參考文獻</b></p><p> 湯小丹,梁紅兵,哲鳳屏,湯子瀛.計算機操作系統(tǒng). 西安:西安電子科技大學出版社,2007.</p><p> 嚴蔚敏,吳偉民.數(shù)據(jù)結構. 北京:清華大學出版社,2006.</p&g
55、t;<p> 趙莉,楊國梁,孫喁喁,徐飛. Java程序設計教程. 西安:西安科技大學出版社,2009.</p><p> [4] http://www.zhiwenweb.cn/default.asp?id=204 (志文工作室: 銀行家算法模擬實現(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("* 銀行家算法設計與實現(xiàn) *");</p><p> System.out.println("* *");</p><p> System.ou
65、t.println("*****************************************************");</p><p> System.out.print("請輸入系統(tǒng)中進程的個數(shù):");</p><p> no1 = input.nextInt();</p><p> System.ou
66、t.print("請輸入資源的種類數(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("請輸入進程" + 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("請輸入資源" + 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("請輸入進程" + 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("請輸入進程" + 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("請輸入類資源" + 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("**************此時刻資源分配情況**************");</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("各個類資源可利用的資源數(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> * 進行安全性檢測</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++) //當前執(zhí)行換后,重第一個開始檢測</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++) // 輸出運行進程數(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> /* 進行資源分配 */</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> /* 利用銀行家算法對申請資源對進行判定*/</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("請輸入要分配的資源進程號:");</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("輸入錯誤,請重新輸入:");continue;}</p><p> else break; </p><p><b> }</b></p><p> // System.out.println("錯誤次數(shù)太多,看來你丫今天不適合進行操作,系統(tǒng)退
100、出!");</p><p> // System.exit(0);}</p><p> System.out.println("請輸入進程" + i + "申請的資源:");</p><p> for (j = 0; j < no2; j++)</p><p><b>
101、 {</b></p><p> System.out.print(name2[j] + "類資源請求:");</p><p> Request[j] = input.nextInt();// 輸入需要申請的資源</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]) // 判斷申請是否大于需求,若大于則出錯</p><p><b> {</b></p><p> System.out.pri
103、ntln("進程" + i + "申請的資源大于它所需要的資源。");</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])// 判斷申請是否大于當前資源,若大于則&l
105、t;/p><p><b> {</b></p><p> System.out.println("進程" + i + "申請的資源大于系統(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ù)進程需求量變換資源</p><p> Safty(); // 根據(jù)進程需求量進行銀行家算法判斷</p><p&g
108、t;<b> }</b></p><p> System.out.println("請輸入您所要進行的操作: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("輸入錯誤,請重新輸入:");</p><p
110、><b> }</b></p><p> System.out.println("錯誤次數(shù)太多,看來你丫的今天不適合進行操作,系統(tǒng)退出!");</p><p> System.exit(0);</p><p><b> }</b></p><p><b>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設計---銀行家算法
- 操作系統(tǒng)課程設計銀行家算法
- 操作系統(tǒng)課程設計--銀行家算法
- 操作系統(tǒng)課程設計(銀行家算法)
- 操作系統(tǒng)課程設計-銀行家算法
- 操作系統(tǒng)課程設計--銀行家算法
- 操作系統(tǒng)課程設計--銀行家算法
- 操作系統(tǒng)課程設計(銀行家算法設計)
- 操作系統(tǒng)課程設計--銀行家算法 (3)
- 操作系統(tǒng)課程設計---銀行家算法 (2)
- 操作系統(tǒng)課程設計--銀行家算法 (2)
- 操作系統(tǒng)課程設計---模擬銀行家算法
- 操作系統(tǒng)課程設計---銀行家算法實現(xiàn)
- 操作系統(tǒng)課程設計報告—銀行家算法
- 操作系統(tǒng)原理課程設計--銀行家算法
- 操作系統(tǒng)課程設計報告—銀行家算法
- 操作系統(tǒng)課程設計---銀行家算法報告
- 操作系統(tǒng)課程設計-模擬銀行家算法-課程設計
- 操作系統(tǒng)課程設計報告---模擬實現(xiàn)銀行家算法
- 操作系統(tǒng)課程設計——銀行家算法的模擬實現(xiàn)
評論
0/150
提交評論