死鎖

1.爲何會出現死鎖?
  由於併發的進程分別擁有一部分資源,而又想搶佔其餘進程的資源。(若是隻有一個進程,絕對不會出現死鎖)算法

  //資源包括:CPU,I/O通道,各種存儲,設備和數據,文件,數據庫,信號量(且要求資源不會忽然死掉)
 數據庫

2.死鎖模型 安全

   P表明進程 R表明資源,R裏面的點的個數表明資源的個數併發

 

       

               不會發生死鎖,由於P3使用完R3以後必定會釋放spa

 

       

            會出現死鎖。操作系統

      

        不會出現死鎖(雖然有環)blog

 

 3.死鎖的特徵(只是死鎖的必要條件)排序

  (1)互斥:資源同一時間只能被一個進程擁有,若是能夠同時擁有,也不會出現死鎖隊列

  (2)持有並等待:進程保持至少一個資源,而且在等待獲取其餘進程持有的額外資源進程

    (3)無搶佔:一個資源只能被進程完成任務後自動釋放

    (4)循環等待:就是幾個進程互相等待

 

4.死鎖的處理辦法

  (1)死鎖預防:只有打破死鎖的一個必要條件,就不會出現死鎖

    打破互斥:使資源能夠同時被進程佔用(不太好)

    打破持有並等待:不持有一部分資源。我要麼不拿,要麼就拿到所有的資源(這樣會使得系統的利用率很低,使某些進程飢餓,也很差)

    打破無搶佔:能夠搶佔(想搶佔的話只能kill一部分資源,太暴力)

    打破循環等待:對全部資源進行排序,並要求每一個進程按照資源的順序進行申請。(適用於資源比較有限的系統,好比嵌入式系統)

      好比說有進程A,B和資源1,2。而且這兩個進程都須要這兩個資源。

      只有先申請到了1才能去申請2,這樣就不會出現一個佔有1,一個佔有2的狀況。

  (2)死鎖避免:某進程申請資源時判斷是否會出現不安全狀態,若是會出現,就不將該資源分配給此進程

    不安全狀態包括死鎖狀態

    安全狀態的定義:針對全部進程,存在安全序列(因此須要尋找安全序列)

    序列<p1,p2...pn>是安全的:順序執行這些進程,若是每一個進程都能順利執行,該序列就是安全序列

      1)對於每一個pi,pi要求的資源可以由當前可用資源+全部的pj持有的資源來知足(j<i)

      2)pi完成以後,pi+1能夠獲得所需資源,執行完後返回資源

    

    

    好比這張圖,p1,p2都須要R1,R2 ,而且p1得到了R1

      (1)P1申請R2時,若將R2分配給P1

        序列<p1,p2>是安全的,序列<p2,p1>是不安全的

        存在安全序列,申請成功

      (2)P2申請R2時,若將R2分配給P2

        序列<p1,p2>和序列<p2,p1>都是不安全的,

        不存在安全序列,申請失敗

 

   (3)死鎖避免的經典算法--銀行家算法  假設A,B,C的資源總數分別爲 10,5,7

                表爲T0時刻的資源狀態圖

進程\資源情況

max

A     B    C  

Allocation(分配)

A    B    C

Avaliable(可利用)

A    B    C

P0 7    5    3 0    1    0 3    3    2
P1 3    2    2   2    0    0  
P2 9    0    2 3    0    2  
P3 2    2    2 2    1    1  
P4 4    3    3 0    0    2  

 

 

 

 

 

 

 

 

max表示的是各個進程在整個執行階段所須要的各種資源

Allocation表示的是當前時刻已經給各個進程分配的資源

max-Allocation 獲得的就是各個進程剩餘時間內還須要的進程矩陣

        減去        =      

     max            Allocation          Need

 

將Avaliable 與Need矩陣進行比較,發現p1和p3安全,也就是操做系統當前擁有的資源能夠供p1或p3進程完成他因此的操做

咱們選擇p1完成,p1加入安全隊列

Avaliable 更新爲  (3 3 2) + (2 0 0) = (5,3,2)

按照一樣的方法獲得安全序列<p1,p3,p4,p2,p0>  固然這裏的安全序列不止一個

 

  (4)死鎖檢測與恢復

    容許程序進入死鎖,若是檢測到了死鎖,就啓動恢復機制解除死鎖

    把資源分配圖簡化爲等待圖:

    

    等待圖若是有環,代表可能死鎖了

    死鎖解除的方法:

      (1)資源剝奪法:掛起某些死鎖進程,並搶佔它的資源,將該資源分配給其餘的死鎖進程。

        但應防止被掛起的進程長時間得不到資源

      (2)撤銷進程法:強制撤銷部分甚至所有死鎖進程並剝奪這些進程的資源。

        撤銷的原則按照進程優先級和撤銷代價的高低進行

      (3)進程回退法:讓一(多)個進程回退到足以迴避死鎖的地步,進程回退時自願釋放

        資源而不是被剝奪。要求系統保持進程的歷史信息,設置還原點

相關文章
相關標籤/搜索