這死鎖了,你有鑰呀

看看“銀行家算法”和“死鎖檢測算法”這兩把鑰匙,怎麼開死鎖。


A、
假設在系統中有四個進程和四種類型的資源,系統使用銀行家算法來避免死鎖。最大資源需求矩陣是

Claim=44136435121211171

其中Claimij(1i41j4) 表示進程i對於資源j的醉倒需求。系統中每一種類型的資源總量由向量[16,5,2,8] 給出。當前的資源分配情況由下面的矩陣給出。
Allocation=4113021101011020

其中,Allocationij 表示當前分配給進程i的資源j的數量。
a)說明這個狀態是安全的。
b)說明進程0申請1個單位的資源2是否允許。

解:
a)先將模型建立起來
1.初始狀態:
Claim=44136435121211171 Allocation=4113021101011020 Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available[7,1,0,5]
各進程對資源的需求矩陣ClaimAllocation=03123414020200151 ,對進程遍歷發現P1的資源申請量在可用範圍內,則P1先執行。

2.進程P1運行之後:
Claim=40136405120211071 Allocation=4013001100011020
則可用資源量Available[8,3,1,5]
各進程對資源的需求矩陣ClaimAllocation=00123404020200051 ,發現可用資源可分配給進程P3的資源申請,則P3執行。

3.進程P3運行之後:
Claim=40130405020201070 Allocation=4010001000001020
則可用資源量Available[11,4,2,5]
各進程對資源的需求矩陣ClaimAllocation=00120404020200050 ,可將可用資源分配給進程P0,執行P0。

4.進程P0運行之後:
Claim=00130005000200070 Allocation=4010001000001020
則可用資源量Available[15,4,2,6]
各進程對資源的需求矩陣ClaimAllocation=00120004000200050 ,剩餘的進程P2也可運行。
綜上該狀態安全
b)
假設將資源2的分配一個單位給進程0:
1.初始態:
Claim=44136435121211171 Allocation=4113121101011020 Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available[7,0,0,5]
其中總資源量和最大需求量不變,
各進程對資源的需求矩陣ClaimAllocation=03123314020200151 ,運行P3進程

2.進程P3運行之後:
Claim=44130435021201170 Allocation=4110121001001020 Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available[10,1,1,5]
各進程對資源的需求矩陣ClaimAllocation=03120314020200150 ,可運行進程P1

3. 進程P1運行之後:
Claim=40130405020201070 Allocation=4010101000001020 Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available[11,3,2,5]
各進程對資源的需求矩陣ClaimAllocation=00120304020200050 ,運行進程P0

4.進程P0運行之後:
Claim=00130005000200070 Allocation=0010001000000020 Resource=[16,5,2,8]
由Allocation和Resource矩陣可知,可用資源量Available[15,4,2,6]
各進程對資源的需求矩陣ClaimAllocation=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

可用資源:Available[1,6,2,2]
問:
1)表格描述的死鎖模型是什麼?
2)該狀態是否安全?
3)如果進程P2提出申請request=[1,2,2,2]

解:
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、
把死鎖檢測算法應用於下面的數據,並給出結果。
Available=[2,1,0,0]

Request=212001010100

Allocation=020001102010

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,進程都被標記,表明當前狀態未發生死鎖。


如果單看算法過程,可以發現兩個算法並沒有太大的差別;那麼問題來了,這兩個算法明明一樣,爲什麼一定要分開說呢?
是呀,除了死鎖模型中的矩陣不一樣,還有哪裏不同?沒錯,就是因爲模型不一樣。
銀行家算法,需要最大資源請求量矩陣,這是用於處理進程開始到結束的整一個週期;
而死鎖檢測算法,並不需要最大資源請求量矩陣,取而代之的是請求量向量,這就可以處理一個進程週期裏的某個資源請求。
從而,死鎖檢測可以減少對處理器的佔用,但是缺少了銀行家算法能提前判別死鎖的能力。
因此,將算法運用到合適的場合,能幫助我們高效的解決問題。

發佈了48 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章