程序死鎖的危害 導致原因 解決方法

2021-06-10 00:38:14 字數 3079 閱讀 5358

在多個程式同時執行的情況下,多個程序可能出現競爭一定數量的資源。若某個程序申請資源,且此時資源不可用,那麼該進行將進入等待狀態。如果所申請的資源被其他等待程序占有,那麼該等待程序有可能永遠處於等待狀態而無法改變該狀態。——這種情況即為死鎖

或許你認為程序死鎖就死鎖唄,那又能怎麼樣?那麼先說出它的危害吧!        

(1)死鎖會使程序得不到正確的結果。因為處於死鎖狀態的程序得不到所需的資源,不能向前推進,故得不到結果。

(2)死鎖會使資源的利用率降低。因為處於死鎖狀態的程序不釋放已占有的資源,以至於這些資源不能被其他程序利用,故系統資源利用率降低。

(3)死鎖還會導致產生新的死鎖。其它程序因請求不到死鎖程序已占用的資源而無法向前推進,所以也會發生死鎖。

所以程序出現了死鎖,有可能產生多公尺諾骨牌效應,最終會導致作業系統崩潰。

程序死鎖有這麼厲害的***,那麼在什麼條件下產生死鎖呢?

程序死鎖的四個必要條件:

(1) 互斥:至少有乙個資源必須處於非共享模式,即乙個資源一次只有乙個程序使用。如果另一程序申請該資源,那麼申請程序必須等到該資源被釋放為止。

(2) 占有並等待:乙個程序必須占有至少乙個資源,並等待另一為其他程序所占有的資源。

(3) 非搶占:資源不能被搶占,即資源只能在程序完成任務後自動釋放。

(4) 迴圈等待: 有一組等待程序{p0, p1, ..., pn},p0等待的資源為p1所占有,p1等待的資源為p2所占有,。。。,pn-1等待的資源為pn所占有,最後pn等待的資源為p0所占有,從而形成了乙個等待迴圈。

如果出現了同時滿足上述四個條件的多個程序,那麼就會出現程序死鎖。如何解決死鎖的問題呢?

針對死鎖出現之後的解決方法需要從原理上來說解決,這也是絕大多數作業系統所採用的方法:

(1)  使用協議以預防或避免死鎖,確保系統不會進入死鎖狀態;

(2)  系統可進入死鎖狀態,但可檢測死鎖狀態,然後進行恢復;

(3)  忽視該問題,而認為死鎖不可能在系統內發生。 ——即應用程式開發人員來處理死鎖問題

其中第一種方法為死鎖預防、避免

既然需要同時滿足四個條件還能出現死鎖,那麼預防死鎖的方法顯然會有多種。預防的核心思想即為,打破同時滿足四個條件的條件,即可解決程序死鎖的問題。也就是說,只要確保至少有乙個必要條件不成立,就能預防死鎖發生。

互斥——對於非共享資源,必須要有互斥條件。不過通常不能通過否定互斥條件來預防死鎖:有的資源本身就是非共享的。

占有並等待——打破該條件,必須保證:當乙個程序申請乙個資源時,它不能占有其他資源

非搶占——對已分配的資源不能搶占。確保該條件不成立,可以使用如下協議:如果乙個程序占有資源並申請並乙個不能立即分配的資源,那麼其現已分配的資源都可被搶占。即這些資源都被隱式釋放。

迴圈等待——確保該條件不成立的方法是對所有資源型別進行完全排序,且要求每個程序按遞增順序來申請資源

預防死鎖的***降低裝置的使用率和系統的吞吐率

而對於死鎖避免,要求作業系統事先得到有關程序申請資源和使用資源的額外資訊。通過獲悉這些資訊,系統將能夠確定:對於乙個申請,程序是否應等待。死鎖避免演算法動態地檢測資源分配狀態以確保迴圈等待條件不可能成立。資源分配狀態是由可用資源和已分配資源,及程序最大需求所決定的。對於死鎖避免演算法,不得不提到的概念——安全狀態。如果系統能按某個順序為每個程序分配資源(不超過其最大值)並能避免死鎖,那麼系統狀態就是安全的。死鎖避免演算法一般有兩種:

(1)資源分配圖演算法——針對每種資源型別只有單個例項的資源分配系統;

(2)銀行家演算法——適用於每種資源型別有多個例項的資源分配系統,但效率比資源分配圖方案低。

當死鎖避免和死鎖預防都失效後,那麼就可以使用方法2了!在這種環境下,系統需要提供兩種演算法:

(1)檢測系統狀態,並能夠確定是否出現了死鎖;

(2)出現死鎖時,及時恢復

檢測死鎖的演算法需要區分每種資源型別只有單個例項和多個例項的情況:

當只有單個例項時,可以使用資源分配圖的乙個變種,即等待圖。從資源分配圖種,刪除所有的資源型別節點,合併適當邊,即可得到等待圖。

當有多個例項時,需要採用銀行家演算法的變種,而使用了一些隨時間而變化的資料結構

為了提高檢測演算法的效率,需要確定何時呼叫檢測演算法。這取決於兩種因素:

(1)死鎖發生的頻率;——如果經常發生死鎖,那麼就應經常呼叫檢測演算法。而當某個程序提出請求且得不到滿足時,有可能出現死鎖。在極端情況下,每次請求分配不摁嗯立即得到允許時,就呼叫死鎖檢測演算法。

(2)死鎖發生了,影響的程序數量有多少

當檢測到死鎖確實存在時,那麼需要採用多種措施進行死鎖恢復。一般來說,有兩種措施:1.通知操作員死鎖發生,而讓操作人員人工處理死鎖;2.讓系統從死鎖狀態中自動恢復過來。打破死鎖的兩種是:1.簡單地終止乙個或多個程序以打破迴圈等待;2.從乙個或多個死鎖程序那裡搶占乙個或多個資源

程序終止方法:1.一次只終止乙個程序直到取消死鎖迴圈為止。每次終止乙個程序,都必須呼叫死鎖檢測演算法以確定程序是否仍處於死鎖;每次終止地程序需要一定地策略來確定終止代價最小地程序。

2.終止所有程序。終止了死鎖迴圈,但其程序地計算結果必須放棄,代價較大。       

使用搶占來處理死鎖,需要三個問題需要處理:

1.如何選擇乙個犧牲品;

2.回滾:對於被搶占資源的資源,需要對該程序做什麼安排;

3.飢餓:如何保證資源不會總是從同乙個程序中被搶占。  

程序死鎖可以說乙個資源分配的問題,如何解決其實可以認為是乙個哲學問題。需要將上面的方法組合起來,以及針對系統的特徵,才能最佳地處理系統地各種型別資源地分配問題。

死鎖產生原因及解決方法

死鎖 執行緒級 死鎖是指兩個或兩個以上的執行緒在執行過程中,由於競爭資源而造成的一種阻塞的現象 產生的4個條件 1 互斥使用 即乙個執行緒在使用時,另外執行緒不可使用 2 不可搶占資源 資源請求者不能強制從資源佔有者手中奪取資源 3 占有且等待 當前執行緒在請求其他資源時,保持對原有資源占有 4 迴...

死鎖的概念和原因 解決方法

死鎖是指多個程序迴圈等待彼此占有的資源而無限期的僵持等待下去的局面。原因是 需要同時具有以下四個條件 為使系統不發生死鎖,必須設法破壞產生死鎖的四個必要條件之一,或者允許死鎖產生,但當死鎖發生時能檢測出思索,並有能力實現恢復。一般有死鎖的預防 死鎖避免 死鎖的檢測與恢復三種方法。1 死鎖預防 破壞導...

死鎖解決方法

死鎖是程序併發執行過程中可能出現的現象,哲學家就餐問題是描述死鎖的經典例子。為了防止死鎖,可以採用資源預分配法或者資源按序分配法。資源預分配法是指程序在執行前一次性地向系統申請它所需要的全部資源,如果系統當前不能夠滿足程序的全部資源請求,則不分配資源,此程序暫不投入執行,如果系統當前能夠滿足程序的全...