【死鎖】是指各併發進程互相等待對方所擁有的資源,且這些併發進程在獲得對方的資源以前不會釋放本身所擁有的資源(排除管理干預)。從而形成你們都想獲得資源而又都得不到資源,各併發進程不能繼續向前推動的狀態。(以下圖)
通常地,能夠把死鎖描述爲:有併發進程P1,P2,……,Pn,它們共享資源R1,R2,……,Rm(n>0, m>0, n>=m)。其中,每一個Pi(1<=i<=n)擁有資源Rj(1<=j<=m),直到再也不有剩餘資源。同時,各Pi在又不釋放Rj的前提下要求獲得Rk(k不等於j,1<=k<=m),從而形成資源的互相佔用和互相等待。在沒有外力的驅動的狀況下,該組併發進程中止往前推動,陷入永久等待狀態。算法
死鎖的原由是併發進程的資源競爭,而計算機的資源又是有限的,不可能無限制的給每一個進程提供資源。併發
死鎖破除:只要上述四個條件中的任意一個條件被破壞,死鎖便可破除。進程
解決死鎖的方法通常可分爲預防、避免、檢測與恢復3種。資源
預防是採用某種策略限制併發進程對資源的請求。(靜態策略)
(1)打破資源的互斥和不可剝奪這兩個條件。例如容許進程同時訪問某些資源。(缺點?)
(2)打破資源的部分分配這個死鎖產生的必要條件。即預先分配各併發進程所須要的所有資源。若是某個進程的資源得不到知足的時候,則安排必定的等待次序讓其餘進程釋放資源。(缺點?)
(3)打破死鎖的環路條件。即把資源按順序排列,使進程在申請、保持資源時不造成環路。若有m種資源,則列出R1 < R2 < …… < Rm。若進程Pi保持了資源Ri,則它只能申請比Ri級別更高的資源Rj(Ri < Rj)。釋放資源時必須是Rj先於Ri被釋放,從而避免環路的產生。這中方法的缺點是限制了進程對資源的請求,並且對資源的分類編序也耗去必定的系統開銷。循環
在系統動態分配資源的過程當中預測出死鎖發生的可能性並加以免。
一種基本模式是把進程分爲多個步,其中每一個步所使用的資源是固定的,且在一個步內,進程所保持的資源數不變。即進程的資源請求、使用與釋放要依靠不一樣的步完成。
死鎖避免須要佔據較大的系統開銷。請求
當進程進行資源請求時,死鎖檢測算法檢查併發進程組是否構成資源的請求和保持環路。(有限狀態轉移圖、PetriNet等技術均可有效的判斷死鎖發生)。死鎖的恢復辦法較多,最簡單的是終止各鎖住的進程,或按必定的順序停止進程序列,直至已釋放的資源足夠剩下的進程執行結束爲止。另外,也可從被鎖住的進程強行剝奪資源打破不可剝奪條件解除死鎖。程序