银行家算法代码
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。
银行家算法程序代码如下:
#include
#include
#include
#define FALSE0
#define TRUE1
#define W10
#define R10
int M;//总进程数
int N;//资源种类
int ALL_RESOURCE[W];//各种资源的数目总和
int MAX[W][R];//M个进程对N类资源最大资源需求量
int AVAILABLE[R];//系统可用资源数
int ALLOCATION[W][R];//M个进程已经得到N类资源的资源量
int NEED[W][R];//M个进程还需要N类资源的资源量
int Request[R];//请求资源个数
void output()
{
int i,j;
cout< cout<<“各种资源的总数量:”< for(j=0;j cout<<“资源”< cout< cout<<“━━━━━━━━━━━━━━━━━━”< cout<<“目前各种资源可利用的数量为:”< for(j=0;j cout<<“资源”< cout< cout<<“━━━━━━━━━━━━━━━━━━”< cout<<“各进程还需要的资源数量:”< for(i=0;i cout<<“资源”< cout< for(i=0;i { cout<<“进程”< for(j=0;j cout< cout< } cout< cout<<“━━━━━━━━━━━━━━━━━━”< cout<<“各进程已经得到的资源量:”< for(i=0;i cout<<“资源”< cout< for(i=0;i { cout<<“进程”< for(j=0;j cout< cout< } cout< } void distribute(int k) { int j; for(j=0;j { AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j]; } } void restore(int k) { int j; for(j=0;j { AVAILABLE[j]=AVAILABLE[j]+Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j]; } } int check() { int WORK[R],FINISH[W]; int i,j; for(j=0;j for(i=0;i for(i=0;i { for(j=0;j { if(FINISH[i]==FALSE&&NEED[i][j]<=WORK[j]) { WORK[j]=WORK[i]+ALLOCATION[i][j]; } } FINISH[i]=TRUE; } for(i=0;i { if(FINISH[i]==FALSE) { cout< cout<<“系统不安全!!!本次资源申请不成功!!!”< cout< return1; } else { cout< cout<<“经安全性检查,系统安全,本次分配成功。”< cout< return0; } } } void bank()//银行家算法 { int i=0,j=0; char flag=‘Y’; while(flag==‘Y’||flag==‘y’) { i=-1; while(i<0||i>=M) { cout<<“━━━━━━━━━━━━━━━━━━”< cout< cin>>i; if(i<0||i>=M)cout<<“输入的进程号不存在,重新输入!”< } cout<<“请输入进程”< for(j=0;j { cout<<“资源”< cin>>Request[j]; if(Request[j]>NEED[i][j])//若请求的资源数大于进程还需要i类资源的资源量j { cout< cout<<“若继续执行系统将处于不安全状态!”< flag=‘N’; break; } else { if(Request[j]>AVAILABLE[j])//若请求的资源数大于可用资源数 { cout< cout<<“若继续执行系统将处于不安全状态!”< flag=‘N’; break; } } } if(flag==‘Y’||flag==‘y’) { distribute(i);//调用change(i)函数,改变资源数 if(check()//若系统安全 { restore(i);//调用restore(i)函数,恢复资源数 output();//输出资源分配情况 } else//若系统不安全 output();//输出资源分配情况 } else//若flag=N||flag=n cout< cout<<“是否继续银行家算法演示,按‘Y’或‘y’键继续,按‘N’或‘n’键退出演示:”; cin>>flag; } } void version() { cout< cout<<“\t银行家算法”< } void main()//主函数 { int i=0,j=0,p; version(); getchar(); cout< cin>>M; cout< cout<<“请输入总资源种类:”; cin>>N; cout< cout<<“请输入各类资源总数:(需要输入数为”< for(i=0;i cin>>ALL_RESOURCE[i]; cout< cout<<“输入各进程所需要的各类资源的最大数量:(需要输入数为”< for(i=0;i { for(j=0;j { do { cin>>MAX[i][j]; if(MAX[i][j]>ALL_RESOURCE[j]) cout< } while(MAX[i][j]>ALL_RESOURCE[j]); } } cout< cout<<“输入各进程已经占据的各类资源的数量:(需要输入数为”< *N<<“个)”; for(i=0;i { for(j=0;j { do { cin>>ALLOCATION[i][j]; if(ALLOCATION[i][j]>MAX[i][j]) cout< } while(ALLOCATION[i][j]>MAX[i][j]); } } for(j=0;j { p=ALL_RESOURCE[j]; for(i=0;i { p=p-ALLOCATION[i][j];//减去已经被占据的资源 AVAILABLE[j]=p; if(AVAILABLE[j]<0) AVAILABLE[j]=0; } } for(i=0;i for(j=0;j NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; output(); bank(); }