【多線程和併發】死鎖

死鎖產生的原因

1)競爭可重用不可搶佔式的資源

2)競爭可消耗資源

3)進程推進順序不當.

可重用性資源:可供重複使用多次的資源.

不可搶佔性資源:一旦系統把某資源分配給該進程後,就不能將它強行收回,只能在進程使用完後自動釋放.

可消耗資源:又叫臨時性資源,它是在進程運行期間,由進程動態的創建和消耗的.

 

產生死鎖的四個必要條件

1)互斥條件:一個資源每次只能被一個進程使用;

2)請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放;

3)不可剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪;

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

只要系統發生了死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

 

一、預防死鎖

預防死鎖的發生只需破壞死鎖產生的四個必要條件之一即可。

1)破壞互斥條件:

如果允許系統資源都能共享使用,則系統不會進入死鎖狀態。但有些資源根本不能同時訪問,如打印機等臨界資源只能互斥使用。所以,破壞互斥條件而預防死鎖的方法不太可行,而且在有點場合應該保護這種互斥性。

2)破壞請求與保持條件:

當一個已保持了某些不可剝奪資源的進程,請求新的資源而得不到滿足時,它必須釋放已經保持的所有資源,待以後需要時再重新申請。這意味着,一個進程已佔有的資源會被暫時釋放,或者說是被剝奪了,或從而破壞了不可剝奪條件。

該策略實現起來比較複雜,釋放已獲得的資源可能造成前一階段工作的失效,反覆的申請和釋放資源會增加系統開銷,降低系統吞吐量。這種方法常用於狀態易於保護和恢復的資源,如CPU的寄存器及內存資源,一般不能用於打印機之類的資源。

3)破壞不可剝奪條件:

採用預先靜態分配方法,即進程在運行前一次申請完它所需要的全部資源,在它的資源未滿足之前,不能把他投入運行。一旦投入運行後,這些資源就一直歸他所有,也不在提出其他資源請求,這樣就可以保證系統不會發生死鎖。

這種方式實現簡單,但是缺點也很明顯,系統資源被嚴重浪費,其中有些資源可能僅在出行初期或運行快結束時才使用。而且還會導致“飢餓”現象,當由於個別資源長期被其他進程佔用時,將致使等待該資源的進程遲遲不能開始運行。

4)破壞環路等待條件:

爲了破壞循環等待條件,可採用順序資源分配法。首先給系統中的資源編號,規定每個進程,必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要進程提出申請分配資源Ri,則該進程在以後的資源申請中,只能申請編號大於Ri的資源。

這種方法存在的問題是,編號必須相對穩定,這就限制了新類型設備的增加;儘管在爲資源編號時已考慮大多數作業實際使用這些資源的排序,但也經常會發生作業使用資源的順序與系統規定順序不同的情況,造成資源的浪費;此外,這種按規定次序申請資源的方法,也必然會給用戶的編程帶來麻煩。

二、避免死鎖

銀行家算法。

三、檢測死鎖

死鎖定理

四、解除死鎖

1)從死鎖進程處剝奪資源

2)終止部分或全部進程

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