看看“銀行家算法”和“死鎖檢測算法”這兩把鑰匙,怎麼開死鎖。
A、
假設在系統中有四個進程和四種類型的資源,系統使用銀行家算法來避免死鎖。最大資源需求矩陣是
其中
其中,
a)說明這個狀態是安全的。
b)說明進程0申請1個單位的資源2是否允許。
解:
a)先將模型建立起來
1.初始狀態:
Claim=⎡⎣⎢⎢⎢⎢44136435121211171⎤⎦⎥⎥⎥⎥ Allocation=⎡⎣⎢⎢⎢⎢4113021101011020⎤⎦⎥⎥⎥⎥ Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available=[7,1,0,5]
各進程對資源的需求矩陣Claim−Allocation=⎡⎣⎢⎢⎢⎢03123414020200151⎤⎦⎥⎥⎥⎥ ,對進程遍歷發現P1的資源申請量在可用範圍內,則P1先執行。2.進程P1運行之後:
Claim=⎡⎣⎢⎢⎢⎢40136405120211071⎤⎦⎥⎥⎥⎥ Allocation=⎡⎣⎢⎢⎢⎢4013001100011020⎤⎦⎥⎥⎥⎥
則可用資源量Available=[8,3,1,5]
各進程對資源的需求矩陣Claim−Allocation=⎡⎣⎢⎢⎢⎢00123404020200051⎤⎦⎥⎥⎥⎥ ,發現可用資源可分配給進程P3的資源申請,則P3執行。3.進程P3運行之後:
Claim=⎡⎣⎢⎢⎢⎢40130405020201070⎤⎦⎥⎥⎥⎥ Allocation=⎡⎣⎢⎢⎢⎢4010001000001020⎤⎦⎥⎥⎥⎥
則可用資源量Available=[11,4,2,5]
各進程對資源的需求矩陣Claim−Allocation=⎡⎣⎢⎢⎢⎢00120404020200050⎤⎦⎥⎥⎥⎥ ,可將可用資源分配給進程P0,執行P0。4.進程P0運行之後:
Claim=⎡⎣⎢⎢⎢⎢00130005000200070⎤⎦⎥⎥⎥⎥ Allocation=⎡⎣⎢⎢⎢⎢4010001000001020⎤⎦⎥⎥⎥⎥
則可用資源量Available=[15,4,2,6]
各進程對資源的需求矩陣Claim−Allocation=⎡⎣⎢⎢⎢⎢00120004000200050⎤⎦⎥⎥⎥⎥ ,剩餘的進程P2也可運行。
綜上該狀態安全
b)
假設將資源2的分配一個單位給進程0:
1.初始態:
Claim=⎡⎣⎢⎢⎢⎢44136435121211171⎤⎦⎥⎥⎥⎥ Allocation=⎡⎣⎢⎢⎢⎢4113121101011020⎤⎦⎥⎥⎥⎥ Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available=[7,0,0,5]
其中總資源量和最大需求量不變,
各進程對資源的需求矩陣Claim−Allocation=⎡⎣⎢⎢⎢⎢03123314020200151⎤⎦⎥⎥⎥⎥ ,運行P3進程2.進程P3運行之後:
Claim=⎡⎣⎢⎢⎢⎢44130435021201170⎤⎦⎥⎥⎥⎥ Allocation=⎡⎣⎢⎢⎢⎢4110121001001020⎤⎦⎥⎥⎥⎥ Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available=[10,1,1,5]
各進程對資源的需求矩陣Claim−Allocation=⎡⎣⎢⎢⎢⎢03120314020200150⎤⎦⎥⎥⎥⎥ ,可運行進程P13. 進程P1運行之後:
Claim=⎡⎣⎢⎢⎢⎢40130405020201070⎤⎦⎥⎥⎥⎥ Allocation=⎡⎣⎢⎢⎢⎢4010101000001020⎤⎦⎥⎥⎥⎥ Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available=[11,3,2,5]
各進程對資源的需求矩陣Claim−Allocation=⎡⎣⎢⎢⎢⎢00120304020200050⎤⎦⎥⎥⎥⎥ ,運行進程P04.進程P0運行之後:
Claim=⎡⎣⎢⎢⎢⎢00130005000200070⎤⎦⎥⎥⎥⎥ Allocation=⎡⎣⎢⎢⎢⎢0010001000000020⎤⎦⎥⎥⎥⎥ Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available=[15,4,2,6]
各進程對資源的需求矩陣Claim−Allocation=⎡⎣⎢⎢⎢⎢00120004000200050⎤⎦⎥⎥⎥⎥ ,剩餘的進程P2也可運行至結束。
綜上,所有進程能運行結束,可以將資源2的分配一個單位給進程0
B、
在銀行家算法中,若出現係數資源分配。
進程 | Allocation | Need |
---|---|---|
P0 | 0, 0, 3, 2 | 0, 0, 1, 2 |
P1 | 1, 0, 0, 0 | 1, 7, 5, 0 |
P2 | 1, 3, 5, 4 | 2, 3, 5, 6 |
P3 | 0, 3, 3, 2 | 0, 6, 5, 2 |
P4 | 0, 0, 1, 4 | 0, 6, 5, 6 |
可用資源:
問:
1)表格描述的死鎖模型是什麼?
2)該狀態是否安全?
3)如果進程P2提出申請
解:
1)本題中,直接給出了需求量,而未給出最大需求量,同時也沒有給出資源總量。
Allocation=⎡⎣⎢⎢⎢⎢⎢01100003303053120424⎤⎦⎥⎥⎥⎥⎥ Need=⎡⎣⎢⎢⎢⎢⎢01200073661555520626⎤⎦⎥⎥⎥⎥⎥ Claim=⎡⎣⎢⎢⎢⎢⎢02300076964510864010410⎤⎦⎥⎥⎥⎥⎥
Available=[1,6,2,2] Resource=[3,12,14,14] 2)以下使用Allocation、Need、Available三個矩陣進行解題
由初始態可知,可以運行進程P0。
P0運行之後,Available=[1,6,5,4] ,
Allocation=⎡⎣⎢⎢⎢⎢⎢01100003300053100424⎤⎦⎥⎥⎥⎥⎥ Need=⎡⎣⎢⎢⎢⎢⎢01200073660555500626⎤⎦⎥⎥⎥⎥⎥ ,此時,可以運行進程P3。
P3運行之後,Available=[1,9,8,6] ,
Allocation=⎡⎣⎢⎢⎢⎢⎢01100003000050100404⎤⎦⎥⎥⎥⎥⎥ Need=⎡⎣⎢⎢⎢⎢⎢01200073060550500606⎤⎦⎥⎥⎥⎥⎥ ,此時,可以運行進程P1。
P1運行之後,Available=[2,9,8,6] ,
Allocation=⎡⎣⎢⎢⎢⎢⎢00100003000050100404⎤⎦⎥⎥⎥⎥⎥ Need=⎡⎣⎢⎢⎢⎢⎢00200003060050500606⎤⎦⎥⎥⎥⎥⎥ ,此時,可以運行進程P2。
P2運行之後,Available=[3,12,13,10] ,
Allocation=⎡⎣⎢⎢⎢⎢⎢00000000000000100004⎤⎦⎥⎥⎥⎥⎥ Need=⎡⎣⎢⎢⎢⎢⎢00000000060000500006⎤⎦⎥⎥⎥⎥⎥ ,此時,可以運行進程P4至結束。
綜上,所有程序可運行完成,該狀態安全。
3)若將現有資源量分配給P2,則可用資源量變爲Available=[0,4,0,0] Need=⎡⎣⎢⎢⎢⎢⎢01100071661535520426⎤⎦⎥⎥⎥⎥⎥
顯然,可用資源並不能使得任意一個進程完成,因此,不能分配。
C、
把死鎖檢測算法應用於下面的數據,並給出結果。
0)Allocation矩陣中未出現某行未0的情況,則不標記進程。
1)初始化W=Available=[2,1,0,0] ;
2)在Request中尋找進程i的資源請求小於W,標記進程2,W+=[0,1,2,0] ,W=[2,2,2,0] ;
3)重新回到Request中尋找進程i的資源請求小於W,標記進程1,W+=[2,0,0,1] ,W=[4,2,2,1]
4)發現W可以滿足最後一個進程的請求,標記進程0,進程都被標記,表明當前狀態未發生死鎖。
如果單看算法過程,可以發現兩個算法並沒有太大的差別;那麼問題來了,這兩個算法明明一樣,爲什麼一定要分開說呢?
是呀,除了死鎖模型中的矩陣不一樣,還有哪裏不同?沒錯,就是因爲模型不一樣。
銀行家算法,需要最大資源請求量矩陣,這是用於處理進程開始到結束的整一個週期;
而死鎖檢測算法,並不需要最大資源請求量矩陣,取而代之的是請求量向量,這就可以處理一個進程週期裏的某個資源請求。
從而,死鎖檢測可以減少對處理器的佔用,但是缺少了銀行家算法能提前判別死鎖的能力。
因此,將算法運用到合適的場合,能幫助我們高效的解決問題。