c语言实现银行家算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
# define m 50
int no1; //进程数
int no2; //资源数
int r;
int allocation[m][m],need[m][m],available[m],max[m][m];
char name1[m],name2[m]; //定义全局变量
void main()
{
void check();
void print();
int i,j,p=0,q=0;
char c;
int request[m],allocation1[m][m],need1[m][m],available1[m];
printf("**********************************************\n");
printf("* 银行家算法的设计与实现 *\n");
printf("**********************************************\n");
printf("请输入进程总数:\n");
scanf("%d",&no1);
printf("请输入资源种类数: \n");
scanf("%d",&no2);
printf("请输入Max矩阵:\n");
for(i=0;i for(j=0;j scanf("%d",&max[i][j]); //输入已知进程最大资源需求量 printf("请输入Allocation矩阵:\n"); for(i=0;i for(j=0;j scanf("%d",&allocation[i][j]); //输入已知的进程已分配的资源数 for(i=0;i for(j=0;j need[i][j]=max[i][j]-allocation[i][j]; //根据输入的两个数组计 算出need矩阵的值 printf("请输入Available矩阵\n"); for(i=0;i scanf("%d",&available[i]); //输入已知的可用资源数 print(); //输出已知条件 check(); //检测T0时刻已知条件的安全状态 if(r==1) //如果安全则执行以下代码 { do{ q=0; p=0; printf("\n请输入请求资源的进程号(0~4):\n"); for(j=0;j<=10;j++) { scanf("%d",&i); if(i>=no1) { printf("输入错误,请重新输入:\n"); continue; } else break; } printf("\n请输入该进程所请求的资源数 request[j]:\n"); for(j=0;j scanf("%d",&request[j]); for(j=0;j if(request[j]>need[i][j]) p=1; //判断请求是否超过该进程所需要的资源数 if(p) printf(" 请求资源超过该进程资源需求量,请求失败!\n"); else { for(j=0;j if(request[j]>available[j]) q=1; //判断请求是否超过可用资源数 if(q) printf("没有做够的资源分配,请求失败!\n"); else //请求满足条件 { for(j=0;j { available1[j]=available[j]; allocation1[i][j]=allocation[i][j]; need1[i][j]=need[i][j]; //保存原已分配的资源数,仍需要的资源数和可用的资源数available[j]=available[j]-request[j]; allocation[i][j]+=request[j]; need[i][j]=need[i][j]-request[j]; //系统尝试把资源分配给请求的进程 } print(); check(); //检测分配后的安全性 if(r==0) //如果分配后系统不安全 { for(j=0;j { available[j]=available1[j]; allocation[i][j]=allocation1[i][j]; need[i][j]=need1[i][j]; //还原已分配的资源数,仍需要的资源数和可用的资源数} printf("返回分配前资源数\n"); print(); } } }printf("\n你还要继续分配吗?Y or N ?\n"); //判断是否继续进行资源分配c=getche(); }while(c=='y'||c=='Y'); } } void check() //安全算法函数 { int k,f,v=0,i,j; int work[m],a[m]; bool finish[m]; r=1; for(i=0;i finish[i]=false; // 初始化进程均没得到足够资源数并完成 for(i=0;i work[i]=available[i];//work[i]表示可提供进程继续运行的各类资源数 k=no1; do{ for(i=0;i { if(finish[i]==false) { f=1; for(j=0;j if(need[i][j]>work[j]) f=0; if(f==1) //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程{ finish[i]=true; a[v++]=i; //记录安全序列号 for(j=0;j work[j]+=allocation[i][j]; //释放该进程已分配的资源 }