1. 程式人生 > 其它 >作業系統--死鎖(三)

作業系統--死鎖(三)

  1. 必要條件
    1. 互斥
    2. 佔有和等待
    3. 不可搶佔
    4. 環路等待
  2. 處理方法
    1. 鴕鳥策略
    2. 死鎖檢測和死鎖恢復
      1. 每種型別一個資源的死鎖檢測
      2. 每種型別多個資源的死鎖檢測
      3. 死鎖恢復
    3. 死鎖預防
      1. 破壞互斥條件
      2. 破壞佔有和等待條件
      3. 破壞不可搶佔條件
      4. 破壞環路等待條件
    4. 死鎖避免
      1. 安全狀態
      2. 單個資源的銀行家演算法
      3. 多個資源的銀行家演算法

必要條件

  • 互斥:每個資源同時只能被一個程序佔有
  • 佔有和等待:已經得到了某個資源的程序可以再請求新的資源
  • 不可搶佔:已經分配給一個程序的資源不能強制性地被搶佔,它只能被佔有它地程序顯式地釋放
  • 環路等待:有兩個或者兩個以上的程序組成一條環路,該環路中的每一個程序都在等待下一個程序所佔有的資源

處理方法:

鴕鳥策略

  假裝根本沒發生問題

  因為解決死鎖問題的代價很高,因此這種不採取任務措施的方案會獲得更高的效能

  當發生死鎖時不會對使用者造成多大影響,或者發生死鎖的概率很低,可以採用鴕鳥策略

  大多是作業系統,包括Unix,Linux和windows,處理死鎖問題的辦法就是忽略它。

死鎖檢測和死鎖恢復

  不試圖阻止死鎖,而是當檢測到死鎖發生時,採取措施進行恢復。

1.每種型別一個資源的死鎖檢測

  上圖為資源分配圖,其中方框表示資源,圓圈表示程序。資源指向程序表示該資源已經分配給該程序,程序指向資源表示程序請求獲取該資源。

  圖a可以抽取出環,如圖b,它滿足了環路等待條件,因此會發生死鎖。

  每種型別一個資源的死鎖檢測演算法是通過檢測有向圖是否存在環來實現,從一個節點出發進行深度優先搜尋,對訪問過的節點進行標記,如果訪問了已經標記的節點,就表示有向圖存在環,也就是檢測到死鎖發生。

2.每種型別多個資源的死鎖檢測

再上圖中,有三個程序四個資源,每個資料都代表的含義如下:

  • E向量:資源總量
  • A向量:資源剩餘量
  • C矩陣:每個程序所擁有的資源數量,每一行都代表一個程序擁有資源的數量
  • R矩陣:每個程序請求的資源數量

程序P1和P2所請求的資源都得不到滿足,只有程序P3可以,讓P3執行,之後釋放P3擁有的資源,此時A = (2 2 2 0)。P2可以執行,執行後釋放P2擁有的資源,A = (4 2 2 1)。P1也可以執行。所有程序都可以順利執行,沒有死鎖。

演算法總結如下:

每個程序最開始時都不被標記,執行過程有可能被標記。當演算法結束時,任何沒有被標記的程序都是死鎖程序。

  1. 尋找一個沒有標記的程序Pi,它所請求的資源小於等於A。
  2. 如果找到了這樣一個程序,那麼將C矩陣的第i行向量加到A中,標記該程序,並轉回1
  3. 如果沒有這樣一個程序,演算法終止。

3.死鎖恢復

  • 利用搶佔恢復
  • 利用回滾恢復
  • 通過殺死程序恢復

死鎖預防

在程式執行之前預防發生死鎖。

1.破壞互斥條件

  例如假離線印表機技術允許若干個程序同時輸出,唯一真正請求物理印表機的程序是印表機守護程序。

2.破壞佔有和等待條件

  一種實現方式是規定所有程序在開始執行前請求所需要的全部資源

3.破壞不可搶佔條件

4.破壞環路等待

  給資源同一編號,程序只能按編號順序來請求資源。

死鎖避免

在程式執行時避免發生死鎖。

1.安全狀態

Has表示已擁有的資源數,Max表示總共需要的資源數,Free表示還有可以使用的資源數。從圖a開始出發,先讓B擁有所需的所有資源(圖b),執行結束後釋放B,接著以同樣的方式執行C和A,使得所有程序都能成功執行,因此可以說圖a所示的狀態是安全的。

定義:如果沒有死鎖發生,並且即使所有程序突然請求對資源的最大需求,也仍然存在某種排程次序能夠使得每一個程序執行完畢,則稱該狀態是安全的。

安全狀態的檢測和死鎖的檢測類似,因為安全狀態必須要求不能發生死鎖。下面的銀行家演算法與死鎖檢測演算法非常類似,可以做參考對比。

2.單個資源的銀行家演算法

一個小城的銀行家,他向一群客戶分別承諾了一定的貸款額度,演算法要做的是判斷對請求的滿足是否會進入不安全狀態,如果是,就拒絕請求,否則予以分配。

上圖c為不安全狀態,因此演算法會拒絕之前的請求,從而避免進入圖c中的狀態。

3.多個資源的銀行家演算法

上圖有五個程序,四種資源。左邊的圖表示已經分配的資源。最右邊的E、P以及A表示:總資源,已分配資源以及可用資源,由向量表示,如A = (1020),表示四個資源分別還剩下1/0/2/0。

檢查一個狀態是否安全的演算法如下:

  • 查詢右邊的矩陣是否存在一行小於等於向量A。如果不能存在這樣的行,那麼系統將發生死鎖,狀態事不安全的。
  • 假若找到這樣一行,將該程序標記為終止,並將其分配資源加到A中。
  • 重複以上兩步,直到所有程序都標記為終止,則狀態是安全的

如果一個狀態是不安全的,需要拒絕進入這個狀態。