【linux】死鎖的概念和解決辦法

(一)死鎖的概念

       可以理解成多個併發進程因爭奪非共享的系統資源而產生相互等待的現象。存在兩個或者多個線程互相持有對方所需要的資源,導致這些線程處於等待狀態,無法前往執行。當線程在佔有資源和釋放資源期間,其他線程將不能搶佔該資源。當線程互相持有對方所需要的資源時,會互相等待對方釋放資源,如果線程都不主動釋放所佔有的資源,將產生死鎖。

(二)死鎖產生必須同時滿足的4個條件

        如果在計算機系統中同時具備下面四個必要條件時,那麼會發生死鎖。換句話說,只要下面四個條件有一個不具備,系統就不會出現死鎖。

    1、互斥條件。即某個資源在一段時間內只能由一個進程佔有,不能同時被兩個或兩個以上的進程佔有。這種獨佔資源如CD-ROM驅動器,打印機等等,必須在佔有該資源的進程主動釋放它之後,其它進程才能佔有該資源。這是由資源本身的屬性所決定的。如獨木橋就是一種獨佔資源,兩方的人不能同時過橋。

    2、不可搶佔條件。進程所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者進程自行釋放。如過獨木橋的人不能強迫對方後退,也不能非法地將對方推下橋,必須是橋上的人自己過橋後空出橋面(即主動釋放佔有資源),對方的人才能過橋。

    3、佔有且申請條件。進程至少已經佔有一個資源,但又申請新的資源;由於該資源已被另外進程佔有,此時該進程阻塞;但是,它在等待新資源之時,仍繼續佔用已佔有的資源。還以過獨木橋爲例,甲乙兩人在橋上相遇。甲走過一段橋面(即佔有了一些資源),還需要走其餘的橋面(申請新的資源),但那部分橋面被乙佔有(乙走過一段橋面)。甲過不去,前進不能,又不後退;乙也處於同樣的狀況。

   4、循環等待條件。存在一個進程等待序列{P1,P2,...,Pn},其中P1等待P2所佔有的某一資源,P2等待P3所佔有的某一源,......,而Pn等待P1所佔有的的某一資源,形成一個進程循環等待環。就像前面的過獨木橋問題,甲等待乙佔有的橋面,而乙又等待甲佔有的橋面,從而彼此循環等待。

(三)死鎖的危害

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

   2、使資源的利用率降低。因爲處於死鎖狀態的進程不釋放已佔有的資源,以至於這些資源不能被其他進程利用,故系統資源利用率降低。

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

 總之 所以進程出現了死鎖,有可能產生多米諾骨牌效應,最終會導致操作系統崩潰。

(四)死鎖預防,確保系統永遠不會進入死鎖狀態

   1、破壞“佔有且等待”條件
         方法1:所有的進程在開始運行之前,必須一次性地申請其在整個運行過程中所需要的全部資源。但是這種方法會因爲某項資源不滿足,進程無法啓動,而其他已經滿足了的資源也不會得到利用,嚴重降低了資源的利用率,造成資源浪費。使進程經常發生飢餓現象。
        方法2:該方法是對第一種方法的改進,允許進程只獲得運行初期需要的資源,便開始運行,在運行過程中逐步釋放掉分配到的已經使用完畢的資源,然後再去請求新的資源。這樣的話,資源的利用率會得到提高,也會減少進程的飢餓問題。

   2、破壞“不可搶佔”條件
       當一個已經持有了一些資源的進程在提出新的資源請求沒有得到滿足時,它必須釋放已經保持的所有資源,待以後需要使用的時候再重新申請。這就意味着進程已佔有的資源會被短暫地釋放或者說是被搶佔了。
      該種方法實現起來比較複雜,且代價也比較大。釋放已經保持的資源很有可能會導致進程之前的工作實效等,反覆的申請和釋放資源會導致進程的執行被無限的推遲,這不僅會延長進程的週轉週期,還會影響系統的吞吐量。

   3、破壞“循環等待”條件
        可以通過定義資源類型的線性順序來預防,可將每個資源編號,當一個進程佔有編號爲i的資源時,那麼它下一次申請資源只能申請編號大於i的資源。如圖所示:

        
這樣雖然避免了循環等待,但是這種方法是比較低效的,資源的執行速度回變慢,並且可能在沒有必要的情況下拒絕資源的訪問,比如說,進程c想要申請資源1,如果資源1並沒有被其他進程佔有,此時將它分配個進程c是沒有問題的,但是爲了避免產生循環等待,該申請會被拒絕,這樣就降低了資源的利用率

(五)避免死鎖 ,在使用前進行判斷,只允許不會產生死鎖的進程申請資源

        系統對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,如果分配後系統可能發生死鎖,則不予分配,否則予以分配,這是一種保證系統不進入死鎖狀態的動態策略。

        最著名的就是使用銀行家算法每一個線程進入系統時,它必須聲明在運行過程中,所需的每種資源類型最大數目,其數目不應超過系統所擁有每種資源總量,當線程請求一組資源系統必須確定有足夠資源分配給該進程,若有在進一步計算這些資源分配給進程後,是否會使系統處於不安全狀態,不會(即若能在分配資源時找到一個安全序列),則將資源分配給它,否則等待。

具體介紹:待續。。。

https://blog.csdn.net/qq_37934101/article/details/81869245

(六)死鎖檢測與解除,在檢測到運行系統進入死鎖,進行恢復。

   6.1 死鎖檢測

    待續。。。

   6.2 死鎖解除

      如果利用死鎖檢測算法檢測出系統已經出現了死鎖 ,那麼,此時就需要對系統採取相應的措施。常用的解除死鎖的方法:

      1、搶佔資源:從一個或多個進程中搶佔足夠數量的資源分配給死鎖進程,以解除死鎖狀態。

      2、終止(或撤銷)進程:終止或撤銷系統中的一個或多個死鎖進程,直至打破死鎖狀態。

           a、 終止所有的死鎖進程。這種方式簡單粗暴,但是代價很大,很有可能會導致一些已經運行了很久的進程前功盡棄。

           b、逐個終止進程,直至死鎖狀態解除。該方法的代價也很大,因爲每終止一個進程就需要使用死鎖檢測來檢測系統當前是否處於死鎖狀態。另外,每次終止進程的時候終止那個進程呢?每次都應該採用最優策略來選擇一個“代價最小”的進程來解除死鎖狀態。 一般根據進程的優先級、進程已運行時間以及運行完成還需要的時間、進程已佔用系統資源、進程運行完成還需要的資源、終止進程數目、進程是交互還是批處理,來決定終止哪個進程的。

 

參考文章:

https://blog.csdn.net/guaiguaihenguai/article/details/80303835

https://blog.csdn.net/dqjyong/article/details/8046397

https://blog.csdn.net/abigale1011/article/details/6450845

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章