银行家算法

/*
--------------银行家算法,避免死锁---------------

假设:
三种类型的资源 R1 R2 R3
三个并发进程 P1 P2 P3 P4 P5
假设资源量 R1=10  R2=5  R3=7

我只能手动模拟进程的不却定性,这里指向了解一下银行家算法是怎么回事
*/
#include <stdio.h>

#define  OK  1
#define FALSE 0

//最大需求资源量
int Max[5][3]={
 7,5,3,
 3,2,2,
 9,0,2,
 2,2,2,
 4,3,3,
};

//以分配资源量
int Allocation[5][3]={
 0,0,0,
 0,0,0,
 0,0,0,
 0,0,0,
 0,0,0,
};

//分配后还需的资源量
int Need[5][3]={
 7,5,3,
 3,2,2,
 9,0,2,
 2,2,2,
 4,3,3,
};

//可用资源量,起初资源量 R1=10  R2=5  R3=7
int Available[3]={10,5,7};

 

//申请资源量
int avai(int &P,int &R1, int &R2, int &R3)
{
 printf("请输入要分配资源的进程号P=");
 scanf("%d",&P); //scanf不可正确读取字符,郁闷,一输入字符就乱了
 if(P<1 || P>5)
  return FALSE;
 printf("请输入分配资源数目/nR1=");
 scanf("%d",&R1);
 printf("R2=");
 scanf("%d",&R2);
 printf("R3=");
 scanf("%d",&R3);
 return OK;
}


//验证申请是否安全
//分配后,剩下的资源必须能够保证其中一个进程的需要量,这样才能保证不死锁
int safety(int p ,int r1,int r2,int r3)
{
 int i;
 int s1=Available[0],s2=Available[1],s3=Available[2];
 s1=s1-r1;
 s2=s2-r2;
 s3=s3-r3;

 p--;
 if(Max[p][0]<r1 || Max[p][1]<r2 || Max[p][2]<r3)
 {
  printf("对不起,超过该进程申请的最大使用量!/n");
  return FALSE;
 }
 for(i=0;i<5;i++)
 {
  if(s1>=Need[i][0] && s2>=Need[i][1] && s3>=Need[i][2])
   return OK;
 }

 return FALSE;
}

//进行修改信号量
void change(int p,int r1,int r2,int r3)
{
 //修改可用信号量
 Available[0]-=r1;
 Available[1]-=r2;
 Available[2]-=r3;

 //修改需要信号量
 p--;
 Need[p][0]-=r1;
 Need[p][1]-=r2;
 Need[p][2]-=r3;

 //分配申请信号量
 Allocation[p][0]+=r1;
 Allocation[p][1]+=r2;
 Allocation[p][2]+=r3;

}

void main()
{
 int p,r1,r2,r3;
 printf("这里假定有5个进程P1,P2,P3,P4,P5和三种资源R1,R2,R3/n");
 printf("默认资源的数目是R1=10,R2=5,R3=7/n/n");
 while(1)
 {
  if(!avai(p,r1,r2,r3))
  {
   printf("没有该进程/n/n");
   continue;
  }
  if(!safety(p,r1,r2,r3))
  {
   printf("不能分配资源/n/n");
   continue;
  }
  change(p,r1,r2,r3);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值