/*
--------------银行家算法,避免死锁---------------
假设:
三种类型的资源 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);
}
}