银行家算法是操作系统为了避免死锁而设计的算法,当进程向操作系统请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程,如果有,再进一步计算在将这些资源分配给进城后,是否会使系统处于不安全的状态。如果不会,才将资源分配给它,否则让进程等待。
}
我认为这个算法的重点是安全性检测部分,先贴出代码:
int safeTest(){
int i,a = 1;
printf("\t
Work\t
Allocation\t
Need
Work+Allocation
Finish\n");
while(a!=0){
a=0;
for(i = 0;i < cnum;i ++){
if(finish[i] == 0&&com(need[i],work)&&finally[i] == 0){
printf("进程%d ",i);
printf("
%d
%d
%d
",work[0],work[1],work[2]);
printf("
%d
%d
%d
",allocation[i][0],allocation[i][1],allocation[i][2]);
printf("
%d
%d
%d
",need[i][0],need[i][1],need[i][2]);
work[0] = work[0] + allocation[i][0];
work[1] = work[1] + allocation[i][1];
work[2] = work[2] + allocation[i][2];
finish[i] = 1;
printf("
%d
%d
%d
",work[0],work[1],work[2]);
printf("
%d\n",finish[i]);
a=1;
}
}
}
for(i = 0;i < cnum;i ++){
if(finish[i] == 0&&finally[i] == 0){
return 0;
}
}
return 1;
}
因为要显示出安全检测的过程,所以代码看起来有点杂乱。思路就是循环检测need跟work,如果系统有足够的资源且该进程并未实际执行,而且也没有模拟执行,就将资源分配给这个进程,如此循环,直到不再有进程索要资源即完成安全检测,之后对finish判断,如果能顺利执行完所有的进程,表明系统给出资源后,系统依然有可以正常进行下去的方式。返回最终的判断结果即可。
下面贴出整个处理过程:
void working(){
int order,i; //请求的进程号
printf("进程号:");
scanf ("%d",&order);
printf("\n资源量(空格间隔):");
for(i = 0;i < rnum;i ++){ //请求资源
scanf ("%d",&request[i]);
}
for(i = 0;i <
rnum;i ++){ //超出所需资源
if(request[i] > need[order][i]){
printf("error!\n");
return;
}
}
for(i = 0;i < rnum;i ++){ //资源不足
if(request[i] > available[i]){
printf("资源不足\nWaiting!\n");
return;
}
}
for(i = 0;i //安全检测初始化
finish[i] = 0;
for(i = 0;i
work[i] = available[i]-request[i];
available[i] = available[i] - request[i];
allocation[order][i] = allocation[order][i] + request[i];
need[order][i] = need[order][i] - request[i];
}
if(safeTest()){ //返回零,表示如果分配,将不安全
printf("资源分配成功!\n");
if(need[order][0] == 0&&need[order][1] == 0&&need[order][2] == 0){
finally[order] = 1;
available[0] = available[0] + allocation[order][0];
available[1] = available[1] + allocation[order][1];
available[2] = available[2] + allocation[order][2];
}
}
else{
printf("资源紧张,请等待...\n");
for(i = 0;i < rnum;i ++){
available[i] = available[i] + request[i];
allocation[order][i] = allocation[order][i] - request[i];
need[order][i] = need[order][i] + request[i];
}
}
这里主要是对进程索要资源时,程序对整个资源情况的判断,以及进行安全检测之前的数据初始化。
结果正常。