操做系統之進程死鎖

什麼是死鎖?


       舉個例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車經過,沒法讓兩輛汽車並行。若是有兩輛汽車A和B分別由橋的兩端駛上該橋,則對於A車來講,它走過橋面左面的一段路(即佔有了橋的一部分資源),要想過橋還須等待B車讓出右邊的橋面,此時A車不能前進;對於B車來講,它走過橋面右邊的一段路(即佔有了橋的一部分資源),要想過橋還須等待A車讓出左邊的橋面,此時B車也不能前進。兩邊的車都不倒車,結果形成互相等待對方讓出橋面,可是誰也不讓路,就會無休止地等下去。這種現象就是死鎖。若是把汽車比作進程,橋面做爲資源,那麼上述問題就描述爲:進程A佔有資源R1,等待進程B佔有的資源Rr;進程B佔有資源Rr,等待進程A佔有的資源R1。並且資源R1和Rr只容許一個進程佔用,即:不容許兩個進程同時佔用。結果,兩個進程都不能繼續執行,若不採起其它措施,這種循環等待情況會無限期持續下去,就發生了進程死鎖。 html

       進程死鎖:兩個或兩個以上的進程在執行過程當中,由於爭奪資源而形成的一種相互等待的現象,若無外力做用,他們都將沒法推動下去,此時系統產生死鎖。

死鎖必要條件


產生進程死鎖的4個必要條件:

     互斥條件:資源不能被共享,每一個資源一次只能被一個進程使用;算法

     請求與保持條件:指進程已經保持了至少一個資源,又提出新的資源請求,而該資源又被其餘進程佔有,此時請求進程阻塞,但又對本身得到的資源保持不放。安全

     不剝奪條件:進程已得到資源,在未使用完以前,不能強行剝奪;數據結構

     循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。spa

  上面咱們提到的這四個條件在死鎖時會同時發生。也就是說,只要有一個必要條件不知足,則死鎖就能夠排除。操作系統

死鎖處理辦法


針對死鎖出現以後的解決方法須要從原理上來講解決,這也是絕大多數操做系統所採用的方法:.net

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

(2)  系統可進入死鎖狀態,但可檢測死鎖狀態,而後進行解決;htm

預防死鎖

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

          互斥——對於非共享資源,必需要有互斥條件。不過一般不能經過否認互斥條件來預防死鎖:有的資源自己就是非共享的。

          佔有並等待——打破該條件,必須保證:當一個進程申請一個資源時,它不能佔有其餘資源

          非搶佔——對已分配的資源不能搶佔。確保該條件不成立,即一個已佔有資源的進程若要再申請新的資源,它必須先釋放已佔有的資源。若隨後再須要這些資源,須要從新申請。

          循環等待——確保該條件不成立的方法是對全部資源類型進行徹底排序,且要求每一個進程按遞增順序來申請資源

          預防死鎖的反作用下降設備的使用率和系統的吞吐率

避免死鎖

      要求操做系統事先獲得有關進程申請資源和使用資源的額外信息。經過獲悉這 些信息,系統將可以肯定:對於一個申請,進程是否應等待。死鎖避免算法動態地檢測資源分配狀態以確保循環等待條件不可能成立。資源分配狀態是由可用資源和 已分配資源,及進程最大需求所決定的。對於死鎖避免算法,不得不提到的概念——安全狀態。若是系統能按某個順序爲每一個進程分配資源(不超過其最大值)並能 避免死鎖,那麼系統狀態就是安全的。死鎖避免算法通常有兩種:

  1. 資源分配圖算法——針對每種資源類型只有單個實例的資源分配系統;
  2. 銀行家算法——適用於每種資源類型有多個實例的資源分配系統,但效率比資源分配圖方案低。

檢測死鎖

    當死鎖避免和死鎖預防都失效後,那麼就必需要檢測出進程是否死鎖仍是進程異常,系統須要提供兩種算法:

  1. 檢測系統狀態,並可以肯定是否出現了死鎖;
  2. 出現死鎖時,及時解決

         檢測死鎖的算法須要區分每種資源類型只有單個實例和多個實例的狀況:

         當只有單個實例時,可使用資源分配圖的一個變種,即等待圖。從資源分配圖種,刪除全部的資源類型節點,合併適當邊,便可獲得等待圖。

         當有多個實例時,須要採用銀行家算法的變種,而使用了一些隨時間而變化的數據結構

          爲了提升檢測算法的效率,須要肯定什麼時候調用檢測算法。這取決於兩種因素:

  1. 死鎖發生的頻率;——若是常常發生死鎖,那麼就應常常調用檢測算法。而當某個進程提出請求且得不到知足時,有可能出現死鎖。在極端狀況下,每次請求分配不摁嗯當即獲得容許時,就調用死鎖檢測算法。
  2. 死鎖發生了,影響的進程數量有多少

死鎖解除

    常見的解除死鎖的兩種方法:

  1. 剝奪資源,從其餘進程剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態。
  2. 撤銷進程,最簡單的撤銷進程方法是使所有死鎖進程都夭折掉,稍微溫和點的方法是按照某種順序逐個的撤銷進程,直至有足夠的資源可用,使死鎖進程狀態取消。

參考

http://www.cnblogs.com/bao-yu/p/5429300.html

http://blog.csdn.net/jirongzi_cs2011/article/details/9406281

相關文章
相關標籤/搜索