天天看點

c/c++多線程模拟系統資源配置設定(并通過銀行家算法避免死鎖産生)

銀行家算法資料結構 

(1)可利用資源向量available 

是個含有m個元素的數組,其中的每一個元素代表一類可利用的資源數目。如果available[j]=k,則表示系統中現有rj類資源k個。 

(2)最大需求矩陣max 

這是一個n×m的矩陣,它定義了系統中n個程序中的每一個程序對m類資源的最大需求。如果max[i,j]=k,則表示程序i需要rj類資源的最大數目為k。 

(3)配置設定矩陣allocation 

這也是一個n×m的矩陣,它定義了系統中每一類資源目前已配置設定給每一程序的資源數。如果allocation[i,j]=k,則表示程序i目前已分得rj類資源的 數目為k。 

(4)需求矩陣need。 

這也是一個n×m的矩陣,用以表示每一個程序尚需的各類資源數。如果need[i,j]=k,則表示程序i還需要rj類資源k個,方能完成其任務。 

need[i,j]=max[i,j]-allocation[i,j]

銀行家算法 

在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統性能。在該方法中把系統的狀态分為安全狀态和不安全狀态,隻要能使系統始終都處于安全狀态,便可以避免發生死鎖。 

銀行家算法的基本思想是配置設定資源之前,判斷系統是否是安全的;若是,才配置設定。它是最具有代表性的避免死鎖的算法。 

設程序cusneed提出請求request [i],則銀行家算法按如下規則進行判斷。

 (1)如果request [cusneed] [i]<= need[cusneed][i],則轉(2);否則,出錯。

 (2)如果request [cusneed] [i]<= available[i],則轉(3);否則,等待。 

 (3)系統試探配置設定資源,修改相關資料: 

    available[i]-=request[cusneed][i]; 

allocation[cusneed][i]+=request[cusneed][i]; 

    need[cusneed][i]-=request[cusneed][i]; 

(4)系統執行安全性檢查,如安全,則配置設定成立;否則試探險性配置設定廢棄,系統恢複原狀,程序等待。 安全性檢查算法 

1)設定兩個工作向量work=available;finish 

  2)從程序集合中找到一個滿足下述條件的程序, finish==false; need<=work; 

如找到,執行(3);否則,執行(4) 

3)設程序獲得資源,可順利執行,直至完成,進而釋放資源。 work=work+allocation; finish=true; goto 2)

4)如所有的程序finish= true,則表示安全;否則系統不安全。

繼續閱讀