进程死锁的危害、导致原因和解决方法
? ? ?? 在多個(gè)程序同時(shí)執(zhí)行的情況下,多個(gè)進(jìn)程可能出現(xiàn)競(jìng)爭(zhēng)一定數(shù)量的資源。若某個(gè)進(jìn)程申請(qǐng)資源,且此時(shí)資源不可用,那么該進(jìn)行將進(jìn)入等待狀態(tài)。如果所申請(qǐng)的資源被其他等待進(jìn)程占有,那么該等待進(jìn)程有可能永遠(yuǎn)處于等待狀態(tài)而無(wú)法改變?cè)摖顟B(tài)。——這種情況即為死鎖。
? ? ? ? 或許你認(rèn)為進(jìn)程死鎖就死鎖唄,那又能怎么樣?那么先說(shuō)出它的危害吧! ???????
???????? 當(dāng)出現(xiàn)死鎖時(shí),進(jìn)程永遠(yuǎn)不能完成,并且阻礙使用系統(tǒng)資源,阻止了其他作業(yè)開(kāi)始執(zhí)行,導(dǎo)致系統(tǒng)的資源利用率急劇下載,下面列舉出一些比較直接的影響。
???????? (1)死鎖會(huì)使進(jìn)程得不到正確的結(jié)果。因?yàn)樘幱谒梨i狀態(tài)的進(jìn)程得不到所需的資源,不能向前推進(jìn),故得不到結(jié)果。
???????? (2)死鎖會(huì)使資源的利用率降低。因?yàn)樘幱谒梨i狀態(tài)的進(jìn)程不釋放已占有的資源,以至于這些資源不能被其他進(jìn)程利用,故系統(tǒng)資源利用率降低。
???????? (3)死鎖還會(huì)導(dǎo)致產(chǎn)生新的死鎖。其它進(jìn)程因請(qǐng)求不到死鎖進(jìn)程已占用的資源而無(wú)法向前推進(jìn),所以也會(huì)發(fā)生死鎖。
???????? 所以進(jìn)程出現(xiàn)了死鎖,有可能產(chǎn)生多米諾骨牌效應(yīng),最終會(huì)導(dǎo)致操作系統(tǒng)崩潰。
???????? 進(jìn)程死鎖有這么厲害的副作用,那么在什么條件下產(chǎn)生死鎖呢?
???????? 進(jìn)程死鎖的四個(gè)必要條件:
?????? ? (1) 互斥:至少有一個(gè)資源必須處于非共享模式,即一個(gè)資源一次只有一個(gè)進(jìn)程使用。如果另一進(jìn)程申請(qǐng)?jiān)撡Y源,那么申請(qǐng)進(jìn)程必須等到該資源被釋放為止。
???????? (2) 占有并等待:一個(gè)進(jìn)程必須占有至少一個(gè)資源,并等待另一為其他進(jìn)程所占有的資源。
???????? (3) 非搶占:資源不能被搶占,即資源只能在進(jìn)程完成任務(wù)后自動(dòng)釋放。
???????? (4) 循環(huán)等待: 有一組等待進(jìn)程{P0, P1, ..., Pn},P0等待的資源為P1所占有,P1等待的資源為P2所占有,。。。,Pn-1等待的資源為Pn所占有,最后Pn等待的資源為P0所占有,從而形成了一個(gè)等待循環(huán)。
?????????如果出現(xiàn)了同時(shí)滿足上述四個(gè)條件的多個(gè)進(jìn)程,那么就會(huì)出現(xiàn)進(jìn)程死鎖。如何解決死鎖的問(wèn)題呢?
????????? 針對(duì)死鎖出現(xiàn)之后的解決方法需要從原理上來(lái)說(shuō)解決,這也是絕大多數(shù)操作系統(tǒng)所采用的方法:
??????? ? (1)? 使用協(xié)議以預(yù)防或避免死鎖,確保系統(tǒng)不會(huì)進(jìn)入死鎖狀態(tài);
????????? (2)? 系統(tǒng)可進(jìn)入死鎖狀態(tài),但可檢測(cè)死鎖狀態(tài),然后進(jìn)行恢復(fù);
????????? (3)? 忽視該問(wèn)題,而認(rèn)為死鎖不可能在系統(tǒng)內(nèi)發(fā)生。 ——即應(yīng)用程序開(kāi)發(fā)人員來(lái)處理死鎖問(wèn)題
????????? 其中第一種方法為死鎖預(yù)防、避免。
????????? 既然需要同時(shí)滿足四個(gè)條件還能出現(xiàn)死鎖,那么預(yù)防死鎖的方法顯然會(huì)有多種。預(yù)防的核心思想即為,打破同時(shí)滿足四個(gè)條件的條件,即可解決進(jìn)程死鎖的問(wèn)題。也就是說(shuō),只要確保至少有一個(gè)必要條件不成立,就能預(yù)防死鎖發(fā)生。
????????? 互斥——對(duì)于非共享資源,必須要有互斥條件。不過(guò)通常不能通過(guò)否定互斥條件來(lái)預(yù)防死鎖:有的資源本身就是非共享的。
????????? 占有并等待——打破該條件,必須保證:當(dāng)一個(gè)進(jìn)程申請(qǐng)一個(gè)資源時(shí),它不能占有其他資源。
????????? 非搶占——對(duì)已分配的資源不能搶占。確保該條件不成立,可以使用如下協(xié)議:如果一個(gè)進(jìn)程占有資源并申請(qǐng)并一個(gè)不能立即分配的資源,那么其現(xiàn)已分配的資源都可被搶占。即這些資源都被隱式釋放。
?????????? 循環(huán)等待——確保該條件不成立的方法是對(duì)所有資源類型進(jìn)行完全排序,且要求每個(gè)進(jìn)程按遞增順序來(lái)申請(qǐng)資源。
????????? 預(yù)防死鎖的副作用是降低設(shè)備的使用率和系統(tǒng)的吞吐率。
????????? 而對(duì)于死鎖避免,要求操作系統(tǒng)事先得到有關(guān)進(jìn)程申請(qǐng)資源和使用資源的額外信息。通過(guò)獲悉這些信息,系統(tǒng)將能夠確定:對(duì)于一個(gè)申請(qǐng),進(jìn)程是否應(yīng)等待。死鎖避免算法動(dòng)態(tài)地檢測(cè)資源分配狀態(tài)以確保循環(huán)等待條件不可能成立。資源分配狀態(tài)是由可用資源和已分配資源,及進(jìn)程最大需求所決定的。對(duì)于死鎖避免算法,不得不提到的概念——安全狀態(tài)。如果系統(tǒng)能按某個(gè)順序?yàn)槊總€(gè)進(jìn)程分配資源(不超過(guò)其最大值)并能避免死鎖,那么系統(tǒng)狀態(tài)就是安全的。死鎖避免算法一般有兩種:
??????? (1)資源分配圖算法——針對(duì)每種資源類型只有單個(gè)實(shí)例的資源分配系統(tǒng);
??????? (2)銀行家算法——適用于每種資源類型有多個(gè)實(shí)例的資源分配系統(tǒng),但效率比資源分配圖方案低。
????????? 當(dāng)死鎖避免和死鎖預(yù)防都失效后,那么就可以使用方法2了!在這種環(huán)境下,系統(tǒng)需要提供兩種算法:
????????? (1)檢測(cè)系統(tǒng)狀態(tài),并能夠確定是否出現(xiàn)了死鎖;
????????? (2)出現(xiàn)死鎖時(shí),及時(shí)恢復(fù)
? ? ???? 檢測(cè)死鎖的算法需要區(qū)分每種資源類型只有單個(gè)實(shí)例和多個(gè)實(shí)例的情況:
???????? 當(dāng)只有單個(gè)實(shí)例時(shí),可以使用資源分配圖的一個(gè)變種,即等待圖。從資源分配圖種,刪除所有的資源類型節(jié)點(diǎn),合并適當(dāng)邊,即可得到等待圖。
???????? 當(dāng)有多個(gè)實(shí)例時(shí),需要采用銀行家算法的變種,而使用了一些隨時(shí)間而變化的數(shù)據(jù)結(jié)構(gòu)
????????? 為了提高檢測(cè)算法的效率,需要確定何時(shí)調(diào)用檢測(cè)算法。這取決于兩種因素:
?????????? (1)死鎖發(fā)生的頻率;——如果經(jīng)常發(fā)生死鎖,那么就應(yīng)經(jīng)常調(diào)用檢測(cè)算法。而當(dāng)某個(gè)進(jìn)程提出請(qǐng)求且得不到滿足時(shí),有可能出現(xiàn)死鎖。在極端情況下,每次請(qǐng)求分配不摁嗯立即得到允許時(shí),就調(diào)用死鎖檢測(cè)算法。
?????????? (2)死鎖發(fā)生了,影響的進(jìn)程數(shù)量有多少
???????? 當(dāng)檢測(cè)到死鎖確實(shí)存在時(shí),那么需要采用多種措施進(jìn)行死鎖恢復(fù)。一般來(lái)說(shuō),有兩種措施:1.通知操作員死鎖發(fā)生,而讓操作人員人工處理死鎖;2.讓系統(tǒng)從死鎖狀態(tài)中自動(dòng)恢復(fù)過(guò)來(lái)。打破死鎖的兩種是:1.簡(jiǎn)單地終止一個(gè)或多個(gè)進(jìn)程以打破循環(huán)等待;2.從一個(gè)或多個(gè)死鎖進(jìn)程那里搶占一個(gè)或多個(gè)資源。
??????? 進(jìn)程終止方法:1.一次只終止一個(gè)進(jìn)程直到取消死鎖循環(huán)為止。每次終止一個(gè)進(jìn)程,都必須調(diào)用死鎖檢測(cè)算法以確定進(jìn)程是否仍處于死鎖;每次終止地進(jìn)程需要一定地策略來(lái)確定終止代價(jià)最小地進(jìn)程。
???????????????????????????????? 2.終止所有進(jìn)程。終止了死鎖循環(huán),但其進(jìn)程地計(jì)算結(jié)果必須放棄,代價(jià)較大。???????
???????? 使用搶占來(lái)處理死鎖,需要三個(gè)問(wèn)題需要處理:
???????? 1.如何選擇一個(gè)犧牲品;
???????? 2.回滾:對(duì)于被搶占資源的資源,需要對(duì)該進(jìn)程做什么安排;
???????? 3.饑餓:如何保證資源不會(huì)總是從同一個(gè)進(jìn)程中被搶占。??
???????? 進(jìn)程死鎖可以說(shuō)一個(gè)資源分配的問(wèn)題,如何解決其實(shí)可以認(rèn)為是一個(gè)哲學(xué)問(wèn)題。需要將上面的方法組合起來(lái),以及針對(duì)系統(tǒng)的特征,才能最佳地處理系統(tǒng)地各種類型資源地分配問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的进程死锁的危害、导致原因和解决方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 进程和线程的关系与区别
- 下一篇: C语言中static详细分析