continue;
} else break; }
printf(\请输入该进程所请求的资源数request[j]:\\n\for(j=0;j scanf(\ 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]; //还原已分配的资源数,仍需要的资源数和可用的资源数 } 31 } printf(\返回分配前资源数\\n\ print(); } } }printf(\你还要继续分配吗?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 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); 32 f=1; for(i=0;i break; } } 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(\ } |\\n\33 printf(\ printf(\各类资源可利用的资源数为:\ for (j = 0; j < no2; j++) {printf(\ printf(\ } 程序运行结果及分析 34 实验感想: 银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。 35