版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告書</b></p><p> 課程設(shè)計題目 銀行家算法 </p><p> 課 程 名 稱 計算機操作系統(tǒng) </p><p><b> 目錄</b></p><p> 1.設(shè)計目的…
2、………………………………….……….........…1</p><p> 2.設(shè)計要求……………………………………………..…..…..2</p><p> 3.設(shè)計的選題背景及設(shè)計計劃</p><p> 1)選題背景…………………………..…….…………..….3</p><p> 2)設(shè)計應(yīng)達(dá)到的要求………………….......
3、......……...…4</p><p><b> 4概要設(shè)計</b></p><p> 1)銀行家算法步驟………………….............……...….5</p><p> 2)安全性算法步驟………………….............……...….6</p><p> 3)主要數(shù)據(jù)結(jié)構(gòu)設(shè)計…………………
4、.............……...….6</p><p><b> 5.設(shè)計實現(xiàn)過程</b></p><p> 1)算法整體設(shè)計與調(diào)用7</p><p><b> 2)程序流程圖7</b></p><p> 6.設(shè)計結(jié)果驗證…………………..………………………....9</p&g
5、t;<p><b> 7.設(shè)計存在的不足</b></p><p> 程序設(shè)計繁雜…………………………………..………..11</p><p> 8.設(shè)計總結(jié)………………………………………………..…11</p><p> 9.參考文獻 ………………………………………..…13</p><p&g
6、t; 附錄:源程序清單…………………………………………..13</p><p><b> 設(shè)計目的</b></p><p> 銀行家算法是一種最有代表性的避免死鎖的算法。把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)則為進程分配資源,當(dāng)進程首次申請資源時,要測試該進程
7、對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請量分配資源,否則就推遲分配。當(dāng)進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當(dāng)前的申請量分配資源,否則也要推遲分配。</p><p> 本次課程設(shè)計通過在UNIX環(huán)境中用C語言
8、編寫和終端調(diào)試實現(xiàn)銀行家算法的程序,達(dá)到進一步掌握銀行家算法,理解系統(tǒng)產(chǎn)生死鎖的原因以及系統(tǒng)避免死鎖的方法,增強理論聯(lián)系實際的能力的目的。</p><p><b> 設(shè)計要求</b></p><p> 對銀行家算法進行編程,使之:</p><p> ?。?)可以輸入某系統(tǒng)的資源以及T0時刻進程對資源的占用及需求情況的表項,以及T0時刻系統(tǒng)的
9、可利用資源數(shù)。</p><p> (2)對T0時刻的進行安全性檢測,即檢測在T0時刻該狀態(tài)是否安全。</p><p> ?。?)進程申請資源,用銀行家算法對其進行檢測,分為以下三種情況:</p><p> A. 所申請的資源大于其所需資源,提示分配不合理不予分配并返回。</p><p> B. 所申請的資源未大于其所需資源,但大于系統(tǒng)此
10、時的可利用資源,提示分配不合理不予分配并返回。</p><p> C. 所申請的資源未大于其所需資源,亦未大于系統(tǒng)此時的可利用資源,預(yù)分配并進行安全性檢查:</p><p> a. 預(yù)分配后系統(tǒng)是安全的,將該進程所申請的資源予以實際分配并 打印后返回。</p><p> b. 與分配后系統(tǒng)進入不安全狀態(tài),提示系統(tǒng)不安全并返回。</p><p
11、> ?。?)對輸入進行檢查,即若輸入不符合條件,應(yīng)當(dāng)報錯并返回重新輸入。</p><p> 3.設(shè)計的選題背景及設(shè)計計劃</p><p><b> 1)選題背景</b></p><p> 我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家 管理的資金,進程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。操作系統(tǒng)按照銀
12、行家制定的規(guī)則為進程分配資源,當(dāng)進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請量分配資源,否則就推遲分配。當(dāng)進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進程對資源的最大 需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當(dāng)前的申請量分配資源,否則也要推遲 分配。</p&g
13、t;<p> 2)設(shè)計應(yīng)達(dá)到的要求</p><p><b> 5.2死鎖預(yù)防: </b></p><p> 預(yù)防死鎖的方法是使產(chǎn)生死鎖的四個必要條件中的2、3、4條件之一不能成立。即:</p><p> 一、摒棄“請求和保持”條件。系統(tǒng)規(guī)定所有進程在開始運行之前,都必須一次性申請其在整個運行過程中所需的全部資源。使該進程再
14、整個運行過程中不會提出資源請求,因而摒棄了請求條件。又由于進程在等待期間沒有占有任何資源,所以也摒棄了保持條件。</p><p> 二、摒棄“不剝奪”條件。系統(tǒng)規(guī)定,進程逐個提出對資源的要求,當(dāng)一個已經(jīng)保持了某些資源的進程,再提出新的資源請求而未被滿足時,必須釋放已經(jīng)保持的所有資源,待以后需要是在再重新申請。</p><p> 三、摒棄“環(huán)路等待”條件。系統(tǒng)規(guī)定所有資源按類型進行線性排
15、隊,并賦予不同的序號。所有進程對資源的請求都必須嚴(yán)格按資源序號遞增的順序提出。</p><p> 5.3安全狀態(tài)與不安全狀態(tài) </p><p> 在避免死鎖的算法中,允許進程動態(tài)地申請資源,系統(tǒng)在進行資源分配之前,先計算資源分配的安全性。若此次分配不會使系統(tǒng)進入不安全狀態(tài),便將資源分配給該進程否則進程等待。</p><p> 安全狀態(tài)是指,系統(tǒng)能按某種進程順序
16、(P1, P2, P3,…,Pn),來為每個進程分配所需資源,直至滿足每個進程對資源的最大需求,是每個進曾都可以順利完成。</p><p> 如果系統(tǒng)找不到這樣一個序列,系統(tǒng)就處于不安全狀態(tài)。雖然并非所有的不安全狀態(tài)都是死鎖狀態(tài),但當(dāng)系統(tǒng)進入不安全狀態(tài)后,便可能進入死鎖狀態(tài)。只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可以避免進入不安全狀態(tài)。</p><p> 安全序列:一個進程序列{P1,…,Pn}
17、是安全的,如果對于每一個進程Pi(1≤i≤n),它以后尚需要的資源量不超過系統(tǒng)當(dāng)前剩余資源量與所有進程Pj (j < i )當(dāng)前占有資源量之和。</p><p> 雖然并非所有的不安全狀態(tài)都會產(chǎn)生死鎖狀態(tài),但當(dāng)系統(tǒng)進入不安全狀態(tài)后,便可能進而進入死鎖狀態(tài);反之,只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可避免進入死鎖狀態(tài)。因此,避免死鎖的實質(zhì)在于,如何使系統(tǒng)不進入不安全狀態(tài),銀行家算法就是用來判斷某種情況會不會進入不安
18、全狀態(tài)。</p><p> 先對用戶提出的請求進行合法性檢查,即檢查請求的是不大于需要的,是否不大于可利用的。若請求合法,則進行試分配。最后對試分配后的狀態(tài)調(diào)用安全性檢查算法進行安全性檢查。若安全,則分配,否則,不分配,恢復(fù)原來狀態(tài),拒絕申請。</p><p><b> 4.設(shè)計原理</b></p><p> 1)主要數(shù)據(jù)結(jié)構(gòu)設(shè)
19、計</p><p> 最大需求矩陣Max[][]:這是一個n*m的矩陣,它定義了系統(tǒng)中n個進程中的每一個進程對m類資源的最大需求。如果Max[i,j]=K,則表示進程i需要Rj類資源的最大數(shù)目為K。</p><p> 已分配矩陣Allocation[][]:這也是一個n*m的矩陣,它定義了系統(tǒng)中每一類資源 當(dāng)前已分配給沒一進程的資源數(shù)。如果Allocation[i,j]=K,則表示
20、進程i當(dāng)前已分得Rj類資源的數(shù)目為K。</p><p> 仍需求矩陣Need[][]=Max[][]-Allocation[][]:這也是一個n*m的矩陣,用以表示每一個進程尚需的各類資源數(shù)。如果Need[i,j]=K,則表示進程i還需要Rj類資源K個,方能完成其任務(wù)。</p><p> 可利用資源向量Available[]:這是一個含有m個 元素的數(shù)組,其中的每一個元素代表一類可利用
21、的資源數(shù)目,其初始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目,其數(shù)值隨該類資源的分配和回收而動態(tài)地改變。Available[j]=K,則表示系統(tǒng)中現(xiàn)有Rj 類資源K個。申請各類資源向量Request[]</p><p> 工作向量 work[]::表示系統(tǒng)可提供給進程繼續(xù)運行所需的各類資源數(shù)目,執(zhí)行安全性算法開始時work:=available;</p><p> Finish[]:表
22、示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成。初始化finish[i]:=false;有足夠資源分配給進程時,令finish[i]:=true。</p><p><b> 2)銀行家算法步驟</b></p><p> ?。?)如果Requesti<o(jì)r =Need,則轉(zhuǎn)向步驟(2);否則,認(rèn)為出錯,因為它所需要的資源數(shù)已超過它所宣布的最大值。</p>
23、<p> ?。?)如果Request<o(jì)r=Available,則轉(zhuǎn)向步驟(3);否則,表示系統(tǒng)中尚無足夠的資源,進程必須等待。</p><p> (3)系統(tǒng)試探把要求的資源分配給進程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:</p><p> Available=Available-Request[i];</p><p> Allocation=Allo
24、cation+Request;</p><p> Need=Need-Request;</p><p> (4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。</p><p><b> 3)安全性算法步驟</b></p><p><b> ?。?)設(shè)置兩個向量</b></
25、p><p> ?、俟ぷ飨蛄縒ork。它表示系統(tǒng)可提供進程繼續(xù)運行所需要的各類資源數(shù)目,執(zhí)行安全算法開始時,Work=Allocation;</p><p> ?、诓紶栂蛄縁inish。它表示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成,開始時先做Finish[i]=false,當(dāng)有足夠資源分配給進程時,令Finish[i]=true。</p><p> ?。?)從進程集
26、合中找到一個能滿足下述條件的進程:</p><p> ?、貴inish[i]=false</p><p> ?、贜eed<or=Work</p><p> 如找到,執(zhí)行步驟(3);否則,執(zhí)行步驟(4)。</p><p> ?。?)當(dāng)進程P獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:</p><
27、;p> Work=Work+Allocation;Finish[i]=true; </p><p><b> 轉(zhuǎn)向步驟(2)。</b></p><p> 如果所有進程的Finish[i]=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。</p><p><b> 設(shè)計實現(xiàn)過程</b></p&
28、gt;<p> 1)算法整體設(shè)計與調(diào)用</p><p> 主函數(shù)int main(),首先判定T0時刻的安全性,利用安全性算法int chkerr(int s) ,void changdata(int k) ,void rstordata(int k) 函數(shù)對T0時刻的資源分配情況進行分析,判斷T0時是否存在一個安全序列,若不存在則直接顯示不安全,若存在,則輸入每個進程號,接著有進程申請資
29、源,輸入所申請的資源,調(diào)用int chkerr()函數(shù)求安全序列,如果可以求出安全序列,則說明分配后系統(tǒng)不會進入不安全狀態(tài),正式將資源分配給申請資源的進程,最后用changdata(n);rstordata(n)函數(shù)輸出分配資源后每個進程的信息。如果求不出安全序列,說明分配后系統(tǒng)會處于不安全狀態(tài),則不能將資源分配給該進程,讓其等待,系統(tǒng)恢復(fù)原始狀態(tài)。如果申請資源的數(shù)量不滿足條件,則讓該進程等待。繼續(xù)判斷其他申請資源的進程。</p&
30、gt;<p> ?。?) if(Request[j]>NEED[n][j]) 、if(Request[j]>AVAILABLE[j]) </p><p> 用來判斷是否可以進行試分配,如果判斷結(jié)果為真,說明申請資源的進程申請的資源數(shù)目不滿足Request []<=need[]或Request []<=available[]條件,不能為該進程進行試分配,如果判斷結(jié)果為0,說明
31、可以進行試分配。</p><p> (2)int chkerr():這個函數(shù)用來求安全序列,首先初始化 WORK=AVAILABLE[j]; ,然后當(dāng)i<M時循環(huán)找滿足條件 FINISH[i]==FALSE&&NEED[i][j]<=WORK的進程,表示進程可以順利執(zhí)行則WORK=WORK+ALLOCATION[i][j]。再繼續(xù)找下一個滿足條件的進程。如果單循環(huán)結(jié)束時每個進程的Fi
32、nish[i]都等于1,則說明可以找到安全序列,返回1,如果不是每個Finish[i]都等于TRUE,則說明找不到一個安全序列,返回i=0;</p><p><b> 2)程序流程圖:</b></p><p><b> NO</b></p><p><b> NO</b></p>
33、<p><b> 找不到將所</b></p><p> 有Finish[i]置F</p><p><b> 進行下一輪測試</b></p><p><b> 安全性算法流程圖:</b></p><p><b> 設(shè)計結(jié)果驗證</b>&l
34、t;/p><p><b> 7.設(shè)計存在的不足</b></p><p> 1)在設(shè)計中,首先是資源利用不足,因為在程序中是直接輸出最大資源需求量MAX[M][N],可用資源數(shù)AVAILABLE[N],M個進程已經(jīng)得到N類資源的資源量ALLOCATION[M][N],最大資源需求量NEED[M][N],不能夠再改變他們,所以程序運用范圍比較?。?lt;/p>&
35、lt;p> 再者,在“請輸入需申請資源的進程號”中進行的for循環(huán)申請資源進程號只能一次增加,沒有達(dá)到隨機選擇的效果。</p><p> 3)進程號定義為整型,但是卻錯輸成字母等情況,我們需要對這些情況進行判斷,讓程序報錯返回而并非因錯誤而中斷。</p><p> 這樣的情況處理起來比較麻煩,相當(dāng)于對每次輸入針對各種不同的情況都得做判斷。我也沒有涵蓋全部的輸入,僅僅只是對輸入的
36、進程號不在已存在進程當(dāng)中作了判斷。而因為對于某些——比如進程號——本來設(shè)定就是整型,因此對輸入的是字母的判別因比較復(fù)雜而未能加上。</p><p><b> 8.設(shè)計總結(jié)</b></p><p> 通過一個周的課程設(shè)計,我加深了對銀行家算法的理解,掌握了銀行家算法避免死鎖的過程和方法,理解了死鎖產(chǎn)生的原因和條件以及避免死鎖的方法。并且還鞏固了C語言知識,掌握了用C
37、語言實現(xiàn)銀行家算法的方法。</p><p> 在銀行家算法這個系統(tǒng)之中,所采用的數(shù)據(jù)結(jié)構(gòu)應(yīng)是最基本的部分。銀行家算法的數(shù)據(jù)結(jié)構(gòu)我們采用了一維數(shù)組與二維數(shù)組來存儲,比如最大需求量Max[][]、已分配資源數(shù)Allocation[][]、仍需求資源數(shù)Need[][]、以及系統(tǒng)可利用的資源數(shù)、申請各類資源等數(shù)組。</p><p> 數(shù)據(jù)結(jié)構(gòu)雖然重要但卻只是基礎(chǔ),而最主要的用以實現(xiàn)系統(tǒng)功能的應(yīng)
38、該有兩個部分,一是用銀行家算法來判斷,二是用安全性算法來檢測系統(tǒng)的安全性。</p><p> 在本程序代碼中,銀行家算法用voidchangdata()、void rstordata() 函數(shù)來實現(xiàn)。</p><p> 首先,輸入欲申請資源的進程以及其所申請的資源數(shù),存放在Request數(shù)組中。</p><p> 然后,判斷進程請求的資源數(shù)是否大于其所需的資源
39、數(shù),若大于則報錯并返回,若不大于則繼續(xù)判斷它是否大于系統(tǒng)在此時刻可利用的資源數(shù),同樣,如果大于則報錯并反回,如果不大于則調(diào)用changedata( )函數(shù)來進行預(yù)分配,之后再調(diào)用安全型算法int chkerr() 檢查。</p><p> 最后,無論此次分配是否成功,我們都可以選擇繼續(xù)分配。</p><p> 安全性檢測我們是用int chkerr()函數(shù)來實現(xiàn)的。</p>
40、<p> 首先,F(xiàn)inish[]為布爾型,默認(rèn)是False,即該進程未完成。而Work——即該系統(tǒng)中可以用來工作的資源數(shù)——最開始為系統(tǒng)最初可以用的資源數(shù)。</p><p> 然后,我們從第一個進程開始判斷該進程未完成且其所需求的資源量不大于該系統(tǒng)中可以用來工作的資源量這個條件是否成立,即Finish[]=False且Need[][]<=Work[]是否成立。成立的話則將當(dāng)前在工作的資源量
41、與該進程已分配的資源量相加,存放于當(dāng)前可用來工作的資源量當(dāng)中,即Work[]=Work[]+Allocation,并將Finish[]的值改為True。否則便將此進程的優(yōu)先級減一,排在隊位,然后開始往后循環(huán)。</p><p> 待所有的進程循環(huán)完畢,我們再次判斷是否還存在進程的Finish[]=False,如果仍存在,則說明系統(tǒng)沒有安全序列,處于不安全狀態(tài),不可以進行分配;否則,系統(tǒng)處于安全狀態(tài),將預(yù)分配變?yōu)閷?/p>
42、際分配,求出安全序列并且將實際分配后的資源分配情況打印輸出。</p><p> 總之,銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來學(xué)習(xí)借鑒。雖然并非所有的不安全狀態(tài)都會產(chǎn)生死鎖狀態(tài),但系統(tǒng)進入不安全狀態(tài)時,便可能進而進入死鎖狀態(tài)后,當(dāng)系統(tǒng)在進行資源管理時,如果對進城申請的資源分配不當(dāng),可能會使系統(tǒng)進入死鎖狀態(tài),因而后面到來的進程也無法順利執(zhí)行。銀行家算法中,要對當(dāng)前申請資源的進程申請資源的數(shù)
43、目進行判斷,如果可以試分配,則試求出一個安全序列,如果可以求出,則說明給這個進程分配資源后系統(tǒng)不會進入不安全狀態(tài),將該進程申請的資源分配給他,若求不出安全序列,則說明將資源分配給該進程后系統(tǒng)會進入不安全狀態(tài),所以就使該進程進入阻塞狀態(tài),等待以后可以分配資源時再執(zhí)行該進程,然后系統(tǒng)繼續(xù)服務(wù)其它進程。通過這樣一個過程,可以有效避免系統(tǒng)進入死鎖狀態(tài)。反之,只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可避免進入死鎖狀態(tài)。因此,避免死鎖的實質(zhì)在于;如何使系統(tǒng)不進
44、入不安全狀態(tài)。總之,在這次課程設(shè)計中,我學(xué)到了很多知識與調(diào)試方法。</p><p><b> 9.參考文獻 </b></p><p> 湯小丹,梁紅兵,哲鳳屏,湯子瀛.計算機操作系統(tǒng). 西安:西安電子科技大學(xué)出版社,2007.</p><p> 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu). 北京:清華大學(xué)出版社,2006.</p><
45、p> 趙莉,楊國梁,孫喁喁,徐飛. Java程序設(shè)計教程. 西安:西安科技大學(xué)出版社,2009.</p><p><b> 附錄:源程序清單</b></p><p> #include<string.h> </p><p> #include<stdio.h> </p><p>
46、 #include<stdlib.h> </p><p> #define M 5 </p><p> #define N 3 </p><p> #define FALSE 0 </p><p> #define TRUE 1 </p><p> /*M個進程對N類資源最大資源需求量*/ &l
47、t;/p><p> int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; </p><p> /*系統(tǒng)可用資源數(shù)*/ </p><p> int AVAILABLE[N]={10,5,7}; </p><p> /*M個進程已經(jīng)得到N類資源的資源量 */</p>&
48、lt;p> int ALLOCATION[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; </p><p> /*M個進程對N類資源最大資源需求量*/</p><p> int NEED[M][N]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; </p><p>
49、 /*M個進程還需要N類資源的資源量*/ </p><p> int Request[N]={0,0,0}; </p><p> void showdata() </p><p><b> { </b></p><p><b> int i,j; </b></p><p&
50、gt; printf("-----銀行家算法:----\n"); </p><p> printf(" --wlecome\n");</p><p> printf("系統(tǒng)可用的資源數(shù)為:\n"); </p><p> printf(" "); &l
51、t;/p><p> for (j=0;j<N;j++)</p><p><b> { </b></p><p> printf(" 資源"); </p><p> printf("%d",j); </p><p> printf(":&
52、quot;); </p><p> printf("%d ",AVAILABLE[j]); </p><p><b> } </b></p><p> printf("\n\n"); </p><p> printf("各進程還需要的資源量:\n");
53、 </p><p> for (i=0;i<M;i++) </p><p><b> { </b></p><p> printf(" 進程"); </p><p> printf("%d",i); </p><p> printf(&quo
54、t;: "); </p><p> for (j=0;j<N;j++)</p><p><b> { </b></p><p> printf("資源"); </p><p> printf("%d",j); </p><p>
55、printf(":"); </p><p> printf("%d ",NEED[i][j]);</p><p><b> } </b></p><p> printf("\n"); </p><p><b> } </b><
56、;/p><p> printf("\n各進程已經(jīng)得到的資源量: \n"); </p><p> for (i=0;i<M;i++) </p><p><b> { </b></p><p> printf(" 進程"); </p><p> pr
57、intf("%d ",i); </p><p> for (j=0;j<N;j++)</p><p><b> { </b></p><p> printf("資源"); </p><p> printf("%d",j); </p>
58、<p> printf(":"); </p><p> printf("%d ",ALLOCATION[i][j]); </p><p><b> } </b></p><p> printf("\n"); </p><p><b&
59、gt; } </b></p><p><b> } </b></p><p> void changdata(int k) //計算可用資源數(shù),還需資源數(shù)</p><p><b> { </b></p><p><b> int j; </b></
60、p><p> for (j=0;j<N;j++) </p><p><b> { </b></p><p> AVAILABLE[j]=AVAILABLE[j]-Request[j]; </p><p> ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; </p&
61、gt;<p> NEED[k][j]=NEED[k][j]-Request[j]; </p><p><b> } </b></p><p><b> }</b></p><p> void rstordata(int k) //資源總數(shù)之和</p><p><b&
62、gt; { </b></p><p><b> int j; </b></p><p> for (j=0;j<N;j++) </p><p><b> { </b></p><p> AVAILABLE[j]=AVAILABLE[j]+Request[j]; </
63、p><p> ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; </p><p> NEED[k][j]=NEED[k][j]+Request[j]; </p><p><b> } </b></p><p><b> }</b></p>
64、<p> int chkerr(int s) //判斷系統(tǒng)是否安全</p><p><b> { </b></p><p> int WORK,FINISH[M],temp[M]; </p><p> int i,j,k=0; </p><p> for(i=0;i<M;i++)<
65、/p><p> FINISH[i]=FALSE; </p><p> for(j=0;j<N;j++) </p><p><b> { </b></p><p> WORK=AVAILABLE[j]; </p><p><b> i=s; </b></p&g
66、t;<p> while(i<M) </p><p><b> { </b></p><p> if (FINISH[i]==FALSE&&NEED[i][j]<=WORK) </p><p><b> { </b></p><p> WORK=W
67、ORK+ALLOCATION[i][j]; </p><p> FINISH[i]=TRUE; </p><p> temp[k]=i; </p><p><b> k++; </b></p><p><b> i=0; </b></p><p><b>
68、 } </b></p><p><b> else </b></p><p><b> { </b></p><p><b> i++; </b></p><p><b> } </b></p><p><
69、b> } </b></p><p> for(i=0;i<M;i++) </p><p> if(FINISH[i]==FALSE) </p><p><b> { </b></p><p> printf("\n"); </p><p>
70、printf("系統(tǒng)不安全!!! 本次資源申請不成功!!!\n"); </p><p> printf("\n"); </p><p> return 1; </p><p><b> } </b></p><p><b> } </b></p&
71、gt;<p> printf("\n"); </p><p> printf("經(jīng)安全性檢查,系統(tǒng)安全,本次分配成功。\n"); </p><p> printf("\n"); </p><p> printf(" 本次安全序列:"); </p>&l
72、t;p> for(i=0;i<M;i++)</p><p><b> { </b></p><p> printf("進程"); </p><p> printf("%d",temp[i]); </p><p> printf("->"
73、;); </p><p><b> } </b></p><p> printf("\n"); </p><p> return 0; </p><p><b> }</b></p><p> int main() </p><
74、;p><b> { </b></p><p> int i=0,j=0; </p><p> char flag='Y'; </p><p> void showdata(); //函數(shù)的聲明</p><p> void changdata(int); </p><
75、p> void rstordata(int); </p><p> int chkerr(int); </p><p> showdata(); //調(diào)用函數(shù),顯示界面</p><p> while(flag=='Y'||flag=='y') </p><p><b> { <
76、/b></p><p><b> i=-1; </b></p><p><b> int n;</b></p><p> chkerr(i);</p><p> changdata(i);</p><p> rstordata(i);</p>&
77、lt;p> while(n<0||n>=M) { </p><p> printf("請輸入需申請資源的進程號(從0到4,否則重輸入!):"); </p><p> scanf("%d",&n); </p><p> if(n<0||n>=M){</p><p
78、> printf("輸入的進程號不存在,重新輸入!\n");</p><p> return(n); }</p><p><b> }</b></p><p> for(i=0;i<M;i++){ </p><p> printf("請輸入進程"); <
79、/p><p> printf("%d",i); </p><p> printf("申請的資源數(shù)\n"); </p><p> for(j=0;j<N;j++) </p><p><b> { </b></p><p> printf("
80、;資源"); </p><p> printf("%d",j); </p><p> printf(":"); </p><p> scanf("%d",&Request[j]); </p><p> if(Request[j]>NEED[n][j])
81、 </p><p><b> { </b></p><p> printf("進程"); </p><p> printf("%d",n); </p><p> printf("申請的資源數(shù)大于進程"); </p><p> p
82、rintf("%d",n); </p><p> printf("還需要"); </p><p> printf("%d",j); //哪類資源的號 </p><p> printf("類資源的資源量!申請不合理,出錯!請重新選擇!\n"); </p><p
83、> flag='N'; </p><p><b> break; </b></p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p>
84、<p> if(Request[j]>AVAILABLE[j]) </p><p><b> { </b></p><p> printf("進程"); </p><p> printf("%d",n); </p><p> printf("申請
85、的資源數(shù)大于系統(tǒng)可用"); </p><p> printf("%d",j); </p><p> printf("類資源的資源量!申請不合理,出錯!請重新選擇!\n"); </p><p> flag='N'; </p><p><b> break; &
86、lt;/b></p><p><b> } </b></p><p><b> }</b></p><p><b> } </b></p><p> chkerr(n);</p><p> changdata(n);</p>
87、<p> rstordata(n); </p><p><b> } </b></p><p> if(flag=='Y'||flag=='y') </p><p><b> { </b></p><p> changdata(i); //計算
88、可用資源數(shù),還需資源數(shù)</p><p> if(chkerr(i)) </p><p><b> { </b></p><p> rstordata(i); </p><p> showdata(); </p><p><b> } </b></p>
89、<p><b> else </b></p><p> showdata(); </p><p><b> } </b></p><p><b> else </b></p><p> showdata(); </p><p> p
90、rintf("\n"); </p><p> scanf("%c",&flag); </p><p> printf("當(dāng)前的系統(tǒng)狀態(tài)\n");</p><p> printf(" 目前占有量 最大需求量 尚需要量 \n進程");</p><
91、p> for(i=0;i<M-2;i++)</p><p> for(j=0;j<N;j++)</p><p><b> {</b></p><p> printf(" %d類",j);</p><p><b> }</b></p>&
92、lt;p> for(i=0;i<M;i++)</p><p><b> {</b></p><p> printf("\nP[%d]",i);</p><p> for(j=0;j<N;j++)</p><p><b> {</b></p>
93、<p> printf(" %d ",ALLOCATION[i][j]);</p><p><b> }</b></p><p> for(j=0;j<N;j++)</p><p><b> {</b></p><p> printf("
94、; %d ",MAX[i][j]);</p><p><b> }</b></p><p> for(j=0;j<N;j++)</p><p><b> {</b></p><p> printf(" %d ",NEED[i][j]);</p
95、><p><b> }</b></p><p><b> }</b></p><p> printf("\n\n系統(tǒng)剩余資源量: "); </p><p> for(i=0;i<N;i++)</p><p><b> {<
96、/b></p><p> printf(" %d ",AVAILABLE[i]);</p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p&g
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計--銀行家算法
- 銀行家算法—課程設(shè)計
- 銀行家算法-課程設(shè)計
- 銀行家算法課程設(shè)計
- 銀行家算法課程設(shè)計
- 銀行家算法課程設(shè)計報告
- 銀行家算法課程設(shè)計報告
- 銀行家算法課程設(shè)計2
- 銀行家算法課程設(shè)計報告 (2)
- 銀行家算法模擬實現(xiàn)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--銀行家算法
- 銀行家算法的實現(xiàn)課程設(shè)計報告
- 課程設(shè)計---銀行家算法實驗報告
- 操作系統(tǒng)課程設(shè)計---銀行家算法
- 課程設(shè)計--銀行家算法的模擬實現(xiàn)
- 操作系統(tǒng)課程設(shè)計銀行家算法
- 操作系統(tǒng)課程設(shè)計--銀行家算法
- 操作系統(tǒng)課程設(shè)計(銀行家算法)
- 操作系統(tǒng)課程設(shè)計-銀行家算法
- 操作系統(tǒng)課程設(shè)計--銀行家算法
評論
0/150
提交評論