📄 banker.c
字号:
#include<stdio.h>int *Sc(int i,int m[]){ switch(i){ case 1:scanf("%d",&m[0]);break; case 2:scanf("%d %d",&m[0],&m[1]);break; case 3:scanf("%d %d %d",&m[0],&m[1],&m[2]);break; case 4:scanf("%d %d %d %d",&m[0],&m[1],&m[2],&m[3]);break; case 5:scanf("%d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4]);break; case 6:scanf("%d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5]);break; case 7:scanf("%d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6]);break; case 8:scanf("%d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7]);break; case 9:scanf("%d %d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7],&m[8]);break; case 10:scanf("%d %d %d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7],&m[8],&m[9]);break; default:{printf("wrong!input again:");} } return m;}/*void Pr(int i,int *p){ switch(i){ case 1:printf("%d\n",*p);break; case 2:printf("%d %d\n",*p,*(p+1));break; case 3:printf("%d %d %d\n",*p,*(p+1),*(p+2));break; case 4:printf("%d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3));break; case 5:printf("%d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4));break; case 6:printf("%d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5));break; case 7:printf("%d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6));break; case 8:printf("%d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7));break; case 9:printf("%d %d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7),*(p+8));break; case 10:printf("%d %d %d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7),*(p+8),*(p+9));break; }}*/void Pr(int i,int *p){ int t; for(t=0;t<i;t++){printf("%d ",*(p+t));}}int test(int *array,int num){//全1则1,一0则0 int i,j=1; for(i=0;i<num;i++) { if(*(array+i)==0) j=0; } if(j==0)return 0; else return 1;}int main(){ int rsn; //resource number 资源种类数 int prn; //process number 进程数 int i[100]; //作为所有for循环的计数器 int c; //作为选择的结果 int p; //作为发出请求的进程id int cate; //作为判断test函数的返回值 printf("请输入资源的种类数和进程的个数,用空格隔开:"); scanf("%d %d",&rsn,&prn); int available[rsn]; //表示每类资源可利用的数目 int max[prn][rsn]; //表示每个进程中对每类资源的最大需求数量 int allocation[prn][rsn]; //表示类资源当前已分配给每一进程的资源数 int need[prn][rsn]; //表示每个进程尚需的各类资源数 int request[rsn]; //表示请求向量所请求的每类资源的数量 int work[rsn]; //工作向量,表示系统可提供给进程继续运行的各类资源数目 int finish[prn],*fi; //表示系统是否有足够的资源分配给进程 int available_s[rsn],allocation_s[prn][rsn],need_s[prn][rsn];//备份数组 int counter; //安全状态检查时用来记录更改进程的个数的计数器 int *av,*ma[prn],*all[prn],*nee[prn],*re,*wo;//作为各数组的指针//给available数组赋值 printf("请依次输入%d种资源的可利用资源数目,用空格隔开:",rsn); av=Sc(rsn,available); input://给max数组赋值 for(i[1]=0;i[1]<prn;i[1]++){ printf("请依次输入第%d个进程对每类资源(共%d类)的最大需求数,用空格隔开:",i[1]+1,rsn); ma[i[1]]=Sc(rsn,max[i[1]]); }//给allocation数组赋值 for(i[2]=0;i[2]<prn;i[2]++) { printf("请依次输入第%d个进程已占有的每类资源(共%d类)的个数,用空格隔开:",i[2]+1,rsn); all[i[2]]=Sc(rsn,allocation[i[2]]); } //给need数组赋值 for(i[3]=0;i[3]<prn;i[3]++) { for(i[4]=0;i[4]<rsn;i[4]++) { if(max[i[3]][i[4]]-allocation[i[3]][i[4]]>=0) { need[i[3]][i[4]]=max[i[3]][i[4]]-allocation[i[3]][i[4]]; } else {printf("you inout a wrong number,please input again.\n");goto input;} } nee[i[3]]=&need[i[3]][0]; }//打印输出的结果 for(i[4]=0;i[4]<prn;i[4]++) { printf("进程P%d的信息如下:\n",i[4]+1); printf("对%d类资源的最大需求分别是:",rsn); Pr(rsn,max[i[4]]); printf("已占有的%d类资源数目分别是:",rsn); Pr(rsn,all[i[4]]); printf("尚需的%d类资源的数目分别是:",rsn); Pr(rsn,nee[i[4]]); printf("\n"); } printf("目前每种资源的可利用数目为:"); Pr(rsn,av); printf("\n");//请求部分开始: for(;;) {again2: printf("请选择:1、输入请求向量并计算是否分配资源;2、显示各进程状态;3、退出。请选择:"); scanf("%d",&c); switch(c) { case 1:{ printf("请输入发出请求的进程:");scanf("%d",&p); printf("请输入请求的资源数组:");again1: re=Sc(rsn,request); for(i[10]=0;i[10]<rsn;i[10]++)/*依次测试资源是否超过最大数和是否有足够的资源*/ { if(request[i[10]]>need[p-1][i[10]])//所需资源是否超过宣布的最大数 { printf("所需的资源超过最大数目,请重新输入:\n"); goto again1; } if(request[i[10]]>available[i[10]])//是否有足够资源 { printf("没有足够的资源进程P%d需等待!\n",p); goto again2; } }//备份available、allocation和need for(i[19]=0;i[19]<prn;i[19]++) { available_s[i[19]]=available[i[19]]; for(i[20]=0;i[20]<rsn;i[20]++) { allocation_s[i[19]][i[20]]=allocation[i[19]][i[20]]; need_s[i[19]][i[20]]=need[i[19]][i[20]]; } }//试探分配 printf("系统将进行试探分配:"); for(i[11]=0;i[11]<rsn;i[11]++) { available[i[11]]=available[i[11]]-request[i[11]]; allocation[p-1][i[11]]=allocation[p-1][i[11]]+request[i[11]]; need[p-1][i[11]]=need[p-1][i[11]]-request[i[11]]; }//用安全性算法检查 step1: fi=finish; for(i[13]=0;i[13]<prn;i[13]++){finish[i[13]]=0;} for(i[12]=0;i[12]<rsn;i[12]++){work[i[12]]=available[i[12]];} wo=work;step2: i[31]=0;step: if(finish[i[31]]==0) { for(i[32]=0;i[32]<rsn;i[32]++) { if(need[p-1][i[32]]>work[i[32]])goto step4; } for(i[33]=0;i[33]<rsn;i[33]++) { work[i[33]]=work[i[33]]+allocation[i[31]][i[33]]; } finish[i[31]]=1; counter=1; i[31]++; goto step; } if(counter==1){counter=0;goto step2;}step4: if(test(fi,prn)==1) { for(i[34]=0;i[34]<rsn;i[34]++) { if(need[p-1][i[34]!=0])goto print; } for(i[23]=0;i[23]<rsn;i[23]++) { available[i[23]]=available[i[23]]+max[p-1][i[23]]; available_s[i[23]]=available[i[23]]; }print: printf("系统安全,执行此次分配!\n"); for(i[35]=0;i[35]<rsn;i[35]++) { available_s[i[35]]=available[i[35]]; for(i[22]=0;i[22]<rsn;i[22]++) { allocation_s[i[21]][i[22]]=allocation[i[21]][i[22]]; need_s[i[21]][i[22]]=need[i[21]][i[22]]; } } } else { printf("系统不安全,请求被驳回!\n"); for(i[21]=0;i[21]<prn;i[21]++) { available[i[21]]=available_s[i[21]]; for(i[22]=0;i[22]<rsn;i[22]++) { allocation[i[21]][i[22]]=allocation_s[i[21]][i[22]]; need[i[21]][i[22]]=need_s[i[21]][i[22]]; } } } for(i[4]=0;i[4]<prn;i[4]++) { printf("进程P%d的信息如下:\n",i[4]+1); for(i[37]=0;i[37]<rsn;i[37]++) { if(need[i[4]][i[37]]==0){printf("进程P%d已经完成!",i[4]+1);goto here;} } printf("对%d类资源的最大需求分别是:",rsn); Pr(rsn,max[i[4]]); printf("已占有的%d类资源数目分别是:",rsn); Pr(rsn,all[i[4]]); printf("尚需的%d类资源的数目分别是:",rsn); Pr(rsn,nee[i[4]]);here: printf("\n"); } printf("目前每种资源的可利用数目为:"); Pr(rsn,av); printf("\n"); break; } case 2: { for(i[4]=0;i[4]<prn;i[4]++) { printf("进程P%d的信息如下:\n",i[4]+1); printf("对%d类资源的最大需求分别是:",rsn); Pr(rsn,max[i[4]]); printf("已占有的%d类资源数目分别是:",rsn); Pr(rsn,all[i[4]]); printf("尚需的%d类资源的数目分别是:",rsn); Pr(rsn,nee[i[4]]); printf("\n"); } printf("目前每种资源的可利用数目为:"); Pr(rsn,av);break; } case 3:goto end; } }end: printf("再见\n"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -