操作系統面試—死鎖(二)——銀行家算法

本文是對操作系統概念(第七版)第七章——死鎖的學習總結,不足之處歡迎批評指正。

上文中我們提到了資源分配圖算法,只適合每種資源只有一個實例的情況。當每種資源不止一個實例時,資源分配圖算法將不再適合,因此需要用到我們這一章要講的銀行家算法。

銀行家算法的命名是它可以用了銀行系統,當不能滿足所有客戶的需求時,銀行絕不會分配其資金。

當新進程進入系統時,它必須說明其可能需要的每種類型資源實例的最大數量這一數量不可以超過系統資源的總和。當用戶申請一組資源時,系統必須確定這些資源的分配是否處於安全狀態,如何安全,則分配,如果不安全,那麼進程必須等待指導某個其他進程釋放足夠資源爲止。


爲了實現銀行家算法,需要定義一下幾個數據結構,n表示系統進程的個數,m表示資源類型的種類:

available——長度爲m的向量,代表每種資源的現有實例的數量。

max——n*m矩陣,定義每個進程的最大需求量。

allocation——n*M矩陣,定義每個進程現在已經分配的各類資源的實例數量。

need——n*m矩陣,定義每個進程還需要的剩餘的資源。

另外allocation-i代表分配進程pi的資源,need-i表示進程爲完成其任務可能仍然需要申請的額外的資源。


首先我們討論安全性算法

1、安全性算法

目的:確定計算機系統是否處於安全狀態的算法分爲一下幾個步驟:

(1)設work和finish爲長度爲m和n的向量,並且按一下進行初始化,work=available;且對於i=0,1,...n-1,finish[i]=false;這裏需要說明的是work代表剩餘可用的資源。finish[i]=false代表進程i不滿足要求。

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

a、finish[i]=false;

b、need[i]<=work;//注意這裏比較的是整行的資源,不是單獨的資源。

如果沒有這樣的i存在,則轉到(4)

(3)work=work+allocation-i;//現有可用的資源+進程pi釋放的資源

         finish[i]=true;

返回到第(2)步

(4)如果對所有的i,finish[i]=true;那麼系統處於安全狀態。

上述算法的複雜度爲m*n^2;

其實上述算法就是假設釋放一個進程,然後在找一個能在剩餘可用資源中完成請求的進程,重複操作。我們的目標是找一個安全序列,因此上述算法可能要嘗試多次。只要能找到一個安全序列,那麼系統就處於安全狀態。


2、資源請求算法

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

設request-i爲進程i的請求向量,因此該向量的長度爲m;當進程i做出請求時,採取如下動作:

(1)如果request-i<=need-i;那麼轉到第(2)步,否則產生出錯條件,這是因爲超出了最大請求。

(2)如果request<=available;那麼轉到第(3)步,否則產生出錯,這是因爲沒有可用資源。

(3)假定系統可以分配給進程pi所請求的資源,那麼按照如下形式修改狀態:

available=available-request-i;

allocation-i=allocation-i+request-i;

need-i=need-i  -   request-i;

判斷如果產生的資源分配狀態是安全的,那麼交易完成且進程pi可以分配到所請求的資源,如果不安全,那麼進程pi必須等待request-i並恢復到原來資源分配狀態。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章