深圳幻海软件技术有限公司 欢迎您!

银行家算法(C++实现)

2023-04-28

目录一、银行家算法概述二、银行家算法需要的数组结构三、算法概述1.安全性算法2.银行家算法四、代码实现五、实验结果验证一、银行家算法概述银行家算法(Banker'sAlgorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产

目录

一、银行家算法概述

二、银行家算法需要的数组结构

三、算法概述

1.安全性算法

2.银行家算法

四、代码实现

五、实验结果验证


一、银行家算法概述

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

二、银行家算法需要的数组结构

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.安全性算法

系统所执行的安全性算法可描述如下:

(1)设置两个向量:
        ① 工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available;② Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false; 当有足够资源分配给进程时, 再令Finish[i]=true。

(2)从进程集合中找到一个能满足下述条件的进程:
        ① Finish[i]=false;
        ② Need[i,j]≤Work[j]; 若找到, 执行步骤3);否则,执行步骤4)。

(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
        Work[j]=Work[i]+Allocation[i,j];
        Finish[i]=true;
        go to step 2;

(4)如果所有进程的Finish[i]=true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。

2.银行家算法

设Requesti是进程Pi的请求向量,如果表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

(1) 如果 ≤ Need[i,j],转向步骤(2),否则认为出错,因为它所需的资源数目已超过它所宣布的最大值。

(2) 若  ≤ Available[j],转向步骤(3),否则表示尚无足够资源,Pi必须等待。

(3) 系统尝试把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j] = Available[j] – 
Allocation[i,j] = Allocation[i,j] + 
Need[i,j] = Need[i,j] – 

(4) 系统执行安全性算法,检查此次分配后系统是否处于安全状态。若安全,才正式分配给Pi,完成此次分配;否则,此次试分配作废,恢复原来资源的分配状态,进程Pi等待。

四、代码实现

  1. #include<iostream>
  2. using namespace std;
  3. const int p=5;//进程数
  4. const int r=4;//资源种类
  5. int num = 1;//需要分配资源的进程序号
  6. void init_request(int request[r])
  7. {
  8. //初始化request矩阵
  9. cout<<"Input the number of request:"<<endl;
  10. cin>>num;
  11. num-=1;//下标减1
  12. cout<<"Input the request vector:"<<endl;
  13. for(int i=0;i<r;i++)
  14. cin>>request[i];
  15. }
  16. void init_matrix(int maximum[p][r],int allocation[p][r],int need[p][r],int available[r],int request[r])
  17. {
  18. //初始化函数
  19. cout<<"Input the Allocation matrix:"<<endl;
  20. for(int i=0;i<p;i++)
  21. for(int j=0;j<r;j++)
  22. cin>>allocation[i][j];
  23. cout<<"Input the Need matrix:"<<endl;
  24. for(int i=0;i<p;i++)
  25. for(int j=0;j<r;j++)
  26. cin>>need[i][j];
  27. //cout<<"Input the Max matrix:"<<endl;
  28. //Max矩阵可以由Need和Allocation矩阵推导得出
  29. //Max[i,j]= Need[i,j]+Allocation[i,j]
  30. for(int i=0;i<p;i++)
  31. for(int j=0;j<r;j++)
  32. maximum[i][j]=need[i][j]+allocation[i][j];
  33. cout<<"Input the available vector:"<<endl;
  34. for(int i=0;i<r;i++)
  35. cin>>available[i];
  36. }
  37. void output_func(int allocation[p][r],int need[p][r],int available[r])
  38. {
  39. //输出函数
  40. cout<<endl<<" "<<"Allocation"<<" Need"<<" Available"<<endl;
  41. for(int i=0;i<p;i++)
  42. {
  43. cout<<"P"<<i+1<<" :";
  44. for(int j=0;j<r;j++)
  45. {
  46. cout<<allocation[i][j]<<' ';
  47. }
  48. cout<<" ";
  49. for(int j=0;j<r;j++)
  50. cout<<need[i][j]<<' ';
  51. if(i==0)
  52. {
  53. cout<<" ";
  54. for(int k=0;k<r;k++)
  55. cout<<available[k]<<' ';
  56. }
  57. cout<<endl;
  58. }
  59. cout<<endl;
  60. }
  61. bool compare(int need[],int work[])
  62. {
  63. bool flg = 1;
  64. for(int i=0;i<r;i++)
  65. {
  66. //检查是否有大于的情况存在
  67. if(need[i]>work[i])
  68. {
  69. flg=0;
  70. break;
  71. }
  72. }
  73. return flg;
  74. }
  75. int check_security(int allocation[p][r],int need[p][r],int available[r])
  76. {
  77. //安全性检查函数
  78. int finish[p] = {0};//初始化finish向量
  79. int work[r]; //拷贝available
  80. int lis[p];//用来记录安全时的队列
  81. int cnt=0;
  82. for(int i=0;i<r;i++)
  83. work[i] = available[i];//初始化work向量
  84. //序列分配
  85. //循环p次
  86. for(int m=0;m<p;m++)
  87. {
  88. for(int i=0;i<p;i++)
  89. {
  90. //如果当前进程执行完成,跳过
  91. if(finish[i] == 1)
  92. continue;
  93. //找到finish[i] = false
  94. else{
  95. //如果Need[i,j]<=Work[j]
  96. if(compare(need[i],work))
  97. {
  98. for(int j=0;j<r;j++)
  99. work[j]+=allocation[i][j];
  100. finish[i] = 1;
  101. lis[cnt++] = i+1;//将该状态放入安全状态队列中
  102. break;
  103. }
  104. }
  105. }
  106. }
  107. int flag=1;
  108. for(int i=0;i<r;i++)
  109. {
  110. if(finish[i]==0)
  111. {
  112. flag = 0;
  113. break; //如果存在F的进程,表明系统处于不安全状态
  114. }
  115. else
  116. continue;
  117. }
  118. if(flag)
  119. {
  120. cout<<"系统处于安全状态!"<<endl;
  121. cout<<"安全序列为:";
  122. for(int i=0;i<p;i++)
  123. cout<<lis[i]<<' ';
  124. cout<<endl;
  125. }
  126. else cout<<"系统处于不安全状态!"<<endl;
  127. return flag;
  128. }
  129. void banker(int allocation[p][r],int need[p][r],int available[r],int request[r],int n)
  130. {
  131. if(!compare(request,need[n]))
  132. {
  133. //如果存在Requesti[j]>Need[i][j],认为出错
  134. cout<<"出错!所需资源已超过所宣布的最大值!"<<endl;
  135. return ;
  136. }
  137. else{
  138. //银行家算法(1)没有出错
  139. if(!compare(request,available))
  140. {
  141. //如果存在Requesti[j]>Available[j],认为出错
  142. cout<<"尚无足够资源,必须等待!"<<endl;
  143. return ;
  144. }
  145. else{
  146. for(int j=0;j<r;j++)
  147. {
  148. available[j]-=request[j];
  149. allocation[n][j]+=request[j];
  150. need[n][j]-=request[j];
  151. }
  152. if(check_security(allocation,need,available))
  153. {
  154. cout<<"安全!将资源正式分配"<<endl;
  155. }
  156. else
  157. {
  158. cout<<"不安全!资源分配作废!恢复以前状态"<<endl;
  159. for(int j=0;j<r;j++)
  160. {
  161. need[n][j]+=request[j];
  162. allocation[n][j]-=request[j];
  163. available[j]+=request[j];
  164. }
  165. }
  166. }
  167. }
  168. output_func(allocation,need,available);
  169. }
  170. int main()
  171. {
  172. int maximum[p][r],allocation[p][r],need[p][r];
  173. int available[r],request[r];
  174. init_matrix(maximum,allocation,need,available,request);
  175. cout<<endl<<"检查T0时刻系统是否处于安全状态..."<<endl;
  176. check_security(allocation,need,available);
  177. int flag = 1;
  178. while(flag)
  179. {
  180. cout<<endl<<"对请求资源进行银行家算法检查..."<<endl;
  181. init_request(request);//初始化request矩阵
  182. banker(allocation,need,available,request,num);
  183. cout<<"是否继续输入?(输入0退出):";
  184. cin>>flag;
  185. }
  186. return 0;
  187. }
  188. /*测试数据
  189. 0 0 3 2
  190. 1 0 0 0
  191. 1 3 5 4
  192. 0 3 3 2
  193. 0 0 1 4
  194. 0 0 1 2
  195. 1 7 5 0
  196. 2 3 5 6
  197. 0 6 5 2
  198. 1 6 5 6
  199. 1 6 2 2
  200. */

五、实验结果验证

1.能安全分配的情况


 

 

2.分配不安全情况(注意一定要恢复原来的状态)

 3.需要的资源超过自己需要的最大值

 4.尚无足够资源,需等待分配

 

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览45247 人正在系统学习中