死鎖的產生原因&&產生的必要條件&&處理方法

        在多道程序中,雖可藉助多個進程的併發執行來改善系統的資源利用率,提高系統的吞吐量,但可能發生一種危險——死鎖。所謂死鎖(Dadlock),  是指多個進程在運行過程中因競爭資源而造成的一種僵局(DeadlyEmbrace),當前這種進程處於這種僵持狀態時,若無外力作用,他們都無法再向前推進,如把信號量作爲同步機制時,多和wait和signal操作書序不當,就會產生進程死鎖。


產生死鎖的原因可以歸結爲以下兩點:

 1.競爭資源:當系統中提供多個進程共享資源,其數目不足以滿足諸進程的需要時,會引起諸進程對資源的競爭而產生死鎖。

       1)可剝奪和非剝奪性資源:

           一類是可剝奪性資源:是某進程在獲得這類資源後,該資源可以再被其他進程或系統剝奪。

           另一類是不可剝奪性資源,當系統把這類資源分配給某個進程後,再不能強行回收,只能再該進程用完後釋放。

       2)競爭非剝奪性資源

          在系統中配置的非剝奪性資源,由於它們的數量不能滿足諸進程運行時的需要,會使得進程在運行過程中,因競爭這些資源而陷入僵局。

       3)競爭臨時性資源

          是指有一個進程產生,被另一個進程使用該、一個短暫時間後便無用的資源,故也稱爲消耗資源,它可能引起死鎖。

 2.進程間推進順序非法,進程在運行過程中,請求和釋放資源的順序不當,也同樣會導致進程死。

       1)進程推進順序合法

          由於進程在運行過程中具有異步的特性,

       2)進程推進順序非法


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

 雖然進程在運行過程中可能產生死鎖,但死鎖的發生也必須具備一定的條件。

       1)互斥條件:指進程對所分配到的資源進行排他性使用,即在某段時間內某資源只有一個進程佔有。如果此時還有其他進程請求該資源,則請求者只能等待,直至佔有該資源的進程用畢釋放。

       2)請求和保持資源:指進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其他進程佔有,此時請求進程阻塞,但又對其擁有的資源保持不放。

       3)不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完之後自己釋放。

       4)環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,....Pn}中的P0正在等待一個P1佔用的資源,P1正在等待P2佔用的資源,............,Pn正在等待P0佔用的資源。


 處理死鎖的基本方法:

       1)預防死鎖:這是一種較簡單和直觀的事先預防的方法。該方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或幾個條件。來預防發生死鎖。

       2)避免死鎖:該方法同樣是事先預防的策略,但它不須事先採取什麼限制來破壞產生死鎖的四個必要條件,而是在資源的動態分配過程中,用某些方法防止系統進入不安全狀態從而避免發生死鎖。這種方法只需事先施加較弱的限制條件,便可獲得較高的資源利用率和系統吞吐量。

       3)檢測死鎖:不必事先採取任何措施,也不必檢測系統是否已經進入不安全狀態,而是允許系統在運行過程中產生死鎖,但可以通過系統設置的檢驗機構,及時檢測出死鎖的發生,並精確地確定與死鎖有關的進程資源,然後採取適當的措施,清楚系統中的死鎖。

       4)解除死鎖:這是與檢測死鎖相配套的一種措施,當檢測到系統中發生死鎖時,需將進程從死鎖中解脫出來,常用的方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給處於阻塞狀態的進程,以繼續運行。




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