进程死锁的危害、导致原因和解决方法
? ? ?? 在多個程序同時執行的情況下,多個進程可能出現競爭一定數量的資源。若某個進程申請資源,且此時資源不可用,那么該進行將進入等待狀態。如果所申請的資源被其他等待進程占有,那么該等待進程有可能永遠處于等待狀態而無法改變該狀態。——這種情況即為死鎖。
? ? ? ? 或許你認為進程死鎖就死鎖唄,那又能怎么樣?那么先說出它的危害吧! ???????
???????? 當出現死鎖時,進程永遠不能完成,并且阻礙使用系統資源,阻止了其他作業開始執行,導致系統的資源利用率急劇下載,下面列舉出一些比較直接的影響。
???????? (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.饑餓:如何保證資源不會總是從同一個進程中被搶占。??
???????? 進程死鎖可以說一個資源分配的問題,如何解決其實可以認為是一個哲學問題。需要將上面的方法組合起來,以及針對系統的特征,才能最佳地處理系統地各種類型資源地分配問題。
總結
以上是生活随笔為你收集整理的进程死锁的危害、导致原因和解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程和线程的关系与区别
- 下一篇: C语言中static详细分析