假定系統(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)行安全性算法。
-
構(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。
- 現(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 - 這里不妨選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 - 然后,設(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] - 接下來的過程仍是重復(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)程:
- 繼續(xù)上述過程。在剩下三個(gè)進(jìn)程中選擇滿足要求的進(jìn)程,可見P2、P4都是可以的,在此選擇P2。然后完成系統(tǒng)分配資源、進(jìn)程釋放資源的過程:Work=Work-Need[2]+Max[2],并變更Finish[2]:
- 然后完成P4的分配和釋放:
- 我們發(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ā)生死鎖。
- 如果是安全狀態(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資源),問是否可行
按照如下流程判斷:
- Request是否小于等于Need?如果大于顯然這是不允許的(客觀上的),因?yàn)樗埱蟮馁Y源不能大于它事先聲明的需求數(shù)。請求被拒絕。
- Request是否小于等于Available?如果大于這是不允許的,因?yàn)?當(dāng)前 沒有足夠資源可夠分配。此時(shí)一般不是拒絕,而是將該進(jìn)程掛到等待隊(duì)列中,等待其他進(jìn)程釋放資源后再行分配。
- 若上面兩條都通過,則開始進(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)行安全性算法
銀行家算法流程圖