银行家算法检测死锁c语言,[分享]银行家算法解决死锁问题

[分享]银行家算法解决死锁问题

经过测试完全可以运行的:

#include

#include

#include

#include

#include

#define M 10//最大进程数

#define N 10//最大资源数

#define FALSE 0

#define TRUE 1

int process[M];

int p;

int q;

int MAX[M][N];

int AVAILABLE[N];

int ALLOCATION[M][N];

int NEED[M][N];

int Request[N];

void in()

{int j1,j2;

printf ("请输入要运行的进程数:");

scanf("%d",&p);

for(j1=0;j1

process[j1]=j1;

printf ("请输入可用的资源数:");

scanf("%d",&q) ;

printf("初始化开始!\n") ;

for(j1=0;j1

{printf("请输入进程%d的最大资源需求总量MAX:",j1);

for(j2=0;j2

scanf("%d",&MAX[j1][j2]);

printf("请输入进程%d的已分配的资源数量ALLOCATION:",j1);

for(j2=0;j2

scanf("%d",&ALLOCATION[j1][j2]);

for(j2=0;j2

NEED[j1][j2]=MAX[j1][j2]-ALLOCATION[j1][j2];

}

printf("请输入现在系统的剩余的资源数AVAILABLE:");

for(j2=0;j2

scanf("%d",&AVAILABLE[j2]);

}

void out1 ()

{int j1,j2;

printf("进程 \t Max \t Allocation\t need \t Available\n");

j1=0;

printf("%d \t",process[j1]);

for (j2=0;j2

printf("%d ",MAX[j1][j2]);

printf("\t ");

for (j2=0;j2

printf("%d ",ALLOCATION[j1][j2]);

printf("\t ");

for (j2=0;j2

printf("%d ",NEED[j1][j2]);printf("\t");

for (j2=0;j2

printf("%d ",AVAILABLE[j2]);

printf("\n");

for(j1=1;j1

{

printf("%d ",process[j1]);printf("\t");

for (j2=0;j2

printf("%d ",MAX[j1][j2]);printf("\t ");

for (j2=0;j2

printf("%d ",ALLOCATION[j1][j2]);printf("\t ");

for (j2=0;j2

printf("%d ",NEED[j1][j2]);

printf("\n");

}

}

void main()

{

int i=0,j=0;

in();

out1();

char flag='Y';

void showdata();

void changdata(int);

int chkerr(int);

showdata();

while(flag=='Y'||flag=='y')

{

i=-1;

while(i<0||i>=p)

{

printf(" 请输入需申请资源的进程号(从0到%d,否则重输入!):",p-1);

cin>>i;

if(i<0||i>=p)

printf(" 输入的进程号不存在,重新输入!");

}

printf(" 请输入进程%d申请的资源数",i);

for(j=0;j

{

printf("\n资源%d: ",j);

cin>>Request[j];

if(Request[j]>NEED[i][j])

{

printf(" 进程%d申请的资源数大于进程%d还需要%d类资源的资源量!",i,i,j);

printf("申请不合理,出错!请重新选择!");

flag='N';

break;

}

else

{

if(Request[j]>AVAILABLE[j])

{

printf(" 进程%d申请的资源数大于系统可用%d类资源的资源量!",i,j);

printf("申请不合理,出错!请重新选择!");

flag='N';

break;

}

}

}

if(flag=='Y'||flag=='y')

{

changdata(i);

if(chkerr(i))

{

showdata();

}

else

showdata();

}

else

showdata();

cout<

printf(" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ");

cin>>flag;

}

}

void showdata()

{

int i,j;

printf(" 系统可用的资源数为AVAILABLE:");

for (j=0;j

printf(" 资源%d: %d",j,AVAILABLE[j]);

cout<

printf(" 各进程最大需求量MAX:\n");

for (i=0;i

{

printf("进程%d:",i);

for (j=0;j

printf(" 资源%d: %d",j,MAX[i][j]);

printf("\n");

}

printf("\n");

printf(" 各进程还需要的资源量NEED:\n");

for (i=0;i

{

printf("进程%d:",i);

for (j=0;j

printf("\n");

}

printf("\n");

printf(" 各进程已经得到的资源量ALLOCATION:\n ");

for (i=0;i

{

printf("进程%d:",i);

for(j=0;j

printf(" 资源%d:%d",j, ALLOCATION[i][j]);

printf("\n");

}

printf("\n");

};

void changdata(int k)

{

int j;

for (j=0;j

{

AVAILABLE[j]=AVAILABLE[j]-Request[j];

ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

NEED[k][j]=NEED[k][j]-Request[j];

}

};

int chkerr(int s)

{

int WORK,FINISH[M],temp[M];

int i,j,k=0;

for(i=0;i

for(j=0;j

{

WORK=AVAILABLE[j];

i=s;

while(i

{

if (FINISH[i]==FALSE&& NEED[i][j]<=WORK)

{

WORK=WORK+ALLOCATION[i][j];

FINISH[i]=TRUE;

temp[k]=i;

k++;

i=0;

}

else

{

i++;

}

}

for(i=0;i

if(FINISH[i]==FALSE)

{

cout<

printf(" 系统不安全!!! 本次资源申请不成功!!!");

cout<

return 1;

}

}

cout<

printf(" 经安全性检查,系统安全,本次分配成功。");

cout<

cout<

for(i=0;i

";

cout<

return 0;

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值