1. 程式人生 > >死鎖產生的條件以及解決方法

死鎖產生的條件以及解決方法

工作 發生 強行 結束 死鎖的四個必要條件 申請 必須 缺點 而且

本文主要講為什麽會產生死鎖?如何避免以及發生死鎖該如何恢復死鎖?


產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不可剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 環路等待條件:若幹進程之間形成一種頭尾相接的循環等待資源關系。
只要系統發生了死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。


1.預防死鎖
預防死鎖的發生只需破壞死鎖產生的四個必要條件之一即可。
1) 破壞互斥條件
如果允許系統資源都能共享使用,則系統不會進入死鎖狀態。但有些資源根本不能同時訪問,如打印機等臨界資源只能互斥使用。所以,破壞互斥條件而預防死鎖的方法不太可

行,而且在有的場合應該保護這種互斥性。


2) 破壞不剝奪條件
當一個已保持了某些不可剝奪資源的進程,請求新的資源而得不到滿足時,它必須釋放已經保持的所有資源,待以後需要時再重新申請。這意味著,一個進程已占有的資源會被暫時釋放,或者說是被剝奪了,或從而破壞了不可剝奪條件。該策略實現起來比較復雜,釋放已獲得的資源可能造成前一階段工作的失效,反復地申請和釋放資源會增加系統開銷,降低系統吞吐量。這種方法常用於狀態易於保存和恢復的資源,如CPU 的寄存器及內存資源,一般不能用於打印機之類的資源。
3) 破壞請求和保持條件


釆用預先靜態分配方法,即進程在運行前一次申請完它所需要的全部資源,在它的資源未滿足前,不把它投入運行。一旦投入運行後,這些資源就一直歸它所有,也不再提出

其他資源請求,這樣就可以保證系統不會發生死鎖。這種方式實現簡單,但缺點也顯而易見,系統資源被嚴重浪費,其中有些資源可能僅在運行初期或運行快結束時才使用,甚至根本不使用。而且還會導致“饑餓”現象,當由於個別資源長期被其他進程占用時,將致使等待該資源的進程遲遲不能開始運行。


4) 破壞環路等待條件

為了破壞循環等待條件,可釆用順序資源分配法。首先給系統中的資源編號,規定每進程,必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要進程提
出申請分配資源Ri,則該進程在以後的資源申請中,只能申請編號大於Ri 的資源。這種方法存在的問題是,編號必須相對穩定,這就限制了新類型設備的增加;盡管在
為資源編號時已考慮到大多數作業實際使用這些資源的順序,但也經常會發生作業使甩資

源的順序與系統規定順序不同的情況,造成資源的浪費;此外,這種按規定次序申請資源的方法,也必然會給用戶的編程帶來麻煩。


2.避免死鎖
銀行家算法。


3.檢測死鎖
死鎖定理。


4.解除死鎖
4.1 從死鎖進程處剝奪資源
4.2 終止部分或全部進程

死鎖產生的條件以及解決方法