死鎖的產生以及處理
死鎖的概念:
如果一組程序中的每一個程序都在等待僅由改組程序中的其他程序才能引發的事件,那麼改組程序是死鎖的。
產生死鎖的原因:
1、競爭資源引發程序死鎖
1)可剝奪資源和不可剝奪資源
系統中的資源可以分為兩類,一類是可剝奪資源,是指某程序在獲得這類資源後,該資源可以再被其他程序或系統剝奪。例如,優先權高的程序可以剝奪優先權低的程序的處理機。又如,記憶體區可由儲存器管理程式,把一個程序從一個儲存區移到另一個儲存區,此即剝奪了該程序原來佔有的儲存區,甚至可將一程序從記憶體調到外存上,可見,
2)競爭不可剝奪資源
在系統中所配置的不可剝奪資源,由於它們的數量不能滿足諸程序執行的需要,會使程序在執行過程中,因爭奪這些資源而陷於僵局。例如,系統中只有一臺印表機R1和一臺磁帶機R2,可供程序P1和P2共享。假定PI已佔用了印表機R1,P2已佔用了磁帶機R2,若P2繼續要求印表機R1,P2將阻塞;P1若又要求磁帶機,P1也將阻塞。於是,在P1和P2之間就形成了僵局,兩個程序都在等待對方釋放自己所需要的資源,但是它們又都因不能繼續獲得自己所需要的資源而不能繼續推進,從而也不能釋放自己所佔有的資源,以致進入死鎖狀態。
3)競爭臨時資源
上面所說的印表機資源屬於可順序重複使用型資源,稱為永久資源。還有一種所謂的臨時資源,這是指由一個程序產生,被另一個程序使用,短時間後便無用的資源,故也稱為消耗性資源,如硬體中斷、訊號、訊息、緩衝區內的訊息等,它也可能引起死鎖。例如,SI,S2,S3是臨時性資源,程序P1產生訊息S1,又要求從P3接收訊息S3;程序P3產生訊息S3,又要求從程序P2處接收訊息S2;程序P2產生訊息S2,又要求從P1處接收產生的訊息S1。如果訊息通訊按如下順序進行:
P1: ···Relese(S1);Request(S3); ···
P2:
P3: ···Relese(S3);Request(S2); ···
並不可能發生死鎖。但若改成下述的執行順序:
P1: ···Request(S3);Relese(S1);···
P2: ···Request(S1);Relese(S2); ···
P3: ···Request(S2);Relese(S3); ···
則可能發生死鎖。
2、程序推進順序不當引起死鎖
由於程序在執行中具有非同步性特徵,這可能使P1和P2兩個程序按下述兩種順序向前推進。
1) 程序推進順序合法
當程序P1和P2併發執行時,如果按照下述順序推進:P1:Request(R1); P1:Request(R2); P1: Relese(R1);P1: Relese(R2); P2:Request(R2); P2:Request(R1); P2: Relese(R2);P2: Relese(R1);這兩個程序便可順利完成,這種不會引起程序死鎖的推進順序是合法的。
2) 程序推進順序非法
若P1保持了資源R1,P2保持了資源R2,系統處於不安全狀態,因為這兩個程序再向前推進,便可能發生死鎖。例如,當P1執行到P1:Request(R2)時,將因R2已被P2佔用而阻塞;當P2執行到P2:Request(R1)時,也將因R1已被P1佔用而阻塞,於是發生程序死鎖。
死鎖產生的必要條件:
1)互斥條件:指程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個程序佔用。如果此時還有其它程序請求資源,則請求者只能等待,直至佔有資源的程序用畢釋放。
2)請求和保持條件:指程序已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它程序佔有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。
3)不可搶佔條件:指程序已獲得的資源,在未使用完之前,不能被搶佔,只能在使用完時由自己釋放。
4)迴圈等待序列:指在發生死鎖時,必然存在一個程序——資源的環形鏈,即程序集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
解除死鎖的方法:
1)終止(或撤銷)程序。終止(或撤銷)系統中的一個或多個死鎖程序,直至打破迴圈環路,使系統從死鎖狀態中解除出來。
2)搶佔資源。從一個或多個程序中搶佔足夠數量的資源,分配給死鎖程序,以打破死鎖狀態。
處理死鎖的方法:
1) 預防死鎖
這是一種較簡單和直觀的事先預防的方法。方法是通過設定某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但是由於所施加的限制條件往往太嚴格,可能會導致系統資源利用率和系統吞吐量降低。
2) 避免死鎖
該方法同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。
3) 檢測死鎖
這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在執行過程中發生死鎖。但可通過系統所設定的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的程序和資源,然後採取適當措施,從系統中將已發生的死鎖清除掉。
4) 解除死鎖
這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將程序從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些程序,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,以繼續執行。死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。