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