如果一組進程中每一個進程都在等待僅由該組進程中的其他進程才能引發的事件,那么該組進程是死鎖的。
舉例來說:有兩個進程A和B,A持有資源a等待b資源,B持有資源b等待a資源,兩個進程都在等待另一個資源的同時不釋放資源,就形成死鎖。
形成死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
處理死鎖的思路如下:
預防死鎖:破壞四個必要條件中的一個或多個來預防死鎖
避免死鎖:在資源動態分配的過程中,用某種方式防止系統進入不安全的狀態。
檢測死鎖:運行時產生死鎖,及時發現思索,將程序解脫出來。
解除死鎖:發生死鎖后,撤銷進程,回收資源,分配給正在阻塞狀態的進程。
預防死鎖的辦法:
破壞請求和保持條件:1.一次性的申請所有資源。之后不在申請資源,如果不滿足資源條件則得不到資源分配。2.只獲得初期資源運行,之后將運行完的資源釋放,請求新的資源。
破壞不可搶占條件:當一個進程獲得某種不可搶占資源,提出新的資源申請,若不能滿足,則釋放所有資源,以后需要,再次重新申請。
破壞循環等待條件:對資源進行排號,按照序號遞增的順序請求資源。若進程獲得序號高的資源想要獲取序號低的資源,就需要先釋放序號高的資源。
死鎖的解除辦法:
1、搶占資源。從一個或多個進程中搶占足夠數量的資源,分配給死鎖進程,以解除死鎖狀態。
2、終止(撤銷)進程:將一個或多個思索進程終止(撤銷),直至打破循環環路,使系統從死鎖狀態解脫。