課程設(shè)計(jì)--銀行家算法_第1頁(yè)
已閱讀1頁(yè),還剩16頁(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><b>  課程設(shè)計(jì)報(bào)告書(shū)</b></p><p>  課程設(shè)計(jì)題目 銀行家算法 </p><p>  課 程 名 稱 計(jì)算機(jī)操作系統(tǒng) </p><p><b>  目錄</b></p><p>  1.設(shè)計(jì)目的…

2、………………………………….……….........…1</p><p>  2.設(shè)計(jì)要求……………………………………………..…..…..2</p><p>  3.設(shè)計(jì)的選題背景及設(shè)計(jì)計(jì)劃</p><p>  1)選題背景…………………………..…….…………..….3</p><p>  2)設(shè)計(jì)應(yīng)達(dá)到的要求………………….......

3、......……...…4</p><p><b>  4概要設(shè)計(jì)</b></p><p>  1)銀行家算法步驟………………….............……...….5</p><p>  2)安全性算法步驟………………….............……...….6</p><p>  3)主要數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)…………………

4、.............……...….6</p><p><b>  5.設(shè)計(jì)實(shí)現(xiàn)過(guò)程</b></p><p>  1)算法整體設(shè)計(jì)與調(diào)用7</p><p><b>  2)程序流程圖7</b></p><p>  6.設(shè)計(jì)結(jié)果驗(yàn)證…………………..………………………....9</p&g

5、t;<p><b>  7.設(shè)計(jì)存在的不足</b></p><p>  程序設(shè)計(jì)繁雜…………………………………..………..11</p><p>  8.設(shè)計(jì)總結(jié)………………………………………………..…11</p><p>  9.參考文獻(xiàn) ………………………………………..…13</p><p&g

6、t;  附錄:源程序清單…………………………………………..13</p><p><b>  設(shè)計(jì)目的</b></p><p>  銀行家算法是一種最有代表性的避免死鎖的算法。把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請(qǐng)求分配資源相當(dāng)于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請(qǐng)資源時(shí),要測(cè)試該進(jìn)程

7、對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請(qǐng)量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請(qǐng)資源時(shí),先測(cè)試該進(jìn)程已占用的資源數(shù)與本次申請(qǐng)的資源數(shù)之和是否超過(guò)了該進(jìn)程對(duì)資源的最大需求量。若超過(guò)則拒絕分配資源,若沒(méi)有超過(guò)則再測(cè)試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,若能滿足則按當(dāng)前的申請(qǐng)量分配資源,否則也要推遲分配。</p><p>  本次課程設(shè)計(jì)通過(guò)在UNIX環(huán)境中用C語(yǔ)言

8、編寫(xiě)和終端調(diào)試實(shí)現(xiàn)銀行家算法的程序,達(dá)到進(jìn)一步掌握銀行家算法,理解系統(tǒng)產(chǎn)生死鎖的原因以及系統(tǒng)避免死鎖的方法,增強(qiáng)理論聯(lián)系實(shí)際的能力的目的。</p><p><b>  設(shè)計(jì)要求</b></p><p>  對(duì)銀行家算法進(jìn)行編程,使之:</p><p> ?。?)可以輸入某系統(tǒng)的資源以及T0時(shí)刻進(jìn)程對(duì)資源的占用及需求情況的表項(xiàng),以及T0時(shí)刻系統(tǒng)的

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

10、時(shí)的可利用資源,提示分配不合理不予分配并返回。</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

11、> ?。?)對(duì)輸入進(jìn)行檢查,即若輸入不符合條件,應(yīng)當(dāng)報(bào)錯(cuò)并返回重新輸入。</p><p>  3.設(shè)計(jì)的選題背景及設(shè)計(jì)計(jì)劃</p><p><b>  1)選題背景</b></p><p>  我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家 管理的資金,進(jìn)程向操作系統(tǒng)請(qǐng)求分配資源相當(dāng)于用戶向銀行家貸款。操作系統(tǒng)按照銀

12、行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請(qǐng)資源時(shí),要測(cè)試該進(jìn)程對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請(qǐng)量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請(qǐng)資源時(shí),先測(cè)試該進(jìn)程已占用的資源數(shù)與本次申請(qǐng)的資源數(shù)之和是否超過(guò)了該進(jìn)程對(duì)資源的最大 需求量。若超過(guò)則拒絕分配資源,若沒(méi)有超過(guò)則再測(cè)試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,若能滿足則按當(dāng)前的申請(qǐng)量分配資源,否則也要推遲 分配。</p&g

13、t;<p>  2)設(shè)計(jì)應(yīng)達(dá)到的要求</p><p><b>  5.2死鎖預(yù)防: </b></p><p>  預(yù)防死鎖的方法是使產(chǎn)生死鎖的四個(gè)必要條件中的2、3、4條件之一不能成立。即:</p><p>  一、摒棄“請(qǐng)求和保持”條件。系統(tǒng)規(guī)定所有進(jìn)程在開(kāi)始運(yùn)行之前,都必須一次性申請(qǐng)其在整個(gè)運(yùn)行過(guò)程中所需的全部資源。使該進(jìn)程再

14、整個(gè)運(yùn)行過(guò)程中不會(huì)提出資源請(qǐng)求,因而摒棄了請(qǐng)求條件。又由于進(jìn)程在等待期間沒(méi)有占有任何資源,所以也摒棄了保持條件。</p><p>  二、摒棄“不剝奪”條件。系統(tǒng)規(guī)定,進(jìn)程逐個(gè)提出對(duì)資源的要求,當(dāng)一個(gè)已經(jīng)保持了某些資源的進(jìn)程,再提出新的資源請(qǐng)求而未被滿足時(shí),必須釋放已經(jīng)保持的所有資源,待以后需要是在再重新申請(qǐng)。</p><p>  三、摒棄“環(huán)路等待”條件。系統(tǒng)規(guī)定所有資源按類型進(jìn)行線性排

15、隊(duì),并賦予不同的序號(hào)。所有進(jìn)程對(duì)資源的請(qǐng)求都必須嚴(yán)格按資源序號(hào)遞增的順序提出。</p><p>  5.3安全狀態(tài)與不安全狀態(tài) </p><p>  在避免死鎖的算法中,允許進(jìn)程動(dòng)態(tài)地申請(qǐng)資源,系統(tǒng)在進(jìn)行資源分配之前,先計(jì)算資源分配的安全性。若此次分配不會(huì)使系統(tǒng)進(jìn)入不安全狀態(tài),便將資源分配給該進(jìn)程否則進(jìn)程等待。</p><p>  安全狀態(tài)是指,系統(tǒng)能按某種進(jìn)程順序

16、(P1, P2, P3,…,Pn),來(lái)為每個(gè)進(jìn)程分配所需資源,直至滿足每個(gè)進(jìn)程對(duì)資源的最大需求,是每個(gè)進(jìn)曾都可以順利完成。</p><p>  如果系統(tǒng)找不到這樣一個(gè)序列,系統(tǒng)就處于不安全狀態(tài)。雖然并非所有的不安全狀態(tài)都是死鎖狀態(tài),但當(dāng)系統(tǒng)進(jìn)入不安全狀態(tài)后,便可能進(jìn)入死鎖狀態(tài)。只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可以避免進(jìn)入不安全狀態(tài)。</p><p>  安全序列:一個(gè)進(jìn)程序列{P1,…,Pn}

17、是安全的,如果對(duì)于每一個(gè)進(jìn)程Pi(1≤i≤n),它以后尚需要的資源量不超過(guò)系統(tǒng)當(dāng)前剩余資源量與所有進(jìn)程Pj (j < i )當(dāng)前占有資源量之和。</p><p>  雖然并非所有的不安全狀態(tài)都會(huì)產(chǎn)生死鎖狀態(tài),但當(dāng)系統(tǒng)進(jìn)入不安全狀態(tài)后,便可能進(jìn)而進(jìn)入死鎖狀態(tài);反之,只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可避免進(jìn)入死鎖狀態(tài)。因此,避免死鎖的實(shí)質(zhì)在于,如何使系統(tǒng)不進(jìn)入不安全狀態(tài),銀行家算法就是用來(lái)判斷某種情況會(huì)不會(huì)進(jìn)入不安

18、全狀態(tài)。</p><p>  先對(duì)用戶提出的請(qǐng)求進(jìn)行合法性檢查,即檢查請(qǐng)求的是不大于需要的,是否不大于可利用的。若請(qǐng)求合法,則進(jìn)行試分配。最后對(duì)試分配后的狀態(tài)調(diào)用安全性檢查算法進(jìn)行安全性檢查。若安全,則分配,否則,不分配,恢復(fù)原來(lái)狀態(tài),拒絕申請(qǐng)。</p><p><b>  4.設(shè)計(jì)原理</b></p><p>  1)主要數(shù)據(jù)結(jié)構(gòu)設(shè)

19、計(jì)</p><p>  最大需求矩陣Max[][]:這是一個(gè)n*m的矩陣,它定義了系統(tǒng)中n個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)m類資源的最大需求。如果Max[i,j]=K,則表示進(jìn)程i需要Rj類資源的最大數(shù)目為K。</p><p>  已分配矩陣Allocation[][]:這也是一個(gè)n*m的矩陣,它定義了系統(tǒng)中每一類資源 當(dāng)前已分配給沒(méi)一進(jìn)程的資源數(shù)。如果Allocation[i,j]=K,則表示

20、進(jìn)程i當(dāng)前已分得Rj類資源的數(shù)目為K。</p><p>  仍需求矩陣Need[][]=Max[][]-Allocation[][]:這也是一個(gè)n*m的矩陣,用以表示每一個(gè)進(jìn)程尚需的各類資源數(shù)。如果Need[i,j]=K,則表示進(jìn)程i還需要Rj類資源K個(gè),方能完成其任務(wù)。</p><p>  可利用資源向量Available[]:這是一個(gè)含有m個(gè) 元素的數(shù)組,其中的每一個(gè)元素代表一類可利用

21、的資源數(shù)目,其初始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目,其數(shù)值隨該類資源的分配和回收而動(dòng)態(tài)地改變。Available[j]=K,則表示系統(tǒng)中現(xiàn)有Rj 類資源K個(gè)。申請(qǐng)各類資源向量Request[]</p><p>  工作向量 work[]::表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類資源數(shù)目,執(zhí)行安全性算法開(kāi)始時(shí)work:=available;</p><p>  Finish[]:表

22、示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成。初始化finish[i]:=false;有足夠資源分配給進(jìn)程時(shí),令finish[i]:=true。</p><p><b>  2)銀行家算法步驟</b></p><p> ?。?)如果Requesti<o(jì)r =Need,則轉(zhuǎn)向步驟(2);否則,認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過(guò)它所宣布的最大值。</p>

23、<p> ?。?)如果Request<o(jì)r=Available,則轉(zhuǎn)向步驟(3);否則,表示系統(tǒng)中尚無(wú)足夠的資源,進(jìn)程必須等待。</p><p> ?。?)系統(tǒng)試探把要求的資源分配給進(jìn)程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è)置兩個(gè)向量</b></

25、p><p> ?、俟ぷ飨蛄縒ork。它表示系統(tǒng)可提供進(jìn)程繼續(xù)運(yùn)行所需要的各類資源數(shù)目,執(zhí)行安全算法開(kāi)始時(shí),Work=Allocation;</p><p> ?、诓紶栂蛄縁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)程集

26、合中找到一個(gè)能滿足下述條件的進(jìn)程:</p><p> ?、貴inish[i]=false</p><p> ?、贜eed<or=Work</p><p>  如找到,執(zhí)行步驟(3);否則,執(zhí)行步驟(4)。</p><p> ?。?)當(dāng)進(jìn)程P獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:</p><

27、;p>  Work=Work+Allocation;Finish[i]=true; </p><p><b>  轉(zhuǎn)向步驟(2)。</b></p><p>  如果所有進(jìn)程的Finish[i]=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。</p><p><b>  設(shè)計(jì)實(shí)現(xiàn)過(guò)程</b></p&

28、gt;<p>  1)算法整體設(shè)計(jì)與調(diào)用</p><p>  主函數(shù)int main(),首先判定T0時(shí)刻的安全性,利用安全性算法int chkerr(int s) ,void changdata(int k) ,void rstordata(int k) 函數(shù)對(duì)T0時(shí)刻的資源分配情況進(jìn)行分析,判斷T0時(shí)是否存在一個(gè)安全序列,若不存在則直接顯示不安全,若存在,則輸入每個(gè)進(jìn)程號(hào),接著有進(jìn)程申請(qǐng)資

29、源,輸入所申請(qǐng)的資源,調(diào)用int chkerr()函數(shù)求安全序列,如果可以求出安全序列,則說(shuō)明分配后系統(tǒng)不會(huì)進(jìn)入不安全狀態(tài),正式將資源分配給申請(qǐng)資源的進(jìn)程,最后用changdata(n);rstordata(n)函數(shù)輸出分配資源后每個(gè)進(jìn)程的信息。如果求不出安全序列,說(shuō)明分配后系統(tǒng)會(huì)處于不安全狀態(tài),則不能將資源分配給該進(jìn)程,讓其等待,系統(tǒng)恢復(fù)原始狀態(tài)。如果申請(qǐng)資源的數(shù)量不滿足條件,則讓該進(jìn)程等待。繼續(xù)判斷其他申請(qǐng)資源的進(jìn)程。</p&

30、gt;<p> ?。?) if(Request[j]>NEED[n][j]) 、if(Request[j]>AVAILABLE[j]) </p><p>  用來(lái)判斷是否可以進(jìn)行試分配,如果判斷結(jié)果為真,說(shuō)明申請(qǐng)資源的進(jìn)程申請(qǐng)的資源數(shù)目不滿足Request []<=need[]或Request []<=available[]條件,不能為該進(jìn)程進(jìn)行試分配,如果判斷結(jié)果為0,說(shuō)明

31、可以進(jìn)行試分配。</p><p>  (2)int chkerr():這個(gè)函數(shù)用來(lái)求安全序列,首先初始化 WORK=AVAILABLE[j]; ,然后當(dāng)i<M時(shí)循環(huán)找滿足條件 FINISH[i]==FALSE&&NEED[i][j]<=WORK的進(jìn)程,表示進(jìn)程可以順利執(zhí)行則WORK=WORK+ALLOCATION[i][j]。再繼續(xù)找下一個(gè)滿足條件的進(jìn)程。如果單循環(huán)結(jié)束時(shí)每個(gè)進(jìn)程的Fi

32、nish[i]都等于1,則說(shuō)明可以找到安全序列,返回1,如果不是每個(gè)Finish[i]都等于TRUE,則說(shuō)明找不到一個(gè)安全序列,返回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>  進(jìn)行下一輪測(cè)試</b></p><p><b>  安全性算法流程圖:</b></p><p><b>  設(shè)計(jì)結(jié)果驗(yàn)證</b>&l

34、t;/p><p><b>  7.設(shè)計(jì)存在的不足</b></p><p>  1)在設(shè)計(jì)中,首先是資源利用不足,因?yàn)樵诔绦蛑惺侵苯虞敵鲎畲筚Y源需求量MAX[M][N],可用資源數(shù)AVAILABLE[N],M個(gè)進(jìn)程已經(jīng)得到N類資源的資源量ALLOCATION[M][N],最大資源需求量NEED[M][N],不能夠再改變他們,所以程序運(yùn)用范圍比較?。?lt;/p>&

35、lt;p>  再者,在“請(qǐng)輸入需申請(qǐng)資源的進(jìn)程號(hào)”中進(jìn)行的for循環(huán)申請(qǐng)資源進(jìn)程號(hào)只能一次增加,沒(méi)有達(dá)到隨機(jī)選擇的效果。</p><p>  3)進(jìn)程號(hào)定義為整型,但是卻錯(cuò)輸成字母等情況,我們需要對(duì)這些情況進(jìn)行判斷,讓程序報(bào)錯(cuò)返回而并非因錯(cuò)誤而中斷。</p><p>  這樣的情況處理起來(lái)比較麻煩,相當(dāng)于對(duì)每次輸入針對(duì)各種不同的情況都得做判斷。我也沒(méi)有涵蓋全部的輸入,僅僅只是對(duì)輸入的

36、進(jìn)程號(hào)不在已存在進(jìn)程當(dāng)中作了判斷。而因?yàn)閷?duì)于某些——比如進(jìn)程號(hào)——本來(lái)設(shè)定就是整型,因此對(duì)輸入的是字母的判別因比較復(fù)雜而未能加上。</p><p><b>  8.設(shè)計(jì)總結(jié)</b></p><p>  通過(guò)一個(gè)周的課程設(shè)計(jì),我加深了對(duì)銀行家算法的理解,掌握了銀行家算法避免死鎖的過(guò)程和方法,理解了死鎖產(chǎn)生的原因和條件以及避免死鎖的方法。并且還鞏固了C語(yǔ)言知識(shí),掌握了用C

37、語(yǔ)言實(shí)現(xiàn)銀行家算法的方法。</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[][]、仍需求資源數(shù)Need[][]、以及系統(tǒng)可利用的資源數(shù)、申請(qǐng)各類資源等數(shù)組。</p><p>  數(shù)據(jù)結(jié)構(gòu)雖然重要但卻只是基礎(chǔ),而最主要的用以實(shí)現(xiàn)系統(tǒng)功能的應(yīng)

38、該有兩個(gè)部分,一是用銀行家算法來(lái)判斷,二是用安全性算法來(lái)檢測(cè)系統(tǒng)的安全性。</p><p>  在本程序代碼中,銀行家算法用voidchangdata()、void rstordata() 函數(shù)來(lái)實(shí)現(xiàn)。</p><p>  首先,輸入欲申請(qǐng)資源的進(jìn)程以及其所申請(qǐng)的資源數(shù),存放在Request數(shù)組中。</p><p>  然后,判斷進(jìn)程請(qǐng)求的資源數(shù)是否大于其所需的資源

39、數(shù),若大于則報(bào)錯(cuò)并返回,若不大于則繼續(xù)判斷它是否大于系統(tǒng)在此時(shí)刻可利用的資源數(shù),同樣,如果大于則報(bào)錯(cuò)并反回,如果不大于則調(diào)用changedata( )函數(shù)來(lái)進(jìn)行預(yù)分配,之后再調(diào)用安全型算法int chkerr() 檢查。</p><p>  最后,無(wú)論此次分配是否成功,我們都可以選擇繼續(xù)分配。</p><p>  安全性檢測(cè)我們是用int chkerr()函數(shù)來(lái)實(shí)現(xiàn)的。</p>

40、<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è)條件是否成立,即Finish[]=False且Need[][]<=Work[]是否成立。成立的話則將當(dāng)前在工作的資源量

41、與該進(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[]=False,如果仍存在,則說(shuō)明系統(tǒng)沒(méi)有安全序列,處于不安全狀態(tài),不可以進(jìn)行分配;否則,系統(tǒng)處于安全狀態(tài),將預(yù)分配變?yōu)閷?shí)

42、際分配,求出安全序列并且將實(shí)際分配后的資源分配情況打印輸出。</p><p>  總之,銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來(lái)學(xué)習(xí)借鑒。雖然并非所有的不安全狀態(tài)都會(huì)產(chǎn)生死鎖狀態(tài),但系統(tǒng)進(jìn)入不安全狀態(tài)時(shí),便可能進(jìn)而進(jìn)入死鎖狀態(tài)后,當(dāng)系統(tǒng)在進(jìn)行資源管理時(shí),如果對(duì)進(jìn)城申請(qǐng)的資源分配不當(dāng),可能會(huì)使系統(tǒng)進(jìn)入死鎖狀態(tài),因而后面到來(lái)的進(jìn)程也無(wú)法順利執(zhí)行。銀行家算法中,要對(duì)當(dāng)前申請(qǐng)資源的進(jìn)程申請(qǐng)資源的數(shù)

43、目進(jìn)行判斷,如果可以試分配,則試求出一個(gè)安全序列,如果可以求出,則說(shuō)明給這個(gè)進(jìn)程分配資源后系統(tǒng)不會(huì)進(jìn)入不安全狀態(tài),將該進(jìn)程申請(qǐng)的資源分配給他,若求不出安全序列,則說(shuō)明將資源分配給該進(jìn)程后系統(tǒng)會(huì)進(jìn)入不安全狀態(tài),所以就使該進(jìn)程進(jìn)入阻塞狀態(tài),等待以后可以分配資源時(shí)再執(zhí)行該進(jìn)程,然后系統(tǒng)繼續(xù)服務(wù)其它進(jìn)程。通過(guò)這樣一個(gè)過(guò)程,可以有效避免系統(tǒng)進(jìn)入死鎖狀態(tài)。反之,只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可避免進(jìn)入死鎖狀態(tài)。因此,避免死鎖的實(shí)質(zhì)在于;如何使系統(tǒng)不進(jìn)

44、入不安全狀態(tài)??傊?,在這次課程設(shè)計(jì)中,我學(xué)到了很多知識(shí)與調(diào)試方法。</p><p><b>  9.參考文獻(xiàn) </b></p><p>  湯小丹,梁紅兵,哲鳳屏,湯子瀛.計(jì)算機(jī)操作系統(tǒng). 西安:西安電子科技大學(xué)出版社,2007.</p><p>  嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu). 北京:清華大學(xué)出版社,2006.</p><

45、p>  趙莉,楊國(guó)梁,孫喁喁,徐飛. Java程序設(shè)計(jì)教程. 西安:西安科技大學(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個(gè)進(jìn)程對(duì)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個(gè)進(jìn)程已經(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個(gè)進(jìn)程對(duì)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個(gè)進(jìn)程還需要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("各進(jìn)程還需要的資源量:\n");

53、 </p><p>  for (i=0;i<M;i++) </p><p><b>  { </b></p><p>  printf(" 進(jìn)程"); </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ìn)程已經(jīng)得到的資源量: \n"); </p><p>  for (i=0;i<M;i++) </p><p><b>  { </b></p><p>  printf(" 進(jìn)程"); </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) //計(jì)算可用資源數(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)不安全!!! 本次資源申請(qǐ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("進(jìn)程"); </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("請(qǐng)輸入需申請(qǐng)資源的進(jìn)程號(hào)(從0到4,否則重輸入!):"); </p><p>  scanf("%d",&n); </p><p>  if(n<0||n>=M){</p><p

78、>  printf("輸入的進(jìn)程號(hào)不存在,重新輸入!\n");</p><p>  return(n); }</p><p><b>  }</b></p><p>  for(i=0;i<M;i++){ </p><p>  printf("請(qǐng)輸入進(jìn)程"); <

79、/p><p>  printf("%d",i); </p><p>  printf("申請(qǐng)的資源數(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("進(jìn)程"); </p><p>  printf("%d",n); </p><p>  printf("申請(qǐng)的資源數(shù)大于進(jìn)程"); </p><p>  p

82、rintf("%d",n); </p><p>  printf("還需要"); </p><p>  printf("%d",j); //哪類資源的號(hào) </p><p>  printf("類資源的資源量!申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!\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("進(jìn)程"); </p><p>  printf("%d",n); </p><p>  printf("申請(qǐng)

85、的資源數(shù)大于系統(tǒng)可用"); </p><p>  printf("%d",j); </p><p>  printf("類資源的資源量!申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!\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); //計(jì)算

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進(jì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. 本站所有資源如無(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)論