死鎖的定義
在一組進程發生死鎖的情況下,這組死鎖進程中的每一個進程,都在等待另一個死鎖進程所佔有的資源。或者說每一個進程所等待的事件是該組進程釋放所有佔有的資源。但由於所有的這些進程都已無法運行,因此誰也不能釋放資源,致使沒有任何一個進程可被喚醒。這樣,這組進程只能無限期地等待下去。因此,死鎖可定義爲:如果一組進程中的每一個進程都在等待由該組進程中的其他進程才能引發的事件,那麼該組進程是死鎖的。
注:一個進程也可以引起死鎖。當某個進程已或得鎖,但因操作有誤,需要申請鎖,而進程又不釋放鎖,此時造成死鎖。
2. 產生死鎖的必要條件
雖然進程在運行過程中可能發生死鎖,但產生進程死鎖的必須同時具備以下4個條件,只要有一個條件不成立,死鎖就不會發生。
<1> 互斥條件。即在一段時間內,某資源只能被一個進程佔有。若還有其他進程請求資源,則請求 進程只能等待,直至佔有該資源的進程釋放。
<2> 請求與保持等待。進程已保持了至少一種資源,但又提出新的資源請求,而該資源又被其他進 程佔有,此時進程請求被阻塞,但對自己所佔有的資源並不釋放。
<3> 不可搶佔資源。進程已獲得的資源在未使用完前不能被搶佔,只能在進程使用完後自己釋放。
<4> 循環等待。在發生死鎖時,必然存在進程-資源的循環鏈。若進程集合{P0,P1,P2}中,P0正在等 待P1所佔的資源,P1等待P2所佔的資源,P2等待P0所佔的資源。
3. 處理死鎖的辦法
<1> 預防死鎖
產生死鎖必須同時滿足以上4個必要條件,只要有一個不滿足,死鎖便不會發生。所以,處理死鎖只需破壞4個必要條件即可。
<2> 避免死鎖
事先預防策略,但它並不是事先採取各種限制措施,去破壞產生死鎖的4個必要條件,而是在資源的動態分配過程中,用某種方法防止系統進入不安全狀態,從而避免死鎖。
<3> 檢測死鎖
這種方法無須事先採取任何的措施,允許進程在運行時發生死鎖。但可以通過檢測機構及時地檢測出死鎖的發生,然後採取適當的措施,將進程從死鎖中解脫出來。
<4> 解除死鎖
當檢測到系統中已發生死鎖,就需要採取相應的措施,將進程從死鎖中解脫出來。常用的方法是撤銷一些進程,回收它們的資源,將它們分配給已處於阻塞狀態的進程,使其繼續運行。還有一種方法就是終止進程。