死鎖產生的原因以及解決方法


一.什么是死鎖?

   死鎖是由於兩個或以上的線程互相持有對方需要的資源,導致這些線程處於等待狀態,無法執行。

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

   1.互斥性:線程對資源的占有是排他性的,一個資源只能被一個線程占有,直到釋放。

   2.請求和保持條件:一個線程對請求被占有資源發生阻塞時,對已經獲得的資源不釋放。

   3.不剝奪:一個線程在釋放資源之前,其他的線程無法剝奪占用。

   4.循環等待:發生死鎖時,線程進入死循環,永久阻塞。

三.產生死鎖的原因

   1.競爭不可搶占性資源

    p1已經打開F1,想去打開F2,p2已經打開F2,想去打開F1,但是F1和F2都是不可搶占的,這是發生死鎖。

   2.競爭可消耗資源引起死鎖

    進程間通信,如果順序不當,會產生死鎖,比如p1發消息m1給p2,p1接收p3的消息m3,p2接收p1的m1,發m2給p3,p3,以此類推,如果進程之間是先發信息的那么可以完成通信,但是如果是先接收信息就會產生死鎖。

   3.進程推進順序不當

    進程在運行過程中,請求和釋放資源的順序不當,也同樣會導致產生進程死鎖。

四.避免死鎖的方法

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

    想辦法,讓進程不要那么貪心,自己已經有了資源就不要去競爭那些不可搶占的資源。比如,讓進程在申請資源時,一次性申請所有需要用到的資源,不要一次一次來申請,當申請的資源有一些沒空,那就讓線程等待。不過這個方法比較浪費資源,進程可能經常處於飢餓狀態。還有一種方法是,要求進程在申請資源前,要釋放自己擁有的資源。

   2.破壞“不可搶占”條件

    允許進程進行搶占,方法一:如果去搶資源,被拒絕,就釋放自己的資源。方法二:操作系統允許搶,只要你優先級大,可以搶到。

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

    將系統中的所有資源統一編號,進程可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(升序)提出

五.死鎖的檢測

  1.每個進程、每個資源制定唯一編號

  2.設定一張資源分配表,記錄各進程與占用資源之間的關系

  3.設置一張進程等待表,記錄各進程與要申請資源之間的關系  

                                                              資源分配表

資源 進程
r1 p2
r2 p5
r3 p4
r4 p1

 

 

                 進程等待表

資源 進程
p1 r1
p2 r3
p4 r4

 

    p1-r1-p2-r3-p4-r4-p1 出現環路引起死鎖

六.死鎖的解除

  1.搶占資源,從一個或多個進程中搶占足夠數量的資源,分配給死鎖進程,以解除死鎖狀態。

  2.終止(或撤銷)進程,終止(或撤銷)系統中的一個或多個死鎖進程,直至打破循環環路,使系統從死鎖狀態解脫出來.


免責聲明!

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



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