标题:[分享]银行家算法解决死锁问题
只看楼主
tinyxing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-12-18
 问题点数:0 回复次数:3 
[分享]银行家算法解决死锁问题

经过测试完全可以运行的:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
#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<p;j1++)
process[j1]=j1;
printf ("请输入可用的资源数:");
scanf("%d",&q) ;
printf("初始化开始!\n") ;
for(j1=0;j1<p;j1++)
{printf("请输入进程%d的最大资源需求总量MAX:",j1);

for(j2=0;j2<q;j2++)
scanf("%d",&MAX[j1][j2]);
printf("请输入进程%d的已分配的资源数量ALLOCATION:",j1);
for(j2=0;j2<q;j2++)
scanf("%d",&ALLOCATION[j1][j2]);
for(j2=0;j2<q;j2++)
NEED[j1][j2]=MAX[j1][j2]-ALLOCATION[j1][j2];
}
printf("请输入现在系统的剩余的资源数AVAILABLE:");
for(j2=0;j2<q;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<q;j2++)
printf("%d ",MAX[j1][j2]);
printf("\t ");
for (j2=0;j2<q;j2++)
printf("%d ",ALLOCATION[j1][j2]);
printf("\t ");
for (j2=0;j2<q;j2++)
printf("%d ",NEED[j1][j2]);printf("\t");
for (j2=0;j2<q;j2++)
printf("%d ",AVAILABLE[j2]);
printf("\n");

for(j1=1;j1<p;j1++)
{
printf("%d ",process[j1]);printf("\t");
for (j2=0;j2<q;j2++)
printf("%d ",MAX[j1][j2]);printf("\t ");
for (j2=0;j2<q;j2++)
printf("%d ",ALLOCATION[j1][j2]);printf("\t ");
for (j2=0;j2<q;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<q;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<<endl;
printf(" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ");
cin>>flag;
}
}


void showdata()
{
int i,j;
printf(" 系统可用的资源数为AVAILABLE:");
for (j=0;j<q;j++)
printf(" 资源%d: %d",j,AVAILABLE[j]);
cout<<endl;
printf(" 各进程最大需求量MAX:\n");

for (i=0;i<p;i++)
{
printf("进程%d:",i);
for (j=0;j<q;j++)
printf(" 资源%d: %d",j,MAX[i][j]);
printf("\n");
}
printf("\n");
printf(" 各进程还需要的资源量NEED:\n");
for (i=0;i<p;i++)
{
printf("进程%d:",i);
for (j=0;j<q;j++)printf(" 资源%d:%d ",j,NEED[i][j]);
printf("\n");
}
printf("\n");
printf(" 各进程已经得到的资源量ALLOCATION:\n ");
for (i=0;i<p;i++)
{
printf("进程%d:",i);
for(j=0;j<q;j++)
printf(" 资源%d:%d",j, ALLOCATION[i][j]);
printf("\n");
}
printf("\n");
};

void changdata(int k)
{
int j;
for (j=0;j<q;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<p;i++)FINISH[i]=FALSE;
for(j=0;j<q;j++)
{
WORK=AVAILABLE[j];
i=s;
while(i<p)
{
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<p;i++)
if(FINISH[i]==FALSE)
{
cout<<endl;
printf(" 系统不安全!!! 本次资源申请不成功!!!");
cout<<endl;
return 1;
}
}
cout<<endl;
printf(" 经安全性检查,系统安全,本次分配成功。");
cout<<endl;
cout<<" 本次安全序列:";
for(i=0;i<p;i++)cout<<"进程"<<temp[i]<<"->";
cout<<endl<<endl;;
return 0;
};

搜索更多相关主题的帖子: 死锁 银行家 算法 include define 
2005-12-18 11:30
达达多
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-12-18
得分:0 

不错

2005-12-21 11:14
lhx222
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-12-21
得分:0 
顶一下!
2005-12-30 13:18
守望♂幸福
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-4-25
得分:0 
终于让我找到你了  。。宝贝!!!!

偶是偶滴偶像!!~ QQ:375490156
2006-11-27 22:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-38692-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.336112 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved