[OS] 死鎖相關知識點以及銀行家算法詳解


因此我們先來介紹一下死鎖:

死鎖特征

  當出現死鎖時,進程永遠不能完成,並且系統資源被阻礙使用,阻止了其他作業開始執行。在討論處理死鎖問題的各種方法之前,先深入討論一下死鎖的特征。

·必要條件

(1)互斥:至少有一個資源必須處於非共享模式,即一次只有一個進程使用。如果另一進程申請該資源,那么申請進程必須等到該資源被釋放為止。

(2)占有並等待:一個進程必須占有至少一個資源,並等待另一資源,而該資源為其他進程所占有。

(3)非搶占:資源不能被搶占,即資源只能在進程完成任務后自動釋放。

(4)循環等待:有一組等待進程{P0,P1,···,Pn},P0等待的資源為P1所占有,P1等待的資源為P2所占有,...,Pn-1等待的資源為Pn所占有,Pn等待的資源為P0所占有。

  注:強調所有4個條件必須同時滿足才會出現死鎖。循環等待意味着占有並等待,這樣四個條件並不完全獨立。但是,在下面的討論中我們會看到分開考慮這些條件是有意義的。

·資源分配圖

  死鎖問題可用系統資源分配圖的有向圖進行更為精確的描述。這種圖由一個結點集合V和一個邊集合E組成。

  由進程Pi到資源類型Rj的有向邊記為Pi->Rj,稱為申請邊,它表示進程Pi已經申請了資源類型Rj的一個實例,並在等待該資源。由資源類型Rj到進程Pi的有向邊記為Rj->Pi,稱為分配邊,它表示資源類型Rj的一個實例已經分配給進程Pi。

  在圖上,用圓形表示進程Pi,用矩形表示資源類型Rj。由於資源類型Rj可能有多個實例,所以在矩形中用圓點表示實例。注意申請邊只指向矩形Rj,而分配邊必須指定矩形內的某個圓點。

  根據分配圖的定義,可以證明:如果分配圖沒有環,那么系統就沒有進程死鎖,如果分配圖有環,那么可能存在死鎖。

      

   存在死鎖的資源分配圖   存在環但沒有死鎖的資源分配圖

由上圖可知,資源分配圖有環不一定會產生死鎖。

死鎖處理方法

·可使用協議以預防或避免死鎖,確保系統不會進入死鎖狀態。

·可允許系統進入死鎖狀態,然后檢測它,並加以恢復。

·可忽視這個問題,認為死鎖不可能在系統內發生。

死鎖預防

我們已經知道,出現死鎖要滿足4個必要條件,只要確保一個必要條件不成立,就能預防死鎖發生。下面通過討論這4個必要條件來研究死鎖預防方法。

互斥:共享資源不是必須的,而非共享資源必須保持互斥
占有並等待:必須保證進程申請資源的時候沒有占有其他資源
  ·要求進程在執行前一次申請全部的資源,只有沒有占有資源時才可以分配資源
  ·利用率低,可能出現飢餓
非搶占:如果一個進程的申請沒有實現,它要釋放所有占有的資源
循環等待:將所有的資源類型放入資源列表中,並且要求進程按照資源表中遞增的順序申請資源

死鎖避免

  上面我們討論的死鎖預防算法中,通過限制資源申請的方法來預防思索。這種限制確保4個必要條件之一不會發生,因此死鎖不成立。然而,通過這種方法預防死鎖的副作用是低設備使用率和系統吞吐率。

·安全狀態

  系統安全指存在一個執行序列,所有進程都能完成,這個序列被稱為安全序列。下面來舉一個例子:

系統有三個進程P1、P2和P3,共有12台打印機。
進程P1總共要求10台打印機,P2和P3分別要求4台和9台
假定T0時刻,進程P1、P2和P3已分別獲得5台、2台和2台,尚有3台空閑未分,如下表:

可以看出,存在一個安全序列P2、P1、P3,所以說T0時刻是系統安全的。

  安全狀態不是死鎖狀態。相反,死鎖狀態是不安全狀態。然而,不是所有不安全狀態都能導致死鎖狀態。不安全狀態可能導致死鎖。系統可以從安全狀態轉換為不安全狀態。

  有了安全狀態的概念,可定義避免算法以確保系統不會死鎖。其思想是簡單地確保系統始終處於安全狀態。開始,系統處於安全狀態。當進程申請一個可用的資源時,系統必須確定這一資源申請是可以立即分配還是等待。只有分配后使系統仍處於安全狀態,才允許申請。

  采用這種方案,如果進程申請一個現已可用的資源,那么它可能必須等待。因此,與沒有采用死鎖避免算法相比,這種情況下資源使用率可能更低。

·資源分配圖算法(適用於每種資源類型只有一個實例)

  該算法是在資源分配圖的基礎上,引入一新類型的邊,稱為需求邊。需求邊Pi->Rj表示進程Pi可能在將來某個時候申請資源Rj。這種邊類似於同一方向的申請邊,但用虛線表示。當申請資源時,需求邊變為申請邊;釋放資源時,申請邊變為需求邊。

  假設進程Pi申請資源Rj。只有在將申請邊Pi->Rj變為分配邊Rj->Pi而不會導致資源分配圖形成環時,才允許申請。

 

·銀行家算法(適用於每種資源類型有多個實例

為了實現銀行家算法,必須要有幾個數據結構:

注:設n為系統進程的個數,m為在資源類型的種類。

Available長度為m的向量。表示每種資源的現有實例的數量。如果Available[j]=k,那么資源Rj有k個實例有效。

Maxn * m矩陣。定義每種進程的最大需求。如果Max[i][j]=k,那么進程Pi可以最多請求資源Rj的k個實例。

Allocationn * m矩陣。定義每個進程現在所分配的各種資源類型的實例數量。如果Allocation[I,j]=k,那么進程Pj當前分配了k個資源Rj的實例。

Needn * m矩陣。表示每個進程還需要的剩余的資源。如果Need[i][j]=k,那么進程Pj還需要資源Rj的k個實例。
注:Need[i][j] = Max[i][j] – Allocation [i][j]

為了描述方便,我們采用一些簡化的表示方法:

  設X和Y為長度為n的向量,則X <= Y當且僅當對所有i = 1,2,...,n,X[i] <= Y[i]。例如,如果X = (1,7,2,3)而Y = (0,3,2,1),那么Y <= X。如果Y <= X且Y != X,那么Y < X。

  可以將AllocationNeed的每行作為向量,並分別用Allocation i和Need i來表示,向量Allocation i表示分配給進程Pi的資源;向量Need i表示進程為完成其任務可能仍然需要申請的額外資源。

銀行家算法可整體分成兩個部分:

1.安全性算法

確認計算機系統是否處於安全狀態的算法分為如下幾步:

(1)設WorkFinish分別為長度為mn的向量。按如下方式進行初始化,Work = Avaliable且對於i = 0,1,...,n - 1,Finish[i] =    false

(2)查找這樣的i使其滿足

  ·Finish[i] = false

  ·Need i <= Work

  如果沒有這樣的i,那么就轉到第(4)步。

(3)Work = Work + Allocation i

   Finish[i] = true

   返回第(2)步

(4)如果對所有i,Finish[i] = true,那么系統則處於安全狀態。

該算法可能需要m * n^2數量級的操作以確定系統是否處於安全狀態。

2.資源請求算法

現在,描述如何判斷是否可安全允許請求的算法。

  設Request i為進程Pi的請求向量。如果Request i[j] == k,那么進程Pi需要資源類型Rj的實例數量為k。當進程Pi作出資源請求時,采取如下動作:

(1)如果Request i <= Need i,那么轉到第(2)步。否則,產生出錯條件,這是因為進程Pi已超過了其最大請求。

(2)如果Request i <= Available,那么轉到第(3)步。否則,Pi必須等待,這是因為沒有可用資源。

(3)假定系統可以分配給進程Pi所請求的資源,並按如下方式修改狀態:

   AvailableAvailableRequest i;

   Allocation i = Allocation i + Request i;

   Need i = Need i - Request i;

  如果所產生的資源分配狀態是安全的(通過上面的安全性算法),那么Pi可分配到它所請求的資源。但是,如果新狀態不安全,則進程Pi必須等待Request i並恢復到原來的資源分配狀態。

 

上面都是一些表達式,可能有些枯燥,現在我們來練習一道例題:

  考慮這樣一個系統,有5個進程P0~P4,3種資源類型A、B、C。資源類型A有10個實例,資源類型B有5個實例,資源類型C有7個實例。假定在時刻T0,系統狀態如下:

		Allocation		Max		Avaliable
		 A  B  C      A  B  C    A  B  C
P0		 0  1  0      7  5  3    3  3  2
P1       2  0  0      3  2  2   
P2       3  0  2      9  0  2
P3       2  1  1      2  2  2
P4       0  0  2      4  3  3

  矩陣Need的內容定義成Max-Allocation

 	   	  Need
		 A  B  C
P0		 7  4  3
P1       1  2  2
P2       6  0  0
P3       0  1  1
P4       4  3  1

  可認為系統現在處於安全狀態,因為存在一個安全序列<P1,P3,P4,P2,P0>。

  現在假定進程P1再請求1個A類資源和兩個C類資源,這樣Request1 = (1,0,2)。為了確定這個請求是否可以立即允許,首先檢測Request1 <= Available(即,(1,0,2) <= (3,3,2)),其值為真。接着假定這個請求被滿足,會產生如下新狀態:

		Allocation	   Need		Avaliable
		 A  B  C      A  B  C    A  B  C
P0		 0  1  0      7  4  3    2  3  0
P1       3  0  2      0  2  0   
P2       3  0  2      6  0  0
P3       2  1  1      0  1  1
P4       0  0  2      4  3  1

  必須確定這個狀態是否安全。為此,執行安全算法,並找到順序<P1,P3,P4,P0,P2>滿足安全要求。因此,可以立即允許進程P1的這個請求。

  然而,可以發現當系統處於這一狀態時,是不能允許P4的請求(3,3,0)的,因為沒有那么多資源可用。也不能允許P0的請求(0,2,0);雖然有資源可用,但是這會導致系統處於不安全狀態。

 


免責聲明!

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



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