#include "string.h"
#include <stdio.h>
#include <stdlib.h>
#define M 5
#define N 3
#define FALSE 0
#define TRUE 1
/*M个进程对N类资源最大资源需求量*/
int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
/*系统可用资源数*/
int AVAILABLE[N]={1,1,2}; //N类资源最大资源量{10,5,7}
/*M个进程对N类资源最大资源需求量*/
int ALLOCATION[M][N]={{3,2,2},{1,1,0},{3,0,2},{1,1,1},{1,0,1}};
/*M个进程已经得到N类资源的资源量 */
int NEED[M][N]={{4,3,1},{2,1,2},{6,0,0},{1,1,1},{3,3,2}};
/*M个进程还需要N类资源的资源量*/
int Request[N]={0,0,0};
void main()
{
int i=0,j=0;
char flag='Y';
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
showdata();
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
printf("请输入需申请资源的进程号(从0到");
printf("%d",M-1);
printf(",否则重输入!):");
scanf("%d",&i);
getchar();
if(i<0||i>=M)printf("输入的进程号不存在,重新输入!\n");
}
printf("请输入进程");
printf("%d",i);
printf("申请的资源数\n");
for (j=0;j<N;j++)
{
printf("资源");
printf("%d",j);
printf(":");
scanf("%d",&Request[j]);
getchar();
if(Request[j]>NEED[i][j])
{
printf("进程");
printf("%d",i);
printf("申请的资源数大于进程");
printf("%d",i);
printf("还需要");
printf("%d",j);
printf("类资源的资源量!申请不合理,出错!请重新选择!\n");
flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j])
{
printf("进程");
printf("%d",i);
printf("申请的资源数大于系统可用");
printf("%d",j);
printf("类资源的资源量!申请不合理,出错!请重新选择!\n");
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i);
if(chkerr(i))
{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
printf("\n");
//printf("flag=%d",flag);
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ");
scanf("%c",&flag);
//printf("flag=%d",flag);
getchar();
}
}
void showdata() //显示当前可用资源,各进程还需要的资源量,各进程已经得到的资源量
{
int i,j;
printf("系统可用的资源数为:\n");
printf(" ");
for (j=0;j<N;j++)
{
printf(" 资源");
printf("%d",j);
printf(":");
printf("%d",AVAILABLE[j]);
}
printf("\n");
printf("各进程还需要的资源量:\n");
for (i=0;i<M;i++)
{
printf(" 进程");
printf("%d",i);
printf(":");
for (j=0;j<N;j++)
{
printf("资源");
printf("%d",j);
printf(":");
printf("%d",NEED[i][j]);
}
printf("\n");
}
printf("各进程已经得到的资源量: \n");
for (i=0;i<M;i++)
{
printf(" 进程");
printf("%d",i);
for (j=0;j<N;j++)
{
printf("资源");
printf("%d",j);
printf(":");
printf("%d",ALLOCATION[i][j]);
}
printf("\n");
}
}
void changdata(int k) //改变当前可用资源,当前进程还需要的资源量,当前进程已经得到的资源量
{
int i,j;
for (j=0;j<N;j++)
{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
for (j=0;j<N;j++)
{
printf(" 资源");
printf("%d",j);
printf(":");
printf("%d",AVAILABLE[j]);
}
printf("\n");
printf("各进程还需要的资源量:\n");
for (i=0;i<M;i++)
{
printf(" 进程");
printf("%d",i);
printf(":");
for (j=0;j<N;j++)
{
printf("资源");
printf("%d",j);
printf(":");
printf("%d",NEED[i][j]);
}
printf("\n");
}
}
void rstordata(int k) //改变当前可用资源,当前进程还需要的资源量,当前进程已经得到的资源量
{
int j;
for (j=0;j<N;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[M],FINISH[M],temp[M];
int i,j,k=0;
for(i=0;i<M;i++)
FINISH[i]=FALSE;
i=s;
while(i<M)
{
for(j=0;j<N;j++)
{
WORK[j]=AVAILABLE[j];
printf("第%d个进程\n",i);
printf("当前资源%d\n",WORK[j]);
printf("当前需要资源%d\n",NEED[i][j]);
if (FINISH[i]==FALSE&&NEED[i][j]<=WORK[j])
{
WORK[j]=WORK[j]+ALLOCATION[i][j];
printf("当前资源%d\n",WORK[j]);
FINISH[i]=TRUE;
temp[k]=i;
k++;
}
}
i++;
}
for(i=0;i<M;i++)
if(FINISH[i]==FALSE)
{
printf("\n");
printf("系统不安全!!! 本次资源申请不成功!!!\n");
printf("\n");
return 1;
}
printf("\n");
printf("经安全性检查,系统安全,本次分配成功。\n");
printf("\n");
printf(" 本次安全序列:");
for(i=0;i<M;i++)
{
printf("进程");
printf("%d",temp[i]);
printf("->");
}
printf("\n");
rstordata(s);
return 0;
}