天天看點

死鎖概述---定義、危害、必要條件和處理方法

​ 死鎖是一組程序在執行的過程中,因為競争資源或者推進順序不當導緻的一種情況,在這種情況下,每個程序都在持有着自己已經搶占的資源,又同時等待别人釋放資源,最終這一組程序都一直僵持誰也無法運作。其實我們在前面的學習中已經接觸過死鎖的概念了,比如我們前面講到的​​哲學家進餐問題​​,如果每一位哲學家都因饑餓同時拿起了他們左邊的筷子,當每位哲學家又試圖拿起他們右邊的筷子時,将會因為無法擷取筷子而無限期的等待,進而産生死鎖問題,在當時我們戲說哲學家會因為饑餓而餓死。在我們之前的文章中,我們讨論了許多種方法來解決哲學家進餐問題,這些方法也就是解決死鎖問題的一些探讨,今天,就讓我們一起來研究死鎖,讓死鎖對你毫無保留。

1.死鎖的定義

​ 在一組程序發生死鎖的情況下,這組死鎖程序中的每一個程序,都在等待另一個死鎖程序所占有的資源。但是由于所有這些程序都因為申請不到臨界資源而無法運作,也是以無法釋放已經擷取的資源,緻使沒有任何一個程序能被喚醒,導緻所有的程序隻能無限期的等待下去。

​ 是以,死鎖的定義如下:如果一組程序中的每一個程序都在等待由該組程序中其他程序才能引發的事件,那麼該組程序是死鎖的。

​ 這裡,我們再次把死等和忙等這兩個概念提出來,我們着重說一下死等。死等這個概念出于程序同步機制的四大原則----有限等待:對要求進入臨界區的程序,應保證在有限的時間能進入自己的臨界區,以面陷入“死等”狀态。這裡我們在結合死鎖的定義、哲學家進餐問題來看,死等中的有限時間就是避免程序進入死鎖狀态,這兩個概念在一定程度上也是相同的。

2.死鎖的危害

​ 通過上面的描述,我們也能知道,死鎖不是一個好的現象,應該說他是是一個會導緻OS資源使用率降低甚至會導緻OS崩潰的毒瘤。下面我們來一起看下死鎖的危害:

  • 死鎖會使這一組程序無法繼續運作,是以這些程序無法得到正确的結果,而這可能就是導緻我們使用電腦的過程中出現程序未響應的原因;
  • 死鎖會使OS中的資源的使用率降低。因為處于死鎖狀态的程序不釋放已占有的資源,以至于這些資源一直無法被其他程序利用;
  • 死鎖可能導緻系統崩潰。如果涉及的程序占有過多的資源,那麼這一組相關程序的範圍就會擴大,就像瘟疫一樣,逐漸傳播,最後導緻OS中沒有一個程序可以執行。

3.死鎖産生的原因

​ 知道了死鎖的危害後,我們就需要看下死鎖是如何産生的?首先我們要明白,死鎖的起因通常是源于多個程序對資源的争奪,死鎖的産生機率性事件(比如哲學家進餐問題中,五個哲學家都拿起了左邊的筷子時,才有可能發生死鎖),就算滿足産生死鎖的條件,死鎖不一定會發生。

​ 要了解死鎖産生的原因前,我們需要了解下計算機中的資源種類。

​ 可重用性資源:可重用性資源,顧名思義,可供使用者重複使用多次的資源,它具有以下三個性質:1.每一個可重用性資源中的單元隻能配置設定給一個程序使用,無法多個程序同時共享;2.程序使用資源必須要,請求資源->使用資源->釋放資源;3.系統中每一類可重用性資源的單元數目是相對固定的,程序運作期間無法建立也無法删除。可重用性資源是典型的臨界資源。

​ 可消耗性資源:又稱為臨時性資源,和可重用性資源相反,它是程序在運作期間動态地建立和消耗的,它具有如下性質:1.系統中每一類可消耗性的單元數目在程序運作期間是可以不斷變化的;2.程序在運作期間,是可以不斷的創造的;3.程序運作期間是可以請求若幹可消耗性資源單元的,用于程序消耗,不再歸還。可消耗性資源通常是由生産者程序建立,由消費者程序消耗,是典型的生産者-消費者問題。

​ 另外,還有就是可搶占性資源和不可搶占性資源。可搶占性資源如CPU、主存,程序獲得後可被其他程序搶占,這類資源的競争是不會引起死鎖的;不可搶占性資源如錄音帶機、列印機,程序獲得後,就不能強行回收,隻能在程序使用完畢後自行釋放。

​ 下面我們來看下死鎖産生的原因:

  1. 競争不可搶占性資源引起死鎖:通常系統中所擁有的的不可搶占性資源的數量不足以滿足多個程序的需要,使得程序在運作過程中,會因争奪資源而陷入僵局。例如,系統中隻有一台列印機R1和一台讀卡機R2,可供程序P1和P2共享,如果P1申請到R1,P2申請到R2,同時P1還需申請R2、P2還需申請R1,即形成資源申請環路,這樣會産生死鎖,如下圖所示。
死鎖概述---定義、危害、必要條件和處理方法
  1. 競争可消耗性資源引起死鎖:這類問題主要是程序間接收消息和發送消息的順序設定不當導緻的,例如程序A、B間通信,假設兩個程序等在等待對方的消息,但是因為誰都沒有發送消息,是以兩個程序就會一直處于等待接收消息,而程序無法順利的執行下去。就好像兩個武林高手一直在等對方先出招,最終。。。
  2. 程序推進順序不當引起死鎖:除了多個程序對資源的競争會引發死鎖外,程序在運作過程中,對資源進行申請和釋放的順序是否合法,也是會引起死鎖的。個人認為程序推進順序不當的根本原因還是競争不可搶占資源,還是以程序P1、P2競争R1、R2為例,程序P1的僞代碼為:P(R1)–>P(R2)–>do something–>V(R1)–>V(R2),程序P2的僞代碼為:P(R2)–>P(R1)–>do something–>V(R2)–>V(R1),如果P1和P2在某一時刻分别申請到了R1和R2,那麼就會形成資源申請環路,發生死鎖。

4.死鎖産生的必要條件

​ 通過上面的分析,不難看出,死鎖的産生是需要一定的條件的,下面我們一起來看下:

  1. 互斥條件:程序對所配置設定到的資源進行排它性使用,在一段時間内,某資源隻能被一個程序占用,也就是說臨界資源;
  2. 請求和保持條件:程序已經保持了至少一個資源,但是又提出了新的資源請求,而新的資源申請不到,此時程序被阻塞,但是不會釋放自己已經占用的資源;
  3. 不可搶占條件:程序已獲得的資源在未使用完成之前不能被搶占,隻能在程序使用完後自己釋放;
  4. 循環等待條件:也稱為環路條件,即在發生死鎖時,必然存在一個程序----資源的循環鍊,即上圖中的環形圖。

​ 死鎖的産生必須同時滿足上面四個必要條件,隻要其中一個不滿足,死鎖就不會發生,這也給我們處理死鎖問題帶來了思路。

5.處理死鎖的方法

​ 目前處理死鎖的方法可歸結為四種:

  1. 預防死鎖:通過設定某些限制條件,去破壞産生死鎖四個必要條件的一個或幾個來預防産生死鎖,這種政策也是比較簡單和直覺的,也比較容易實作;
  2. 避免死鎖:與破壞四個必要條件不同,避免死鎖是在資源的動态配置設定過程中,用某種方法防止系統進入不安全狀态,進而避免發生死鎖,有點像中國孟子所說,君子不立危牆之下;
  3. 檢測死鎖:實作不采取任何限制措施,允許程序在運作過程中發生死鎖,但可通過檢測機構及時檢測死鎖的發生,然後采取适當措施解除死鎖;
  4. 解除死鎖:與檢測死鎖相關聯,發生死鎖時采取相應措施,将程序從死鎖狀态中解脫出來。

​ 上述的四種方法,從1到4對死鎖的預防程度逐漸減弱,但對應的是資源使用率的提高和作業系統并發程度的提高。

​ 因為篇幅問題,就不把所有的知識點放到一篇部落格中了,關于預防死鎖和避免死鎖的描述,還請參考後面兩篇部落格。

​ 又到了分隔線以下,本文到此就結束了,本文内容全部都是由部落客自己進行整理并結合自身的了解進行總結,如果有什麼錯誤,還請批評指正。

​ 如有興趣,還可以檢視我的其他幾篇部落格,都是OS的幹貨,喜歡的話還請點贊、評論加關注^_^。

繼續閱讀