1. 程式人生 > >作業系統(10)程序--死鎖概念;死鎖處理方法:死鎖預防、死鎖避免、銀行家演算法、死鎖檢測

作業系統(10)程序--死鎖概念;死鎖處理方法:死鎖預防、死鎖避免、銀行家演算法、死鎖檢測

文章目錄

1. 死鎖概念

死鎖是指:由於競爭資源或者通訊關係,兩個或更多執行緒在執行中出現,永遠相互等待只能由其他程序引發的事件。

  1. 死鎖示例
    ==1==
  2. 程序訪問資源的流程
    在系統裡,存在各種型別的資源R1,R2,…,Rm:比方說CPU執行時間、記憶體空間、I/O裝置等。
    ==2==
  3. 資源分類
    ==3==
  4. 資源分配有向圖
    描述資源和程序之間的分配和佔用關係
    ==4==
  5. 出現死鎖的必要條件
    下圖4個條件都成立則可能出現死鎖
    =5==

2. 死鎖處理方法

==6==

1. 死鎖預防

死鎖預防是指採用某種策略,限制併發程序對資源的請求,使系統在任何時刻都不滿足死鎖的必要條件。也就是說上節中的四個必要條件,有任何一個不滿足就可以。辦法有:

互斥:把互斥的共享資源封裝成可同時訪問
持有並等待:程序請求資源時,要求它不佔有任何其他資源,也就是它必須一次性申請到所有資源,這種方法會導致資源效率低。
非搶佔:如程序不能立即分配資源,則釋放已佔有的資源。也就是隻在能夠同時獲得所有需要資源時,才執行分配操作
迴圈等待:對資源進行排序,要求程序按順序請求資源

==7==


2. 死鎖避免

利用額外的先驗資訊,在分配資源時,判斷是否會出現死鎖,只在不會死鎖時分配資源。
==8==

  1. 系統資源分配的安全狀態
    ==9==
  2. 安全狀態與死鎖的關係
    ==10==

3. 銀行家演算法

  1. 背景
    銀行家演算法是實現死鎖避免的一種方法,它的背景如下圖
    ==11==

  2. 資料結構(需要維護的資訊)
    ==12==

  3. 安全狀態判斷演算法
    把現在可用的資源複製到work中,作為當前進行判斷的場所,在這個情況下,去判斷現有的這些資源是否能滿足當前所有程序的總的需求,能滿足,則說明是安全的。
    ==13==

  4. 演算法詳細步驟
    ==14==


  1. 演算法例項
    假設初始狀態如下圖:
    在這裡插入圖片描述


    示例1:在上圖的初始狀態,如果T2請求R1和R3各一個資源,這個操作會允許麼

    因為在上圖中,request[2][1](1)<Need[2][1](1), request[2][3](1)<Need[2][3](2),就可以轉到銀行家演算法的第2步,然後request[2][1]<work[1],request[2][3]<work[3]就進入銀行家演算法的第3步,然後進入下圖狀態
    ==15==

    在上圖,依據安全狀態判斷演算法第二步的尋找執行緒,Need[2][3]<=work[3],分配一個R3資源給T2,這樣T2就可以正常執行完,然後將它的資源回收,進入下圖

    ==16==

    在上圖中,會發現任何一個Need[i][j]<=work[j],假設將資源分配給T1,然後執行完T1,再回收資源,進入下圖

    ==17==

    然後按照安全判斷演算法執行下去就發現此時的系統狀態是安全的。

    所以T2請求R1和R3各一個資源這個操作會允許。

    示例2:在上圖的初始狀態,如果T1請求R1和R3各一個資源,這個操作會允許麼

    因為在上圖中,request[1][1](1)<Need[1][1](1), request[1][3](1)<Need[1][3](2),就可以轉到銀行家演算法的第2步,然後request[1][1]<work[1],request[1][3]<work[3]就進入銀行家演算法的第3步,然後進入下圖狀態

    ==19==

    依據安全判斷演算法,會發現四個執行緒的Need[i]>work,直接跳到第4步,判定系統不安全,也就是不允許這個操作


4. 死鎖檢測

  1. 死鎖檢測概念
    不同於前面的死鎖預防和死鎖避免,死鎖檢測允許系統進入死鎖狀態,它所做的工作如下圖
    ==20==
  2. 死鎖檢測演算法
    • 資料結構
      ==21==
    • 檢測詳細步驟
      ==22==

  1. 死鎖檢測演算法例項
    示例1:
    初始狀態如下
    ==23==

    由上圖可以看出T0、T2執行緒沒有資源請求了,那就先讓這兩個執行緒執行完(先執行T0),並回收資源,得下圖

    ==24==

    在上圖可以看到,當前可用資源是可以滿足其他執行緒繼續執行的,所以示例1沒有死鎖

    ==25==
    示例2
    初始狀態
    ==26==

    由上圖可以看出,T0沒有資源請求,先執行完T0並回收資源,但這時就會發現只有B資源有一個例項,而剩餘的4個執行緒或需要A資源、或需要C資源,無法正常執行,也就是死鎖了


  1. 死鎖恢復-程序終止選擇
    ==27==
  2. 死鎖恢復-程序終止方式
    ==28==