死鎖

死鎖的概念

????死鎖的定義

在多道程序系統(tǒng)中,由于多個進(jìn)程的并發(fā)執(zhí)行,改善了系統(tǒng)資源的利用率并提高了系統(tǒng)的處理能力。然而多個進(jìn)程的并發(fā)執(zhí)行也帶來了新的問題一一死鎖。所謂死鎖是指多個進(jìn)程因競爭資源而造成的一種僵局 (互相等待),若無外力作用,這些進(jìn)程都將無法向前推進(jìn)。

下面我們通過一些實例來說明死鎖現(xiàn)象:

先看生活中的一個實例,在一條河上有一座橋,橋面很窄,只能容納一輛汽車通行。如果有兩輛汽車分別從橋的左右兩端駛上該橋,則會出現(xiàn)下述的沖突情況:此時,左邊的汽車占有了橋面左邊的一段,要想過橋還需等待右邊的汽車讓出橋面右邊的一段;右邊的汽車占有了橋面右邊的一段 ,要想過橋還需等待左邊的汽車讓出橋面左邊的一段。此時,若左右兩邊的汽車都只能向前行駛,則兩輛汽車都無法過橋。

在計算機系統(tǒng)中也存在類似的情況。例如,某計算機系統(tǒng)中只有一臺打印機和一臺輸入設(shè)備,進(jìn)程 P1正占用輸入設(shè)備,同時又提出使用打印機的請求,但此時打印機正被進(jìn)程 P2 所占用,而P2未釋放打印機之前 ,又提出請求使用正被 P1占用著的輸入設(shè)備 。這樣兩個進(jìn)程相互無休止地等待下去,均無法繼續(xù)執(zhí)行,此時兩個進(jìn)程陷入死鎖狀態(tài)。

????死鎖產(chǎn)生的原因

(1)系統(tǒng)資源的競爭

通常系統(tǒng)中擁有的不可剝奪資源,其數(shù)量不足以滿足多個進(jìn)程運行的需要,使得進(jìn)程在運行過程中,會因爭奪資源而陷入僵局,如磁帶機、打印機等。只有對不可剝奪資源的競爭才可能產(chǎn)生死鎖,對可剝奪資源的競爭是不會引起死鎖的。

(2)進(jìn)程推進(jìn)順序非法

進(jìn)程在運行過程中,請求和釋放資源的順序不當(dāng),也同樣會導(dǎo)致死鎖。 例如,并發(fā)進(jìn)程 P1 、P2 分別保持了資源 R1, R2,而進(jìn)程 P1申請資源R2,進(jìn)程 P2 申請資源 R1時,兩者都會因為所需資源被占用而阻塞。

信號量使用不當(dāng)也會造成死鎖。進(jìn)程間彼此相互等持對方發(fā)來的消息,結(jié)果也會使得這些進(jìn)程無法繼續(xù)向前進(jìn)。例如,進(jìn)程 A 等待進(jìn)程 B發(fā)的消息,進(jìn)程B又在等待進(jìn)程 A 發(fā)的消息, 可以看出進(jìn)程 A 和B 不是因為競爭同一資源,而是在等待對方的資源導(dǎo)致死鎖。

(3)死鎖產(chǎn)生的必要條件

產(chǎn)生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發(fā)生。?

互斥條件:進(jìn)程要求對所分配的資源 (如打印機) 進(jìn)行排他性控制,即在一段時間內(nèi)某資源僅為一個進(jìn)程所占有。此時若有其他進(jìn)程請求該資源,則請求進(jìn)程只能等待。?

不剝奪條件:進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強行奪走,即只能由獲得該資源的進(jìn)程自己來釋放 (只能是主動釋放)。?

請求和保持條件:進(jìn)程已經(jīng)保持了至少一個資源,但又提出了新的資源請求,而該資源己被其他進(jìn)程占有,此時請求進(jìn)程被阻塞,但對自己己獲得的資源保持不放。

循環(huán)等待條件:存在一種進(jìn)程資源的循環(huán)等待鏈,鏈中每一個進(jìn)程己獲得的資源同時被鏈中下一個進(jìn)程所請求。即存在一個處于等待狀態(tài)的進(jìn)程集合{P1,P2,...,Pn } ,其中 Pi 等待的資源被 P(i + 1)占有 (i=0,1,... ,n - 1),? Pn 等待的資源被 P0占有,如圖所示。

直觀上看 ,循環(huán)等待條件似乎和死鎖的定義一樣,其實不然。按死鎖定義構(gòu)成等待環(huán)所要求的條件更嚴(yán),它要求 Pi等待的資源必須由P(i + 1)來滿足,而循環(huán)等待條件則無此限制。例如,系統(tǒng)中有兩臺輸出設(shè)備 ,P0占有一臺,PK 占有另一臺,且 K 不屬于集合{0,1,...,n}。Pn 等待一臺輸出設(shè)備,它可以從 P0獲得,也可能從 PK 獲得。因此,雖然 Pn、P0和其他一些進(jìn)程形成了循環(huán)等待圈,但PK 不在圈內(nèi),若PK 釋放了輸出設(shè)備 ,則可打破循環(huán)等待,如圖所示。因此循環(huán)等待只是死鎖的必要條件。

資源分配圖含圈而系統(tǒng)又不一定有死鎖的原因是同類資源數(shù)大于1。但若系統(tǒng)中每類資源都只有一個資源,則資源分配圖含圈就變成了系統(tǒng)出現(xiàn)死鎖的充分必要條件。

要注意區(qū)分不可剝奪條件與請求和保持條件,用一個簡單的例子來說明:如果你手上拿著一個蘋果 (即使你不打算吃),別人不能把你手上的蘋果拿走,那就是不可剝奪條件;如果你左手拿著一個蘋果 ,允許你右手再去拿一個蘋果 ,那就是請求和保持條件。

死鎖的處理策略?

為使系統(tǒng)不發(fā)生死鎖,必須設(shè)法破壞產(chǎn)生死鎖的四個必要條件之一? ,或者允許死鎖產(chǎn)生,但當(dāng)死鎖發(fā)生時能檢測出死鎖,并有能力實現(xiàn)恢復(fù)。

????預(yù)防死鎖

設(shè)置某些限制條件,破壞產(chǎn)生死鎖的四個必要條件中的一個或幾個,以防止發(fā)生死鎖。

????避免死鎖

在資源的動態(tài)分配過程中,用某種方法防止系統(tǒng)進(jìn)入不安全狀態(tài),從而避免死鎖。

????死鎖的檢測及解除

無需采取任何限制性措施 ,允許進(jìn)程在運行過程中發(fā)生死鎖。通過系統(tǒng)的檢測機構(gòu)及時地檢測出死鎖的發(fā)生,然后采取某種措施解除死鎖。

預(yù)防死鎖和避免死鎖都屬于事先預(yù)防策略,但預(yù)防死鎖的限制條件比較嚴(yán)格,實現(xiàn)起來較為簡單,但往往導(dǎo)致系統(tǒng)的效率低,資源利用率低;避免死鎖的限制條件相對寬松,資源分配后需要通過算法來判斷是否進(jìn)入不安全狀態(tài),實現(xiàn)起來較為復(fù)雜。

死鎖的幾種處理策略的比較見下表

死鎖預(yù)防?

防止死鎖的發(fā)生只需破壞死鎖產(chǎn)生的四個必要條件之一即可。?

????破壞互斥條件

如果允許系統(tǒng)資源都能共享使用,則系統(tǒng)不會進(jìn)入死鎖狀態(tài)。但有些資源根本不能同時訪問,如打印機等臨界資源只能互斥使用。所以,破壞互斥條件而預(yù)防死鎖的方法不太可行,而且在有的場合應(yīng)該保護(hù)這種互斥性。

????破壞不剝奪條件??

當(dāng)一個己保持了某些不可剝奪資源的進(jìn)程,請求新的資源而得不到滿足時? ,它必須釋放己經(jīng)保持的所有資源,待以后需要時再重新申請。這意味著,一個進(jìn)程已占有的資源會被暫時釋放,或者說是被剝奪了,從而破壞了不可剝奪條件 。

該策略實現(xiàn)起來比較復(fù)雜,釋放已獲得的資源可能造成前一階段工作的失效,反復(fù)地申請和釋放資源會增加系統(tǒng)開銷,降低系統(tǒng)吞吐量。這種方法常用于狀態(tài)易于保存和恢復(fù)的資源,如CPU的寄存器及內(nèi)存資源,一般不能用于打印機之類的資源。

????破壞請求和保持條件

采用預(yù)先靜態(tài)分配方法,即進(jìn)程在運行前一次申請完它所需要的全部資源,在它的資源未滿足前,不把它投入運行。一旦投入運行后,這些資源就一直歸它所有,也不再提出其他資源請求,這樣就可以保證系統(tǒng)不會發(fā)生死鎖。

這種方式實現(xiàn)簡單 ,但缺點也顯而易見,系統(tǒng)資源被嚴(yán)重浪費 ,其中有些資源可能僅在運行初期或運行快結(jié)束時才使用,甚至根本不使用。而且還會導(dǎo)致 “饑餓” 現(xiàn)象,當(dāng)由于個別資源長期被其他進(jìn)程占用時,將致使等待該資源的進(jìn)程遲遲不能開始運行。

????破壞循環(huán)等待條件

為了破壞循環(huán)等待條件,可采用順序資源分配法 。首先給系統(tǒng)中的資源編號,規(guī)定每個進(jìn)程, 必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要進(jìn)程提出申請分配資源Ri,則該進(jìn)程在以后的資源申請中,只能申請編號大于 Ri 的資源。

這種方法存在的問題是,編號必須相對穩(wěn)定,這就限制了新類型設(shè)備的增加:盡管在為資源編號時己考慮到大多數(shù)作業(yè)實際使用這些資源的順序,但也經(jīng)常會發(fā)生作業(yè)使用資源的順序與系統(tǒng)規(guī)定順序不同的情況,造成資源的浪費;此外,這種按規(guī)定次序申請資源的方法,也必然會給用戶的編程帶來麻煩。

死鎖避免

避免死鎖同樣是屬于事先預(yù)防的策略,但并不是事先采取某種限制措施破壞死鎖的必要條件,而是在資源動態(tài)分配過程中,防止系統(tǒng)進(jìn)入不安全狀態(tài) ,以避免發(fā)生死鎖。這種方法所施加的限制條件較弱,可以獲得較好的系統(tǒng)性能。

????系統(tǒng)安全狀態(tài)

避免死鎖的方法中,允許進(jìn)程動態(tài)地申請資源,但系統(tǒng)在進(jìn)行資源分配之前,應(yīng)先計算此次資源分配的安全性。若此次分配不會導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài) ,則將資源分配給進(jìn)程;否則, 讓進(jìn)程等待。

所謂安全狀態(tài) ,是指系統(tǒng)能按某種進(jìn)程推進(jìn)順序 (Pl, P2,...,Pn),為每個進(jìn)程Pi 分配其所需資源,直至滿足每個進(jìn)程對資源的最大需求,使每個進(jìn)程都可順序地完成。此時稱 P1, P2,? ···,Pn? 為安全序列。如果系統(tǒng)無法找到一個安全序列,則稱系統(tǒng)處于不安全狀態(tài)。 假設(shè)系統(tǒng)中有三個進(jìn)程 P1 、P2 和P3,共有 12 臺磁帶機。進(jìn)程P1 總共需要 10 臺磁帶機,P2 和 P3 分 別需要 4 臺和 9 臺。假設(shè)在T0 時刻,進(jìn)程 P1、P2 和 P3 己分別獲得 5 臺、2 臺和 2 臺,尚有 3 臺未分配,見下表:

則在 T0時刻是安全的,因為存在一個安全序列P2、P1、P3,即只要系統(tǒng)按此進(jìn)程序列分配資源,則每個進(jìn)程都能順利完成。若在T0時刻后,系統(tǒng)分配1臺磁帶機給P3,則此時系統(tǒng)便進(jìn)入不安全狀態(tài),因為此時己無法再找到一個安全序列。

并非所有的不安全狀態(tài)都是死鎖狀態(tài),但當(dāng)系統(tǒng)進(jìn)入不安全狀態(tài)后,便可能進(jìn)入死鎖狀態(tài); 反之,只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可以避免進(jìn)入死鎖狀態(tài)。

????銀行家算法

銀行家算法是最著名的死鎖避免算法。它提出的思想是:把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源 ,當(dāng)進(jìn)程首次申請資游時,要測試該進(jìn)程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請量分配資源 ,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請資源時,先測試該進(jìn)程己占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進(jìn)程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,若能滿足則按當(dāng)前的申請量分配資源,否則也要推遲分配。

死鎖檢測和解除

前面介紹的死鎖預(yù)防和避免算法,都是在為進(jìn)程分配資源時施加限制條件或進(jìn)行檢測 ,若系統(tǒng)為進(jìn)程分配資源時不采取任何措施,則應(yīng)該提供死鎖檢測和解除的手段。

????資源分配圖

系統(tǒng)死鎖,可利用資源分配圖來描述。如圖所示,用圓圈代表一個進(jìn)程,用框代表一類資源。由于一種類型的資源可能有多個,用框中的一個點代表一類資源中的一個資源。從進(jìn)程到資源的有向邊叫請求邊,表示該進(jìn)程申請一個單位的該類資源;從資源到進(jìn)程的邊叫分配邊 ,表示該類資源已經(jīng)有一個資源被分配給了該進(jìn)程。

在上圖所示的資源分配圖中,進(jìn)程 P1 已經(jīng)分得了兩個R1資源,并又請求一個R2資源;進(jìn)程 P2 分得了一個 R1 和 一個 R2 資源,并又請求一個 R1資源。

????死鎖定理

可以通過將資源分配圖簡化的方法來檢測系統(tǒng)狀態(tài) S 是否為死鎖狀態(tài)。簡化方法如下:

1) 在資源分配圖中,找出既不阻塞又不是孤點的進(jìn)程Pi( 即找出一條有向邊與它相連,且該有向邊對應(yīng)資源的申請數(shù)量小于等于系統(tǒng)中己有空閑資源數(shù)量,如上圖中,R1沒有空閑資源,R2有一個空閑資源。若所有的連接該進(jìn)程的邊均滿足上述條件,則這個進(jìn)程能繼續(xù)運行直至完成,然后釋放它所占有的所有資源)。消去它所有的請求邊和分配邊,使之成為孤立的結(jié)點。 在圖(a)中,P1是滿足這一條件的進(jìn)程結(jié)點,將P1的所有邊消去,便得到圖(b)所示的情況。

在這里要注意一個問題,判斷某種資源是否有空間,應(yīng)該用它的資源數(shù)量減去它在資源分配圖中的出度,如上圖中,R1資源數(shù)有 3,而出度也是 3。 所以 R1沒有空閑資源,R2的資源數(shù)是 2,出度是1,所以R2有1個空閑資源。

2) 進(jìn)程 Pi 所釋放的資源,可以喚醒某些因等待這些資源而阻塞的進(jìn)程,原來的阻塞進(jìn)程可能變?yōu)榉亲枞M(jìn)程。在上圖中,進(jìn)程P2 就滿足這樣的條件。根據(jù) 1)中的方法進(jìn)行一系列簡化后,若能消去圖中所有的邊,則稱該圖是可完全簡化的,如圖(c)所示。

S為死鎖的條件是當(dāng)且僅當(dāng)S狀態(tài)的資源分配圖是不可完全簡化的,該條件為死鎖定理。

????死鎖解除

一旦檢測出死鎖,就應(yīng)立即采取相應(yīng)的措施,以解除死鎖。死鎖解除的主要方法有:

1)資源剝奪法。掛起某些死鎖進(jìn)程,并搶占它的資源,將這些資源分配給其他的死鎖進(jìn)程。但應(yīng)防止被掛起的進(jìn)程長時間得不到資源,而處于資源匱乏的狀態(tài)。

2)撤銷進(jìn)程法。強制撤銷部分、甚至全部死鎖進(jìn)程并剝奪這些進(jìn)程的資源。撤銷的原則可以按進(jìn)程優(yōu)先級和撤銷進(jìn)程代價的高低進(jìn)行。

3) 進(jìn)程回退法。讓一 (或多)個進(jìn)程回退到足以回避死鎖的地步,進(jìn)程回退時自愿釋放資源而不是被剝奪。要求系統(tǒng)保持進(jìn)程的歷史信息,設(shè)置還原點。

本節(jié)小結(jié)

????為什么會產(chǎn)生死鎖?產(chǎn)生死鎖有什么條件?

由于系統(tǒng)中存在一些不可剝奪資源,而當(dāng)兩個或兩個以上的進(jìn)程占有自身資源,并請求對方資源時,會導(dǎo)致每個進(jìn)程都無法向前推進(jìn),這就是死鎖。死鎖產(chǎn)生的必要條件有四個,分別是互斥條件、不剝奪條件 、請求并保持條件和循環(huán)等待條件。

互斥條件是指進(jìn)程要求分配的資源是排他性的,即最多只能同時給一個進(jìn)程使用。 不剝奪條件是指進(jìn)程在使用資源完畢之前 ,資源不能被強制奪走。 請求并保持條件是指進(jìn)程占有自身本來擁有的資源并要求其他資源。 循環(huán)等待條件是指存在一種進(jìn)程資源的循環(huán)等待鏈 。

????有什么辦法可以解決死鎖問題??

死鎖的處理策略可以分為預(yù)防死鎖、避免死鎖和死鎖的檢測及解除。

死鎖的預(yù)防是通過設(shè)立一些限制條件,破壞死鎖的一些必要條件,讓死鎖無法發(fā)生。 死鎖的避免是在動態(tài)分配資源的過程中,用一些算法防止系統(tǒng)進(jìn)入不安全狀態(tài) ,從而避免死鎖。

死鎖的檢測和解除是在死鎖產(chǎn)生前不采取任何措施,只檢測當(dāng)前系統(tǒng)有沒有發(fā)生死鎖。若有, 則采取一些措施解除死鎖。

本節(jié)的知識架構(gòu)圖如下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 一.死鎖的概念以及產(chǎn)生死鎖的原因 1.死鎖的定義 在多道程序系統(tǒng)中,由于多個進(jìn)程的并發(fā)執(zhí)行,改善了系統(tǒng)資源的利用率...
    Chasel_H閱讀 1,131評論 0 4
  • 1、競態(tài)條件: 定義:競態(tài)條件指的是一種特殊的情況,在這種情況下各個執(zhí)行單元以一種沒有邏輯的順序執(zhí)行動作,從而導(dǎo)致...
    Hughman閱讀 1,326評論 0 7
  • 一、死鎖的基本概念 1.1 死鎖的定義 一組進(jìn)程中,每個進(jìn)程都無限等待被該組進(jìn)程中另一進(jìn)程所占用的資源,因而永遠(yuǎn)無...
    yjaal閱讀 1,510評論 0 6
  • 一生至少該有一次 為了某人而忘了自己 不求有結(jié)果 不求同行 不求曾經(jīng)擁有 甚至不求你愛我 只求...
    虢季子白閱讀 721評論 15 7
  • 上一章:疑神疑鬼(四) 依然不知道是幾號,不過我在這里的時間肯定是很久了,久到我都記不清楚了。也沒什么,我懶得去想...
    寄長川閱讀 263評論 0 0