死鎖產生的的四個必要條件


死鎖產生的的四個必要條件

1.互斥條件

某一種資源一次只允許一個進程占有,也就是當資源被分配后,其他進程就無法訪問該資源,直到當前占有資源的進程訪問結束。

2.請求與保持條件

一個進程因請求某一資源而進入阻塞隊列而等待,沒有釋放本身進程就占有的資源。

3.不剝奪條件

進程占有資源之后,在對該資源沒有使用完之前,不能強行剝奪。

4.循環等待條件

多個進程之間形成一種頭尾相接循環等待資源關系。

破壞產生死鎖的條件

1.破壞“請求與保持條件”

方法一:所有進程運行開始之前,必須一次性申請其在整個運行期間所需要的資源。

優點:簡單、易操作、安全。

缺點:進程的資源申請變困難,會使進程無法啟動,資源利用率低,使進程出現飢餓現象。

方法二:允許程序只申請最開始需要的一些資源並開始啟動,在執行之后,及時釋放掉已經使用過的資源,再去請求新資源,這樣可以提高資源利用率。

2.破壞“不剝奪條件”

當一個進程已經占有一些資源,再去申請新的資源而沒有得到滿足,則必須要釋放掉所有自己已經占有的所有資源,這樣就相當於這些資源是被剝奪掉的,從而破壞了“不剝奪條件”。

缺點:實現起來復雜,代價較大,釋放掉所有資源可能使該進程無法正常進行下去,影響進程的周轉周期,降低吞吐量。

3.破壞“循環等待條件”

只申請資源編號比進程編號大的資源(是為按單調遞增或單調遞減的序號去申請資源),可以防止資源請求形成一個首尾相接的環。

需要注意的是,“互斥條件”的破壞只有在資源可以共享的情況下,而資源的訪問一般都是互斥的,所以在此省略。
破壞死鎖產生的四個必要條件就是預防死鎖。

避免死鎖

方法一:如果一個進程的請求會導致死鎖,那么就不啟動該進程。

方法二:如果一個進程請求增加的資源會導致死鎖,那么就拒接該資源請求。

銀行家算法:

避免死鎖的優點:不需要死鎖預防中的搶占和重新運行進程,並且比死鎖預防的限制要少。

死鎖避免的限制:

1)必須事先聲明每個進程請求的最大資源量

2)考慮的進程之間是必須無關的,也就是說,它們執行的順序必須沒有任何同步要求的限制

3)分配的資源數目必須是固定的

4)在占有資源時,進程不能退出

死鎖的檢測

資源分配圖形成一個環,那么會形成死鎖。需要注意的是資源分配的弧(邊)要進行簡化,即是否可以滿足。

遍歷每個節點,以每個結點為根節點去遍歷子節點,若訪問到相同的結點那么就是存在死鎖。

死鎖的解除

1)搶占:將某一資源從一個進程給另一個進程使用之后再給送回。

2)回滾:周期性對進程進行檢查點檢查,即將進程的狀態寫入一個文件以備以后重啟,包括存儲映象、資源狀態,即哪些資源分配給了哪些進程。新的檢查點不覆蓋原有的文件,而是寫到新文件中。檢測到死鎖時,從一個較早的檢查點開始,將該進程復位到更早的狀態。

3)殺死進程:殺死環中的一個或多個進程;殺死一個環外的進程以釋放該進程的資源。(最好殺死可以從頭開始重新運行且不會帶來副作用的進程)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM