本程序模拟的是《计算机操作系统》(汤子赢等)课本P97"银行家算法之例"编写的
第一部分:银行家算法(扫描)
1.如果Request 2.如果Request 3.系统试探分配请求的资源给进程
4.系统执行安全性算法
第二部分:安全性算法
1.设置两个向量
(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False
2.若Finish[i]=False&&Need 3.进程P获得第i类资源,则顺利执行直至完成!并释放资源:
Work=Work+Allocation;
Finish[i]=true;
转2
4. 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!
程序说明:
一、开发语言:C语言
二、本程序模拟的是课本P97"银行家算法之例"编写的。
即系统中有五个进程{0,1,2,3,4}和三类资源{A,B,C},各进程的初始资源分配情况及各资源的总数量均 参照该例子。
三、本程序中共四个函数分别为:zhibiao(),apply(),test(),及主函数main()
其中:
1、zhibiao()的功能为:直观的列出系统某时刻的资源分配情况。
2、apply()的功能为:进程发出资源请求后,系统试探着把资源分配给该进程并修改数据结构中的数值。
3、test()的功能为:系统的安全性检测。
四、需要注意的问题:
1、本程序的前提是假设当前只有一个进程请求资源。
2、一旦操作不符合要求会得到意想不到的结果!再按任意键可能该程序也不能正常运行,则就关闭该程序, 然后再打开重新运行便可.
五、课本上的例子在这个程序中运行后成功。
例如:P1:Request1(1,0,2)
p4: Request4(3,3,0)
P0:Request0(0,2,0)
再测试P0:Request0(0,1,0) 同课本上的结果相同。
本程序还有很多不足,功能不很完善,只是适合于当前只有一个进程请求资源,且进程和资源都是事先固定好的.
源代码:
#include "dos.h"
#include "conio.h"
#include "alloc.h"
int available[3]={3,3,2};
int max[6][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int allocation[6][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int need[6][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int live[5]={1,1,1,1,1};
int stay[3][3];
int request[3],process[5];
int i,j,p=5,pro,x,k1;
void zhibiao()
{ x=1;
printf(" Max All Nee Ava\n");
printf("PRO A B C A B C A B C A B C\n");
for(i=0;i { if(live[i]==1)
{ printf("P%d ",i);
for(j=0;j {printf("%-3d",max[i][j]);}printf(" ");
for(j=0;j {printf("%-3d",allocation[i][j]);}printf(" ");
for(j=0;j {printf("%-3d",need[i][j]);}printf(" ");
}
if(x==1&&live[i]==1) {printf("%-3d%-3d%-3d",available[0],available[1],available[2]);x=0;}
if(live[i]==1) printf("\n");
}
}
int apply()
{ int v=1;
for(i=0;i {if(need[pro][i] if(available[i] if(v==1){for(i=0;i {stay[0][i]=allocation[pro][i];allocation[pro][i]+=request[i];
stay[1][i]=need[pro][i];need[pro][i]-=request[i];
stay[2][i]=available[i];available[i]-=request[i];}
}
return(v);
}
int test()
{ int work[3],finish[5]={0,0,0,0,0},v,k=0,t=0;
for(i=0;i if(live[i]==0) {finish[i]=1;k1--;}
for(i=0;i while(1)
{ for(i=0;i { if(finish[i]==0) { v=1;
for(j=0;j if(need[i][j]>work[j]) {v=0;break;}
if(v==1) { finish[i]=1;
for(j=0;j process[k]=i;k++;
}
}
}
if(t==k) break;
else t=k;
if(k==k1) break;
}
if(k==k1) return(1);
else return(0);
}
main()
{
while(1)
{zhibiao();
k1=5;
printf("该系统中共五个进程{0,1,2,3,4},请输入其中一个进程:P");
scanf("%d",&pro);
if(pro4) break;
printf("P%d请求的三类资源数(资源数用逗号隔开)分别是:",pro);
scanf("%d,%d,%d",&request[0],&request[1],&request[2]);
if(apply()==0) {printf("出错或尚无足够资源,P%d必须等待!\n",pro);
printf("请按任意键继续。");}
else if(test()==0) {printf("系统处于不安全状态,P%d必须等待!\n",pro);
for(i=0;i { allocation[pro][i]=stay[0][i];
need[pro][i]=stay[1][i];
available[i]=stay[2][i];}
printf("请按任意键继续。");}
else {zhibiao();printf("系统处于安全状态!\n");
printf("存在一安全序列为:");
for(i=0;i printf("P%d>",process[i]);
printf("P%d",process[k1-1]);
printf("\n请按任意键继续。");}
if(need[pro][0]==0&&need[pro][1]==0&&need[pro][2]==0)
for(i=0;i {available[i]+=max[pro][i];
live[pro]=0;}
getch();
clrscr();
delay(5000);
}
}