銀行家算法演示

假定系統(tǒng)中有5個(gè)進(jìn)程:P0,P1,...,P4,有3個(gè)資源A、B、C。某一時(shí)刻資源分配情況是:


在其中有4個(gè)矩陣:

  • Max:表示每個(gè)進(jìn)程聲明對于某個(gè)資源的最大使用量。例如第一行[7,5,3]表示進(jìn)程P0對于A、B、C三個(gè)資源的需求量不超過7、5、3個(gè)
  • Allocation:表示當(dāng)前時(shí)刻這些進(jìn)程已經(jīng)分到的資源數(shù)目。例如第一行[0,1,0]表示進(jìn)程P0已經(jīng)分配到0個(gè)A、1個(gè)B以及0個(gè)C
  • Need:表示這些資源還需要多少資源。例如第一行[7,4,3]表示進(jìn)程P0還需要7個(gè)A、4個(gè)B以及3個(gè)C
  • Available:表示系統(tǒng)現(xiàn)在還能分配的資源數(shù)。[3,2,2]表示A、B、C分別還有3個(gè)、2個(gè)、2個(gè)尚可分配。
【安全性算法】問題一:此時(shí)刻是否安全?

為回答這個(gè)問題,需要運(yùn)行安全性算法。

  1. 構(gòu)造兩個(gè)向量Work和Finish。Work[i]表示第i個(gè)資源還能分配多少,F(xiàn)inish[i]表示第i個(gè)進(jìn)程是否可以安全運(yùn)轉(zhuǎn)結(jié)束。初始時(shí),Work=Available,而Finish全部為false。


  2. 現(xiàn)在,選出一個(gè)進(jìn)程Pi,它必須滿足:Finish[i]=false,并且Need[i]≤Work(即對應(yīng)項(xiàng)進(jìn)行比較),即選出一個(gè)尚不確定是否能安全運(yùn)行結(jié)束的進(jìn)程,并且這個(gè)進(jìn)程還需要的資源數(shù)不能多于系統(tǒng)可以提供的資源數(shù)目,在這里,進(jìn)程P1、進(jìn)程P3都是可以的
    注意到這兩個(gè)進(jìn)程的Need是小于Work的且它們的Finish都是false
  3. 這里不妨選P1(選擇進(jìn)程P3也是可以的)。然后為其分配所需資源。我們總假定為其分配最大量,確保它能安全運(yùn)行到結(jié)束。因?yàn)楦鶕?jù)P1的Need可知它需要1個(gè)A、2個(gè)B和2個(gè)C,那么就從Work中減去相應(yīng)的量:Work-Need[1]。這樣Allocation[1]==Max[1],并且它能夠安全運(yùn)行結(jié)束:Finish[1]==true
    Work-Need[1]從而Allocation[1]==Max[1]且Finish[1]==true
  4. 然后,設(shè)P1運(yùn)行結(jié)束,它要釋放所持有的資源(3個(gè)A、2個(gè)B、2個(gè)C)還給系統(tǒng),由此變更Work向量:Work=Work+[3 2 2]。并淘汰P1,之后不予考慮。
    Work=Work+[3 2 2]
  5. 接下來的過程仍是重復(fù)上面4個(gè)步驟。
    在P0,P2,P3,P4中選出一個(gè)進(jìn)程,它的Finish是false并且它的Need不大于Work,在這里,只有P3滿足要求

    然后從Work中減去P3的Need所聲明的資源數(shù)目,并變更Finish:

    最后P3結(jié)束,返回所持有的資源(2個(gè)A、2個(gè)B、2個(gè)C)給Work,以便系統(tǒng)再次分配資源給其他進(jìn)程:
  6. 繼續(xù)上述過程。在剩下三個(gè)進(jìn)程中選擇滿足要求的進(jìn)程,可見P2、P4都是可以的,在此選擇P2。然后完成系統(tǒng)分配資源、進(jìn)程釋放資源的過程:Work=Work-Need[2]+Max[2],并變更Finish[2]:
  7. 然后完成P4的分配和釋放:
  8. 我們發(fā)現(xiàn)在這一步之后,系統(tǒng)所持有的B資源數(shù)是3個(gè)(Work[B]=3),但是它小于 P0所需要的B的數(shù)(Need[ P0 ][B]=4)。所以如果按照我們剛才分析的分配序列{P1,P3,P2,P4,P0},可能會(huì)出現(xiàn)P0進(jìn)程無法獲得所需要的資源,這個(gè)題中所給出的時(shí)刻的狀態(tài)就是一個(gè)不安全狀態(tài),可能會(huì)發(fā)生死鎖。
  9. 如果是安全狀態(tài),則最后所有進(jìn)程應(yīng)該都能分配到它們所請求的所有資源,并且Finish的所有分量都是true。

其實(shí)從上面可以看出,對一個(gè)進(jìn)程進(jìn)行適當(dāng)操作后,Work向量的值變更了兩次:

  • 分配資源給進(jìn)程Pi后:Work=Work-Need[i]
  • 進(jìn)程Pi釋放資源給系統(tǒng)后:Work=Work+Max[i]

合并兩個(gè)式子之后得到:Work=Work-Need[i]+Max[i]=Work+(Max[i]-Need[i])。然而如果關(guān)注表格中數(shù)據(jù)可以發(fā)現(xiàn):Max[i]=Allocation[i]+Need[i],這是顯然的,因?yàn)橐粋€(gè)進(jìn)程所請求的最大資源數(shù)就是它已分配的資源數(shù)加它還需要的資源數(shù),這樣,Work可以寫成:Work=Work+Allocation[i]
所以,安全性算法可以表述為:

安全性算法流程圖

【銀行家算法】問題二:在此之后假設(shè)某個(gè)進(jìn)程請求資源,設(shè)有請求向量Request=[m,n,k](即請求m個(gè)A、n個(gè)B、k個(gè)C資源),問是否可行

按照如下流程判斷:

  1. Request是否小于等于Need?如果大于顯然這是不允許的(客觀上的),因?yàn)樗埱蟮馁Y源不能大于它事先聲明的需求數(shù)。請求被拒絕
  2. Request是否小于等于Available?如果大于這是不允許的,因?yàn)?當(dāng)前 沒有足夠資源可夠分配。此時(shí)一般不是拒絕,而是將該進(jìn)程掛到等待隊(duì)列中,等待其他進(jìn)程釋放資源后再行分配。
  3. 若上面兩條都通過,則開始進(jìn)行試探分配:假定滿足了該進(jìn)程的資源請求,將資源都分配了出去,此時(shí)改寫Need、Allocation、Available的數(shù)據(jù),這樣就又達(dá)到了一個(gè)狀態(tài),那么如果這個(gè)狀態(tài)是安全狀態(tài),就進(jìn)行分配,否則是不安全狀態(tài),可能會(huì)引發(fā)死鎖,于是拒絕分配。為了判斷該狀態(tài)是否安全,這就又回到第一個(gè)問題:運(yùn)行安全性算法
    銀行家算法流程圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 系統(tǒng)安全狀態(tài)的定義 1.安全狀態(tài) 在避免死鎖的方法中,允許進(jìn)程動(dòng)態(tài)地申請資源,但系統(tǒng)在進(jìn)行資源分配之前,應(yīng)先計(jì)算此...
    haifengmay閱讀 3,758評論 1 8
  • 以下內(nèi)容整理自互聯(lián)網(wǎng),僅用于個(gè)人學(xué)習(xí)http://huachao1001.github.io/article.ht...
  • 陳冠希,一提到這個(gè)名字,首先會(huì)想到“艷照門”,和最近發(fā)生的他在微博上對林志玲的辱罵。大家恐怕不是很清楚的是,作為商...
    沉默的戰(zhàn)役閱讀 7,984評論 0 1
  • 秋天的早晨,一層薄霧籠罩在稻田上,在朝陽的穿透下泛起淡黃。高速公路邊景色隨著車行若隱若現(xiàn),凸起的灌木叢還有老樹枝仿...
    f2793013d027閱讀 651評論 0 0
  • 胡連海第四次讀書打卡,讀的書是《老人與海》。是美國作家海明威創(chuàng)作的短篇小說。 講的是:在美國獨(dú)立節(jié)...
    五三胡連海閱讀 189評論 0 0