操作系统之银行家算法

银行家算法是操作系统为了避免死锁而设计的算法,当进程向操作系统请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程,如果有,再进一步计算在将这些资源分配给进城后,是否会使系统处于不安全的状态。如果不会,才将资源分配给它,否则让进程等待。
我认为这个算法的重点是安全性检测部分,先贴出代码:
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];
}
}
  }
这里主要是对进程索要资源时,程序对整个资源情况的判断,以及进行安全检测之前的数据初始化。
操作系统之银行家算法
结果正常。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值