当前位置:文档之家› 银行家算法C语言实现

银行家算法C语言实现

//银行家算法
#include
#include
#define N 5 //表示有5个进程
#define M 3 //表示有3类资源
#define true 1
#define false 0

/*判断所请求的各类资源是否满足所需要的资源数不超过所宣布的资源数:*/
void requestComToNeed(int Request[],int Need[][M],int i)
{
int j;
for(j=0;j<3;j++) //从第一个资源开始判断
{
if(Request[j]<=Need[i][j])
continue;//如果符合要求,就继续

else
{
printf("所需要的资源数已经超过它所宣布的的最大值!!\n"); //否则就输出错误
exit(0);//退出程序
}
}
}

/*判断所请求的各类资源是否满足小于系统现有的各类资源的数目*/
void requestComToAvail(int Request[],int Available[])
{
int j;
for(j=0;j<3;j++)//从第一个资源开始判断
{
if(Request[j]<=Available[j])
continue; //如果符合要求就继续
else
{
printf("尚无足够资源分配!\n");//否则输出错误
exit(0);
}
}
}

/*系统把所请求的资源分配给进程i之后,将进程的各个资源进行更新,改变资源数*/
void updateResource(int Available[],int Allocation[][M],int Request[],int Need[][M],int i)
{
int j;
for(j=0;j<3;j++)//从第一个资源开始更新
{
Available[j]-=Request[j];
Allocation[i][j]+=Request[j];
Need[i][j]-=Request[j];
//------------- printf("%d %d %d\n",Available[j],Allocation[i][j],Need[i][j]);
}

}

/*系统执行安全性算法,检查资源分配后,系统是否处于安全状态。
如果安全,将资源分配给进程;否则,本次分配资源失败;继续等待资源分配*/
int safetyTest(int Work[],int Available[],int Finish[],int Need[][M],int Allocation[][M])
{
int j,i;
int pre_count=1,post_count=0;

for(j=0;jFinish[j]=false;
for(j=0;jWork[j]=Available[j];

/*当前后两次循环pre_count与post_count不相等时,也就是对其中某个(或某些)进程进行了资源分配,则继续执行;
若相等,则说明未对任何进程进行资源分配,则应退出循环,以免造成死循环*/
while(pre_count!=post_count)
{
post_count=pre_count;
for(i=0;i{
if(Finish[i]==false) //如果进程i未进行各类资源分配
{
for(j=0;j{
//=====================printf("%d %d!!\n",Need[i][j],Work[j]);
if(Need[i][j]<=Work[j])
continue;
else
break;
}

if(j==M) //如果进程i所需要的各类资源都不大于系统可用资源
{ for(j=0;j{ Work[j]+=Allocation[i][j];
Finish[i]=true;
pre_count++;
}
}
}
}


}
//判断Finish[i]是否都为true,也就是所有进程是否都已分配资源
for(i=0;i{
if(Finish[i]!=true)
break;
}



if(i==N)
return true;
else


return false;

}

void main()
{
int Available[M]={3,3,2};//开始时3类资源的剩余数目
int Max[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//5个进程3类资源所需要的最大资源数
int Allocation[N][M]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//每个进程已分得的资源数
int Need[N][M];//每个进程还需要的资源数,Need[i][j]= Max[i][j]- Allocation[i][j]
int i,j,stat;
int Request[M];//每个进程申请的资源数
int Work[M];//系统提供给进程继续运行所需要的资源数
int Finish[N];//用来判断是否有足够的资源分配给进程

/*计算Need[i][j]*/
int t;//中间变量
for(t=0;tfor(j=0;jNeed[t][j]=Max[t][j]- Allocation[t][j];


/*输入第i个进程所请求的各类资源的数目:*/
printf("请输入哪个进程请求申请资源(0,1,2,3,4):\n");
scanf("%d",&i);
printf("输入第%d个进程所请求的各类资源的数目:!!\n",i);
for(j=0;j{scanf("%d",&Request[j]);}

/*判断所请求的各类资源是否满足所需要的资源数不超过所宣布的资源数:*/
requestComToNeed(Request,Need,i);

/*判断所请求的各类资源是否满足小于系统现有的各类资源的数目*/
requestComToAvail(Request,Available);

/*系统把所请求的资源分配给进程i之后,将进程的各个资源进行更新,改变资源数*/
updateResource(Available,Allocation,Request,Need,i);

/*系统执行安全性算法,检查资源分配后,系统是否处于安全状态。
如果安全,将资源分配给进程;否则,本次分配资源失败;继续等待资源分配*/
stat=safetyTest(Work,Available,Finish,Need,Allocation);


if(stat==true)//若全部安全,就说明系统出于安全状态
printf("系统处于安全状态,可将资源分配给进程%d!!\n",i);
else
printf("系统处于不安全状态,本次资源分配作废!!\n");



}

相关主题
文本预览
相关文档 最新文档