當前位置:編程學習大全網 - 源碼下載 - 銀行家算法

銀行家算法

簡介

銀行家算法是壹種最有代表性的避免死鎖的算法。在避免死鎖方法中允許進程動態地申請資源,但系銀行家算法統在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統進入不安全狀態,則分配,否則等待。為實現銀行家算法,系統必須設置若幹數據結構。 要解釋銀行家算法,必須先解釋操作系統安全狀態和不安全狀態。 安全序列是指壹個進程序列{P1,…,Pn}是安全的,如果對於每壹個進程Pi(1≤i≤n),它以後尚需要的資源量不超過系統當前剩余資源量與所有進程Pj (j < i )當前占有資源量之和。

安全狀態

如果存在壹個由系統中所有進程構成的安全序列P1,…,Pn,則系統處於安全狀態。安全狀態壹定是沒有死鎖發生。

不安全狀態

不存在壹個安全序列。不安全狀態不壹定導致死鎖。

[編輯本段]銀行家算法的數據結構

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〕

[編輯本段]銀行家算法原理:

我們可以把操作系統看作是銀行家,操作系統管理的資源相當於銀行家管理的資金,進程向操作系統請求分配資源相當於用戶向銀行家貸款。 為保證資金的安全,銀行家規定: (1) 當壹個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客; (2) 顧客可以分歧貸款,但貸款的總數不能超過最大需求量; (3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裏得到貸款; (4) 當顧客得到所需的全部資金後,壹定能在有限的時間裏歸還所有的資金. 操作系統按照銀行家制定的規則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執行中繼續申請資源時,先測試該進程已占用的資源數與本次申請的資源數之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統現存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。 運行平臺:Windows XP VS2005 編程語言:C#

[編輯本段]算法的實現

初始化

由用戶輸入數據,分別對可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。

銀行家算法

在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統性能。在該方法中把系統的狀態分為安全狀態和不安全狀態,只要能使系統始終都處於安全狀態,便可以避免發生死鎖。 銀行家算法的基本思想是分配資源之前,判斷系統是否是安全的;若是,才分配。它是最具有代表性的避免死鎖的算法。 設進程cusneed提出請求REQUEST [i],則銀行家算法按如下規則進行判斷。 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],則轉(2);否則,出錯。 (2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][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+=ALLOCATION; Finish=true; GOTO 2 (4)如所有的進程Finish= true,則表示安全;否則系統不安全。

[編輯本段]算法

/// 資源數 public static int resourceNumber; /// 進程數 public static int processNumber; /// 可用資源數組 public static int[] Available; /// 工作向量 public static int[] work; /// 它表示系統是否有足夠的資源分配給進程 public static bool[] Finish; /// 最大需求矩陣 public static int[][] Max; /// 分配矩陣 public static int[][] Allocation; /// 需求矩陣 public static int[][] Need; /// 安全序列 public static int[] SafeSequence; /// 資源請求向量 public static int[] Request; 算法思想: 主要是:遞歸+深度優先搜尋+回溯 算法源代碼如下: /// 深搜+回溯實現銀行家算法 /// <param name="n">已完成的進程數</param> public void DFS_searchSafeSequence(int n) { if (n == processNumber) { //找到壹個安全序列,可以顯示所有安全序列 //顯示在richTextBoxshow.Text上 for (int i = 0; i < processNumber; i++) { richTextBoxshow.Text += SafeSequence[i] + " "; } richTextBoxshow.Text += "\n"; return; } for (int i = 0; i < processNumber; i++) { if (Finish[i] == false)//進程尚未完成 { //判斷現有資源是否可以滿足這個進程 bool isOK = true; for (int j = 0; j < resourceNumber; j++) { if (Need[i][j] > work[j]) { isOK = false; break; } } //可以滿足 if (isOK) { //先試探的將資源分配給這個進程 for (int j = 0; j < resourceNumber; j++) { work[j] += Allocation[i][j]; } //已經完成 Finish[i] = true; //加入安全序列 SafeSequence[n] = i; //繼續搜索 DFS_searchSafeSequence(n+1); //回溯 Finish[i] = false; SafeSequence[n] = -1; for (int j = 0; j < resourceNumber; j++) { work[j] -= Allocation[i][j];

  • 上一篇:水果追溯碼系統
  • 下一篇:廣發操盤手整理的選股公式在哪裏?
  • copyright 2024編程學習大全網