C语言实现银行家算法源代码
- 格式:docx
- 大小:37.20 KB
- 文档页数:3
C语言实现银行家算法源代码
#include"stdio.h"
#definemaxprocess50/*最大进程数*/#definemaxresource100/*最大资源数*/#definetrue1#definefalse0
intavailable[maxresource];/*需用资源数组*/intmax[maxprocess][maxresource];/*最小市场需求矩阵*/intallocation[maxprocess][maxresource];/*分配矩阵*/intneed[maxprocess][maxresource];/*市场需求矩阵*/intrequest[maxprocess][maxresource];/*进程须要资源数*/
intfinish[maxprocess];/*系统是否有足够的资源分配*/intp[maxprocess];/*记录序列*/intm,n;/*m个进程,n个资源*/voidinit();intsafe();voidbank();voidmain(){init();safe();bank();
}/*最小资源数*/
voidinit()/*初始化算法*/{inti,j;
printf("恳请输出进程的数目:\\n");scanf("%d",&m);
printf("请输入资源的种类:\\n");scanf("%d",&n);
printf("恳请输出每个进程最多所须要的各资源数,按照%dx%d矩阵输出\\n",m,n);for(i=0;i scanf("%d",&max[i][j]); printf("恳请输出每个进程已分配的各资源数,也按照%dx%d矩阵输出\\n",m,n);for(i=0;i for(j=0;j scanf("%d",&allocation[i][j]); need[i][j]=max[i][j]-allocation[i][j];if(need[i][j]<0){ printf("您输出的第%d个进程所具有的第%d个资源数错误,恳请再次输出:\\n",i+1,j+1);j--;continue;}}} printf("请输入各个资源现有的数目:\\n");for(i=0;i scanf("%d",&available[i]);}} intsafe()/*安全性算法,返回值:true,false*/{ inti,j,k,l=0; intwork[maxresource];/*工作数组*/for(i=0;i finish[i]=false;} for(i=0;i if(finish[i]==true){continue;}else{ for(j=0;j if(need[i][j]>work[j]){break;}}if(j==n){ finish[i]=true;for(k=0;k { work[k]+=allocation[i][k];}p[l++]=i;i=-1;}else{continue;}}if(l==m){ //cout<<"系统就是安全的"< //cout<<"安全序列:"< //cout< printf("%d",p[i]);if(i!=l-1){ printf("-->");}} returntrue;}} printf("系统就是不安全的\\n");returnfalse;} voidbank()/*银行家算法*/{ inti,cusneed;charagain;while(1){ printf("请输入要申请资源的进程号(注:第1个进程号为0,依次类推)\\n");scanf("%d",&cusneed); printf("恳请输出进程所命令的各资源的数量\\n");for(i=0;i scanf("%d",&request[cusneed][i]);} for(i=0;i if(request[cusneed][i]>need[cusneed][i]){ printf("您输出的命令数少于进程的需求量!恳请再次输出!\\n");continue;} if(request[cusneed][i]>available[i]){ printf("您输出的命令数少于系统有的资源数!恳请再次输出!\\n");continue;}} for(i=0;i available[i]-=request[cusneed][i]; allocation[cusneed][i]+=request[cusneed][i];need[cusneed][i]-=request[cusneed][i];}if(safe()){ printf("同意分配命令!\\n");}else{ printf("您的请求被拒绝!\\n");for(i=0;i available[i]+=request[cusneed][i]; allocation[cusneed][i]-=request[cusneed][i];need[cusneed][i]+=request[cusneed][i];}} for(i=0;i finish[i]=false;} printf("您还想要再次命令分配吗?就是恳请按y/y,否请按其它键\\n");scanf("%c",&again); if(again=='y'||again=='y'){continue;}break;}}