小言_互联网的博客

操作系统:银行家算法(C语言代码)详解

462人阅读  评论(0)

银行家算法流程图:

银行家算法自然语言描述:设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

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

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

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

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

实例:

假定系统中有五个进程{P0, P1, P2, P3, P4}和三类资源{A, B, C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况下图所示。输入M资源总数量、Max矩阵和Allocation矩阵显示初始状态表(1)判断T0时刻是否安全?存在一个安全序列<P1,P3,P0,P2,P4>

输入M资源总数量、Max矩阵和Allocation矩阵

显示初始状态表

1.判断T0时刻是否安全?

存在一个安全序列<P1,P3,P0,P2,P4>

2. P1请求资源:P1发出请求向量Request1(1,0,2),调用银行家算法检查是否能够分配?

输入

存在一个安全序列<P1,P3,P4,P2,P0>,显示新的状态表。

3.P4请求资源:P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:

输入

① Request4(3, 3, 0)≤Need4(4, 3, 1);

② Request4(3, 3, 0) >Available(2, 3, 0),让P4堵塞等待。状态表没有变化

4.P0请求资源:P0发出请求向量Requst0(0,2,0),系统按银行家算法进行检查:

输入

① Request0(0, 2, 0)≤Need0(7, 4, 3);

② Request0(0, 2, 0)≤Available(2, 3, 0);系统暂时先假定可为P0分配资源,并修改有关数据,如下图所示。

可用资源Available(2,1,0)不能满足任何进程的需求,进入不安全状态。此时系统不分配资源给P0。

输出:找不到安全序列,状态表没有变化

5.若P0发出请求向量Requst0(0,1,0),系统是否将资源分配给它?

输入

存在一个安全序列<P0,P1,P2,P3,P4>,显示新的状态表

程序代码:


  
  1. #include <malloc.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. #define M 3
  6. #define N 5
  7. int Resource[M];
  8. int Max[N][M];
  9. int Allocation[N][M];
  10. int Need[N][M];
  11. int Available[M];
  12. int Work[M];
  13. int Finish[N];
  14. int List[N]; //存放安全序列的下标序列
  15. void initial()
  16. //创建初始状态:先输入 Resource、Max和 Allocation,再计算出 Need、Available。
  17. {
  18. int i,j;
  19. printf( "Resource--输入M种资源的总数量:\n");
  20. for(i= 0;i<M;i++)
  21. {
  22. scanf( "%d",&Resource[i]);
  23. Available[i]=Resource[i];
  24. }
  25. printf( "Max--输入N个进程分别对M种资源的最大需求量:\n");
  26. for(j= 0;j<N;j++)
  27. for(i= 0;i<M;i++)
  28. scanf( "%d",&Max[j][i]);
  29. printf( "Allocation--输入N个进程获得M种资源的数量:\n");
  30. for(j= 0;j<N;j++)
  31. for(i= 0;i<M;i++)
  32. scanf( "%d",&Allocation[j][i]);
  33. /****************************************/
  34. for(j= 0;j<N;j++)
  35. for(i= 0;i<M;i++)
  36. Need[j][i]=Max[j][i]-Allocation[j][i];
  37. for(j= 0;j<M;j++)
  38. for(i= 0;i<N;i++)
  39. Available[j]=Available[j]-Allocation[i][j];
  40. }
  41. void printState()
  42. //输出当前的状态表|Process |Max |Allocation |Need |Available |
  43. {
  44. int i;
  45. printf( "状态表:\n|Process |Max |Allocation |Need |Available | \n");
  46. for(i= 0;i<N;i++)
  47. {
  48. if(i== 0)
  49. printf( "|P%-11d|%4d%4d%4d|%4d%4d%4d|%4d%4d%4d|%4d%4d%4d|\n",i,Max[i][ 0],Max[i][ 1],Max[i][ 2],Allocation[i][ 0],Allocation[i][ 1],Allocation[i][ 2],Need[i][ 0],Need[i][ 1],Need[i][ 2],Available[ 0],Available[ 1],Available[ 2]);
  50. else
  51. printf( "|P%-11d|%4d%4d%4d|%4d%4d%4d|%4d%4d%4d| |\n",i,Max[i][ 0],Max[i][ 1],Max[i][ 2],Allocation[i][ 0],Allocation[i][ 1],Allocation[i][ 2],Need[i][ 0],Need[i][ 1],Need[i][ 2]);
  52. }
  53. }
  54. int isfinish()
  55. //返回同时满足两个条件{①Finish[i]=false; ②Need[i][j]≤Work[j]}的进程下标 i(修改Finish[i]=true),否则返回-1。
  56. {
  57. int i,j,count;
  58. for(i= 0;i<N;i++)
  59. {
  60. for(j= 0,count= 0;j<M;j++)
  61. if(Finish[i]== 0&&Need[i][j]<=Work[j])
  62. {
  63. count++;
  64. }
  65. if(count== 3)
  66. {
  67. for(j= 0;j<M;j++)
  68. Work[j]+=Allocation[i][j];
  69. Finish[i]= 1;
  70. return i;
  71. }
  72. }
  73. return -1;
  74. }
  75. int issafe()
  76. //判定当前状态是否为安全状态 (返回 true 或 false),把安全序列的下标放入 List[N]数组。
  77. {
  78. int i,a,count= 0;
  79. for(i= 0;i<M;i++)
  80. Work[i]=Available[i];
  81. for(i= 0;i<N;i++)
  82. Finish[i]= 0;
  83. for(i= 0;i<N;i++)
  84. {
  85. a=isfinish();
  86. if(a!= -1)
  87. {
  88. List[i]=a;
  89. count++;
  90. }
  91. }
  92. if(count== 5)
  93. return 1;
  94. else
  95. return 0;
  96. }
  97. void printList( )
  98. //输出安全序列表|Process |Work |Need |Allocation |Work+Alloc |Finish |
  99. {
  100. int i,j;
  101. printf( "\n安全序列表如下:\n|Process |Work |Need |Allocation |Work+Alloc |Finish |\n");
  102. for(j= 0;j<M;j++)
  103. {
  104. Work[j]=Available[j];
  105. }
  106. for(i= 0;i<N;i++)
  107. {
  108. printf( "|P%-11d|%4d%4d%4d|%4d%4d%4d|%4d%4d%4d|%4d%4d%4d|true\n",List[i],Work[ 0],Work[ 1],Work[ 2],Need[List[i]][ 0],Need[List[i]][ 1],Need[List[i]][ 2],Allocation[List[i]][ 0],Allocation[List[i]][ 1],Allocation[List[i]][ 2],Work[ 0]+Allocation[List[i]][ 0],Work[ 1]+Allocation[List[i]][ 1],Work[ 2]+Allocation[List[i]][ 2]);
  109. for(j= 0;j<M;j++)
  110. Work[j]+=Allocation[List[i]][j];
  111. }
  112. }
  113. void reqresource(int i, int Request[M])
  114. //表示第 i个进程请求 M类资源 request[M]
  115. {
  116. int flag,count1,count2;
  117. int j;
  118. //Step1: 判断条件 Request[j]≤Need[i][j]
  119. for(j= 0,count1= 0;j<M;j++)
  120. if(Request[j]<=Need[i][j])
  121. count1++;
  122. //Step2: 判断条件 Request[j]≤Available[j]
  123. for(j= 0,count2= 0;j<M;j++)
  124. if(Request[j]<=Available[j])
  125. count2++;
  126. if(count2!= 3)
  127. printf( "\n尚无足够的资源,第%d个进程堵塞。\n",i);
  128. //Step3: 预先分配
  129. if(count2== 3&&count1== 3)
  130. {
  131. for(j= 0;j<M;j++)
  132. {
  133. Available[j]=Available[j]-Request[j];
  134. Allocation[i][j]=Allocation[i][j]+Request[j];
  135. Need[i][j]=Need[i][j]-Request[j];
  136. }
  137. if(issafe()== 0)
  138. {
  139. printf( "\n不存在安全序列,不是安全状态。\n");
  140. for(j= 0;j<M;j++)
  141. {
  142. Available[j]=Available[j]+Request[j];
  143. Allocation[i][j]=Allocation[i][j]-Request[j];
  144. Need[i][j]=Need[i][j]+Request[j];
  145. }
  146. }
  147. else
  148. {
  149. printf( "\n是安全序列分配成功!\n");
  150. printList();
  151. }
  152. }
  153. //Step4:检测是否为安全状态
  154. //填补程序
  155. }
  156. void main()
  157. {
  158. int reqid= -1,j,req[M];
  159. initial();
  160. printState();
  161. if(issafe()== 0)
  162. {
  163. printf( "Initial state is unsafe!\n");
  164. }
  165. else
  166. {
  167. printf( "\nInitial state is safe!\n");
  168. printList();
  169. printf( "Input the id of request process:");
  170. scanf( "%d",&reqid);
  171. while(reqid>= 0 && reqid<N) //输入进程 id是否合法
  172. {
  173. printf( "Input request resources:");
  174. for(j= 0;j<M;j++)
  175. {
  176. scanf( "%d",&req[j]);
  177. }
  178. reqresource(reqid, req);
  179. printState();
  180. printf( "Input the id of request process:");
  181. scanf( "%d",&reqid);
  182. }
  183. }
  184. }

 

 


转载:https://blog.csdn.net/master_hunter/article/details/115496923
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场