什么是死鎖有什么處理及排除方法(2)
什么是死鎖有什么處理及排除方法
4)競爭臨時資源
上面所說的打印機資源屬于可順序重復使用型資源,稱為永久資源。還有一種所謂的臨時資源,這是指由一個進程產生,被另一個進程使用,短時間后便無用的資源,故也稱為消耗性資源,如硬件中斷、信號、消息、緩沖區內的消息等,它也可能引起死鎖。例如,SI,S2,S3是臨時性資源,進程P1產生消息S1,又要求從P3接收消息S3;進程P3產生消息S3,又要求從進程P2處接收消息S2;進程P2產生消息S2,又要求從P1處接收產生的消息S1。如果消息通信按如下順序進行:
P1: ···Relese(S1);Request(S3); ···
P2: ···Relese(S2);Request(S1); ···
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占用而阻塞,于是發生進程死鎖。
死鎖處理方法
在系統中已經出現死鎖后,應該及時檢測到死鎖的發生,并采取適當的措施來解除死鎖。[4]
1) 預防死鎖。
這是一種較簡單和直觀的事先預防的方法。方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但是由于所施加的限制條件往往太嚴格,可能會導致系統資源利用率和系統吞吐量降低。
2) 避免死鎖。
該方法同樣是屬于事先預防的策略,但它并不須事先采取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。
3)檢測和解除死鎖。
先檢測:這種方法并不須事先采取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在運行過程中發生死鎖。但可通過系統所設置的檢測機構,及時地檢測出死鎖的發生,并精確地確定與死鎖有關的進程和資源。檢測方法包括定時檢測、效率低時檢測、進程等待時檢測等。
然后解除死鎖:采取適當措施,從系統中將已發生的死鎖清除掉。
這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將進程從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處于阻塞狀態的進程,使之轉為就緒狀態,以繼續運行。死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。
死鎖的排除方法
1、撤消陷于死鎖的全部進程;
2、逐個撤消陷于死鎖的進程,直到死鎖不存在;
3、從陷于死鎖的進程中逐個強迫放棄所占用的資源,直至死鎖消失。
4、從另外一些進程那里強行剝奪足夠數量的資源分配給死鎖進程,以解除死鎖狀態
計算機網絡的死鎖
死鎖是網絡中最容易發生的故障之一,即使在網絡負荷不很重時也會發生。死鎖發生時,一組節點由于沒有空閑緩沖區而無法接收和轉發分組,節點之間相互等待,既不能接收分組也不能轉發分組,并一直保持這一僵局,嚴重時甚至導致整個網絡的癱瘓。此時,只能靠人工干預來重新啟動網絡,解除死鎖。但重新啟動后并未消除引起死鎖的隱患,所以可能再次發生死鎖。死鎖是由于控制技術方面的某些缺陷所引起的,起因通常難以捉摸、難以發現,即使發現,也常常不能立即修復。因此,在各層協議中都必須考慮如何避免死鎖的問題。
存儲轉發死鎖及其防止
最常見的死鎖是發生在兩個節點之間的直接存儲轉發死鎖。例如,A節點的所有緩沖區裝滿了等待輸出到B節點的分組,而B節點的所有緩沖區也全部裝滿了等待輸出到A節點的分組;此時,A節點不能從B節點接收分組,B節點也不能從A節點接收分組,從而造成兩節點間的死鎖。這種情況也可能發生在一組節點之間,例如,A節點企圖向B節點發送分組、B節點企圖向C節點發送分組、而C節點又企圖向A節點發送分組,但此時每個節點都無空閑緩沖區用于接收分組,這種情形稱做間接存儲轉發死鎖。當一個節點處于死鎖狀態時,所有與之相連的鏈路將被完全擁塞。
一種防止存儲轉發死鎖的方法是,每個節點設置M+1個緩沖區,并以0到M編號。M為通信子網的直徑,即從任一源節點到任一目的節點間的最大鏈路段數。每個源節點僅當其0號緩沖區空時才能接收源端系統來的分組,而此分組僅能轉發給1號緩沖區空閑的相鄰節點,再由該節點將分組轉發給它的2號緩沖區空閑的相鄰節點……最后,該分組或者順利到達目的節點并被遞交給目的端系統,或者到了某個節點編號為M的緩沖區中再也轉發不下去,此時一定發生了循環,應該將該分組丟棄。由于每個分組都是按照編號遞增規則分配緩沖區,所以節點之間不會相互等待空閑緩沖區而發生死鎖現象。這種方法的不足之處在于,當某節點雖然有空閑緩沖區,但正巧沒有所需要的特定編號的緩沖區時,分組仍要等待,從而造成了緩沖區和鏈路的浪費。
另一種防止存儲轉發死鎖的方法是,使每個分組上都攜帶一個全局性的惟一的"時間戳",每個節點要為每條輸入鏈路保留一個特殊的接收緩沖區,而其它緩沖區均可用于存放中轉分組。在每條輸出鏈路的隊列上分組按時間戳順序排隊。例如,節點A要將分組送到節點B,若B節點沒有空閑緩沖區,但正巧有要送到A節點的分組,此時A、B節點可通過特殊的接收緩沖區交換分組;若B節點既沒有空閑緩沖區,也沒有要送往A節點的分組,B節點只好強行將一個出路方向大致與A節點方向相同的分組與A節點互相交換分組,但此時A節點中的分組必須比B節點中的分組具有更早的時間戳,這樣才能保證子網中某個最早的分組不受阻擋地轉發到目的地。由此可見,每個分組最終總會成為最早的分組,并總能被一步一步地發送到目的節點,從而避免了死鎖現象的發生。
看過“死鎖的處理方法”的人還看了: