死鎖的原因,條件和解決辦法

死鎖概念和產(chǎn)生原因
死鎖是指多個進(jìn)程循環(huán)等待彼此占有的資源而無限期的僵持等待下去的局面。原因是:

系統(tǒng)提供的資源太少了,遠(yuǎn)不能滿足并發(fā)進(jìn)程對資源的需求
進(jìn)程推進(jìn)順序不合適,互相占有彼此需要的資源,同時請求對方占有的資源,往往是程序設(shè)計不合理
死鎖產(chǎn)生的必要條件
需要同時具有以下四個條件:

互斥條件:即某個資源在一段時間內(nèi)只能由一個進(jìn)程占有,不能同時被兩個或兩個以上的進(jìn)程占有
不可搶占條件:進(jìn)程所獲得的資源在未使用完畢之前,資源申請者不能強(qiáng)行的從資源占有者手中奪取資源,而只能由該資源的占有者進(jìn)程自行釋放
占有且等待條件:進(jìn)程至少已經(jīng)占有了一個資源,但又申請了一個新的被其他進(jìn)程所占有的資源,此時處于等待狀態(tài)
循環(huán)等待條件:若干個進(jìn)程形成環(huán)形鏈,每個都占用對方申請的下一個資源
死鎖的處理策略
為使系統(tǒng)不發(fā)生死鎖,必須設(shè)法破壞產(chǎn)生死鎖的四個必要條件之一,或者允許死鎖產(chǎn)生,但當(dāng)死鎖發(fā)生時能檢測出思索,并有能力實現(xiàn)恢復(fù)。
一般有死鎖的預(yù)防、死鎖避免、死鎖的檢測與恢復(fù)三種方法。
(1) 死鎖預(yù)防:破壞導(dǎo)致死鎖必要條件中的任意一個就可以預(yù)防死鎖。例如,要求用戶申請資源時一次性申請所需要的全部資源,這就破壞了保持和等待條件;將資源分層,得到上一層資源后,才能夠申請下一層資源,它破壞了環(huán)路等待條件。預(yù)防通常會降低系統(tǒng)的效率。

(2) 死鎖避免:避免是指進(jìn)程在每次申請資源時判斷這些操作是否安全,例如,使用銀行家算法。死鎖避免算法的執(zhí)行會增加系統(tǒng)的開銷。

(3) 死鎖檢測:死鎖預(yù)防和避免都是事前措施,而死鎖的檢測則是判斷系統(tǒng)是否處于死鎖狀態(tài),如果是,則執(zhí)行死鎖解除策略。

(4) 死鎖解除:這是與死鎖檢測結(jié)合使用的,它使用的方式就是剝奪。即將某進(jìn)程所擁有的資源強(qiáng)行收回,分配給其他的進(jìn)程。

死鎖預(yù)防:
打破互斥條件:允許進(jìn)程同時訪問資源(有些資源就是不可以同時訪問的,無實用價值)
打破不可搶占條件:比如給進(jìn)程設(shè)置優(yōu)先級,高優(yōu)先級的可以搶占資源(實現(xiàn)困難,降低系統(tǒng)性能)
打破占有且等待條件:實行資源預(yù)分配策略,即進(jìn)程在運行前一次性的向系統(tǒng)申請它所需要的全部資源(不可預(yù)測資源的使用,利用率低,降低并發(fā)性)
破壞循環(huán)等待條件:采用這種策略,即把資源事先分類編號,按號分配,使進(jìn)程在申請,占用資源時不會形成環(huán)路。所有進(jìn)程對資源的請求必須嚴(yán)格按資源序號遞增的順序提出(限制和編號實現(xiàn)困難,增加系統(tǒng)開銷,有些資源暫時不用也需要先申請,增加了進(jìn)程對資源的占用時間)
死鎖避免
允許進(jìn)程動態(tài)的申請資源,但系統(tǒng)在進(jìn)行資源分配前,應(yīng)先計算此次資源分配的安全性。若此次分配不會導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),則將資源你分配給進(jìn)程,否則,讓進(jìn)程等待。
所謂安全狀態(tài),是指系統(tǒng)能按某種進(jìn)程推進(jìn)順序,為每個進(jìn)程分配其所需的資源,直至滿足每個進(jìn)程對資源的最大需求,是每個進(jìn)程都可以順序的完成。此時成P1P2P3...為安全序列,如果系統(tǒng)無法找到一個安全序列,則稱系統(tǒng)處于不安全狀態(tài)。
并非所有的不安全狀態(tài)都是死鎖狀態(tài),但當(dāng)系統(tǒng)進(jìn)入不安全狀態(tài)后,便可能進(jìn)入死鎖狀態(tài);反之,只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可以避免進(jìn)入死鎖狀態(tài)。
銀行家算法是最著名的死鎖避免算法。

死鎖的檢測
資源分配圖&&死鎖定理

死鎖解除
1)資源剝奪法。掛起某些思索進(jìn)程,并搶占它的資源,將這些資源分配給其他的死鎖進(jìn)程。但應(yīng)防止被掛起的進(jìn)程長時間得不到資源時,而處于資源匱乏的狀態(tài)。
2)進(jìn)程撤銷法。強(qiáng)制撤銷一個或一部分進(jìn)程并剝奪這些進(jìn)程的資源。撤銷的原則可以按進(jìn)程的優(yōu)先級和撤銷進(jìn)程代價的高低進(jìn)行。
3)進(jìn)程回退法。讓一個或多個進(jìn)程回退到足以回避死鎖的地步,進(jìn)程回退時資源釋放資源而不是被剝奪。要求系統(tǒng)保持進(jìn)程的歷史信息,設(shè)置還原點。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容