死鎖概念及產生原理
概念:多個並發進程因爭奪系統資源而產生相互等待的現象。
原理:當一組進程中的每個進程都在等待某個事件發生,而只有這組進程中的其他進程才能觸發該事件,這就稱這組進程發生了死鎖。
本質原因:
1)系統資源有限
2)進程推進順序不合理
死鎖產生的4個必要條件
1、互斥:某種資源一次只允許一個進程訪問,即該資源一旦分配給某個進程,其他進程就不能再訪問,直到該進程訪問結束。
2、占有且等待:一個進程本身占有資源(一種或多種),同時還有資源未得到滿足,正在等待其他進程釋放該資源。
3、不可搶占:別人已經占有了某項資源,你不能因為自己也需要該資源,就去把別人的資源搶過來。
4、循環等待:存在一個進程鏈,使得每個進程都占有下一個進程所需的至少一種資源。
當以上四個條件均滿足,才會造成死鎖,發生死鎖的進程無法進行下去,它們所持有的資源也無法釋放。這樣會導致CPU的吞吐量下降。所以死鎖情況是會浪費系統資源和影響計算機的使用性能的。
避免死鎖的方法
1、死鎖預防-----確保系統永遠不會進入死鎖狀態
產生死鎖需要四個條件,那么,只要這四個條件中至少有一個條件得不到滿足,就不可能發生死鎖了。由於互斥條件是非共享資源所必須的,不僅不能改變,還應加以保證,所以,主要是破壞產生死鎖的其他三個條件。
a、破壞“占有且等待”條件
方法1:所有的進程在開始運行之前,必須一次性地申請其在整個運行過程中所需要的全部資源。
優點:簡單易實施且安全
缺點:因為某項資源不滿足,進程無法啟動,而其他已經滿足了的資源也不會得到利用,嚴重降低了資源的利用率,造成資源浪費。使進程經常發生飢餓現象。
方法2:該方法是對第一種方法的改進,允許進程只獲得運行初期需要的資源,便開始運行,在運行過程中逐步釋放掉分配到的已經使用完畢的資源,然后再去請求新的資源。這樣的話,資源利用率會得到提高,也會減少進程的飢餓問題。
b、破壞“不可搶占”條件
當一個已經持有了一些資源的進程在提出新的資源請求沒有得到滿足時,它必須釋放已經保持的所有資源,待以后需要使用的時候再重新申請。這就意味着進程已占有的資源會被短暫地釋放或者說是被搶占了。
該方法實現起來比較復雜,且代價也比較大。釋放已經保持的資源很有可能會導致進程之前的工作實效等,反復的申請和釋放資源會導致進程的執行被無限的推遲,這不僅會延長進程的周轉周期,還會影響系統的吞吐量。
c、破壞“循環等待”條件
可以通過定義資源類型的線性順序來預防,可將每個資源編號,當一個進程占有編號為i的資源時,那么它下一次申請資源只能申請編號大於i的資源。如圖所示:
這樣雖然避免了循環等待,但是這種歌方法是比較低效的,資源的執行速度回變慢,並且可能在沒有必要的情況下拒絕資源的訪問,比如說,進程c想要申請資源1,如果資源1並沒有被其他進程占有,此時將它分配個進程c是沒有問題的,但是為了避免產生循環等待,該申請會被拒絕,這樣就降低了資源的利用率。
2、避免死鎖------在使用前進行判斷,只允許不會產生死鎖的進程申請資源
死鎖避免是利用額外的檢驗信息,在分配資源時判斷是否會出現死鎖,只在不會出現死鎖的情況下才分配資源。
兩種避免辦法:
1、如果一個進程的請求會導致死鎖,則不啟動該進程。
2、如果一個進程的增加資源請求會導致死鎖,則拒絕該申請。
避免死鎖的具體實現通常利用銀行家算法
3、死鎖檢測與解除-------在檢測到運行系統進入死鎖,進行恢復。
允許系統進入死鎖,如果利用死鎖檢測算法檢測出系統已經出現了死鎖,那么,此時就需要對系統采取相應的措施。常用的接觸死鎖的方法:
1)搶占資源:從一個或多個進程中搶占足夠數量的資源分配給死鎖進程,以解除死鎖狀態。
2)終止(或撤銷)進程:終止或撤銷系統中的一個或多個死鎖進程,直至打破死鎖狀態。