1. 什么是死鎖
1.1. 什么是資源
計(jì)算機(jī)排他性的訪問(wèn)并使用的對(duì)象,叫做資源.資源按照其調(diào)度方案可以分為可搶占資源
和不可搶占資源
兩種.
可搶占資源
:從占有它的進(jìn)程中搶占不會(huì)引起錯(cuò)誤的資源,例如存儲(chǔ)器等.不可搶占資源
:不引起進(jìn)程故障的情況下,無(wú)法從占有它的進(jìn)程中搶占的資源,例如打印機(jī)等.
死鎖和不可搶占資源有關(guān).
1.2. 死鎖
死鎖是一種場(chǎng)景.
假設(shè)有A和B兩個(gè)進(jìn)程.A進(jìn)程持有資源R,請(qǐng)求資源Q.B進(jìn)程持有資源Q,請(qǐng)求資源R.而且A和B在未完成各自作業(yè)之前,不會(huì)釋放已持有的資源.
當(dāng)R和Q資源都是不可搶占資源時(shí),就發(fā)生了死鎖
.
因?yàn)椴僮飨到y(tǒng)調(diào)度程序在通常情況下不會(huì)對(duì)已分配的不可搶占資源進(jìn)行重分配,而是等待占有它的進(jìn)程顯示釋放.
2. 形成條件
互斥條件: 資源只有兩種狀態(tài).要么分配給了進(jìn)程,要么就是可用的.
占有和等待條件: 已經(jīng)得到某個(gè)資源的進(jìn)程可以再次請(qǐng)求新的資源.
不可搶占條件: 已經(jīng)分配的資源不能被搶占,只能由占有它的進(jìn)程顯式釋放.
環(huán)路等待條件: 死鎖發(fā)生時(shí),系統(tǒng)中一定由兩個(gè)或兩個(gè)以上的進(jìn)程組成一條環(huán)路,該環(huán)路中,每個(gè)進(jìn)程都在等待下一個(gè)進(jìn)程所占有的資源.
3. 避免
沒(méi)有一種算法可以完全避免所有環(huán)境中可能發(fā)生的死鎖.只能通過(guò)運(yùn)行時(shí)場(chǎng)景來(lái)選擇合理的方式避免.
比如,數(shù)據(jù)庫(kù)為了避免死鎖,采用的兩階段加鎖,不適用于進(jìn)程作業(yè)不確定的場(chǎng)景.
再如,存儲(chǔ)空間大的系統(tǒng)可以采用守護(hù)進(jìn)程加假脫機(jī)打印目錄來(lái)解決打印機(jī)死鎖,但不適用于小存儲(chǔ)空間系統(tǒng).
3.1. 銀行家算法
銀行家算法是指,銀行家將定量的資金貸給若干個(gè)企業(yè)家,企業(yè)家需求資金總量已知,但是資金不會(huì)全部立即到賬,只能由企業(yè)家分階段申請(qǐng).企業(yè)家在獲得全部所需資金后歸還全部資金.通過(guò)銀行家算法,銀行家可以完美調(diào)度資金,滿足所有企業(yè)家的需求.
但是,銀行家算法只能作為參考,而沒(méi)有通用性.因?yàn)?講資金換成資源,銀行家換成操作系統(tǒng),幾乎所有的進(jìn)程在運(yùn)行前是不知道自己所需某種資源的數(shù)量.
在一些大型批處理作業(yè)中,可以參考銀行家算法來(lái)避免死鎖.
以下是多種資源的銀行家算法(單個(gè)資源的銀行家算法也適配于此):
假設(shè):
- 有m種資源.有n個(gè)進(jìn)程.
-
各個(gè)資源總數(shù)組成的向量為E.
E.gif -
各個(gè)資源剩余量組成的向量為A.
A.gif -
C為當(dāng)前分配資源.
C.gif -
R為請(qǐng)求資源.
R.gif
存在恒等式:

算法描述如下:
- 檢查R中是否有一行,滿足各項(xiàng)都小于A.
- 如果有,則分配.進(jìn)程被標(biāo)記.之后釋放所有資源,加到A中.
- 重復(fù)以上步驟,直到所有進(jìn)程被標(biāo)記.如果存在無(wú)法標(biāo)記的進(jìn)程,則當(dāng)前分配方案存在死鎖.
3.2. 破壞死鎖形成條件
這種方法是破壞思索形成四個(gè)條件中的任意一個(gè),從而避免思索.每個(gè)條件的背后都有隱含的條件,并不適用于所有場(chǎng)景,只能因地制宜,選擇最合適的方法.
3.2.1. 破壞互斥條件
方法: 假脫機(jī),由守護(hù)進(jìn)程專(zhuān)門(mén)負(fù)責(zé)資源操作.
問(wèn)題: 以假脫機(jī)打印為例,如果假脫機(jī)目錄在接收到文件時(shí)就開(kāi)始打印.這樣一來(lái),存儲(chǔ)空間的需求就是未知的.如果文件就緒再打印,那么脫機(jī)打印目錄在空間有限的前提下,本身就會(huì)發(fā)生死鎖.因?yàn)榭赡芩械倪M(jìn)程在寫(xiě)入一半時(shí),空間滿了.
3.2.2. 破壞占有和等待條件
方法: 在進(jìn)程開(kāi)始前請(qǐng)求所有資源.
問(wèn)題: 一般情況下,進(jìn)程是不知道自己將來(lái)的資源需求的.
3.2.3. 破壞不可搶占條件
方法: 搶占.
問(wèn)題: 在一般進(jìn)程間會(huì)發(fā)生錯(cuò)誤.
3.2.4. 破壞環(huán)路等待條件
方法1: 每個(gè)進(jìn)程只能擁有一個(gè)資源.
問(wèn)題: 如果有需要兩個(gè)資源的進(jìn)程,則這個(gè)進(jìn)程無(wú)法運(yùn)行.
方法2: 給每個(gè)資源編號(hào),然后進(jìn)程按照標(biāo)號(hào)增(或減)序,申請(qǐng)資源.
問(wèn)題: 每個(gè)進(jìn)程申請(qǐng)資源的剛性順序貌似是隨機(jī)的.所以,宏觀來(lái)看,不存在一種可以運(yùn)行所有進(jìn)程的資源排序.
4. 綜上所述
想要在全部維度完全避免死鎖,為此尋找一個(gè)一勞永逸的方法,當(dāng)前是不可能的.所以要在有死鎖發(fā)生潛在可能的環(huán)境中,根據(jù)需求,合理的選擇避免死鎖的方法.其中可能包含銀行家算法,也可以打破死鎖發(fā)生的條件.或者使用特殊的資源調(diào)度算法.
來(lái)自博客:http://newlooc.com