printf(\请输入资源种类数:\
scanf(\
printf(\请输入最大需求矩阵:\\n\
for(i=0;i for(j=0;j for(i=0;i printf(\请输入可利用资源矩阵\\n\ for(i=0;i print(); //输出已知条件 check(); //检测T0时刻已知条件的安全状态 if(r==1) //如果安全则执行以下代码 { do{ q=0; p=0; printf(\请输入请求资源的进程号(0~4):\\n\ for(j=0;j<=10;j++) { scanf(\ if(i>=no1) { printf(\输入错误,请重新输入:\\n\ continue; } else break; } printf(\请输入该进程所请求的资源数request[j]:\\n\for(j=0;j scanf(\for(j=0;j 26 //判断请求是否超过该进程所需要的资源数 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 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(\你还要继续分配吗?Y or N ?\\n\ //判断是否继续进行资源分配 c=getche(); }while(c=='y'||c=='Y'); } 27 } void check() //安全算法函数 { int k,f,v=0,i,j; int work[m],a[m]; bool finish[m]; r=1; 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 } k--; //每完成一个进程分配,未完成的进程数就减1 }while(k>0); f=1; for(i=0;i if(finish[i]==false) { } f=0; break; 28 if(f==0) //若有进程没完成,则为不安全状态 { printf(\系统处在不安全状态!\ r=0; } else { printf(\系统当前为安全状态,安全序列为:\\n\ for(i=0;i } void print() //输出函数 { int i,j; printf(\ printf(\此时刻资源分配情况*********************\\n\ printf(\进程名/号 | 最大需求矩阵 | 当前分配矩阵 | 需求矩阵 for (i = 0; i < no1; i++) { printf(\ p%d/%d \ for (j = 0; j < no2; j++) {printf(\ \ for (j = 0; j < no2; j++) {printf(\ %d \ for (j = 0; j < no2; j++) {printf(\ \ printf(\ } printf(\ printf(\各类资源可利用的资源数为:\ for (j = 0; j < no2; j++) {printf(\ printf(\ } |\\n\ 29 程序运行结果及分析 30 31