#include "stdio.h"
#define M 50 //总进程数
#define N 30 //总资源数
#define FALSE 0
#define TRUE 1
int m,n;
//系统可用资源数
int AVAILABLE[N];
//M个进程已经得到N类资源的资源量
int ALLOCATION[M][N];
//M个进程还需要N类资源的资源量
int NEED[M][N];
int Request[N];
main()
{
int i=0,j=0;
int flag=1;
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
printf("输入进程总数m:");
scanf("%d", &m);
printf("输入资源种类总数n:");
scanf("%d", &n);
printf("输入已分配资源数/n");
for(i=0;i<m; i++)
for(j=0;j<n; j++)
scanf("%d", &ALLOCATION[i][j]);
printf("输入还需要的资源数/n");
for (i=0;i<m; i++)
for(j=0;j<n; j++)
{
scanf("%d",&NEED [i][j]);
}
printf("/n输入可利用的资源数/n");
for (i=0;i<n; i++)
scanf("%d", &AVAILABLE[i]);
showdata();
while(flag)
{
i=-1;
while(i<0||i>=m)
{
printf("请输入需申请资源的进程号(从0到m-1,否则重输入!):");
scanf("%d",&i);
if(i<0||i>=m)
printf("输入的进程号不存在,重新输入!/n");
}
printf("请输入进程%d申请的资源数/n",i);
for (j=0;j<n;j++)
{
printf("资源%d: ",j);
scanf("%d",&Request[j]);
if(Request[j]>NEED[i][j])
{
printf("进程%d申请的资源量大于%d还需要%d类资源的资源量!",i,i,j);
printf("申请不合理,出错!请重新选择/n!");
flag=0;
break;
}
else
{
if(Request[j]>AVAILABLE[j])
{
printf("进程%d申请的资源数大于系统可用%d类资源的资源量!",i,j);
printf("申请不合理,出错!请重新选择!/n");
flag=0;
break;
}
}
}
if(flag)
{
changdata(i);
if(chkerr(i))
{
rstordata(i);
}
}
else
showdata();
printf("/n");
printf("是否继续银行家算法演示,按1键继续,按0键退出演示: /n");
scanf("%d",&flag);
}
return 0;}
void showdata()
{
int i,j;
printf("系统可用的资源数为:/n");
for (j=0;j<n;j++)
printf("资源%d:%d ",j,AVAILABLE[j]);
printf("/n");
printf("各进程已经得到的资源量:/n ");
for (i=0;i<m;i++)
{
printf("进程%d:",i);
for (j=0;j<n;j++)
printf("资源%d:%d ",j,ALLOCATION[i][j]);
printf("/n");
}
printf("/n");
printf("各进程还需要的资源量:/n");
for (i=0;i<m;i++)
{
printf("进程%d:",i);
for (j=0;j<n;j++)
printf("资源%d:%d ",j,NEED[i][j]);
printf("/n");}
printf("/n");
}
void changdata(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];
}
};
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,FINISH[M],temp[M];
int i,j,k=0;
for(i=0;i<m;i++)
FINISH[i]=FALSE;//将每一个进程的finish值初始化为false
for(j=0;j<n;j++)
{
WORK=AVAILABLE[j];
i=s;
while(i<m)
{
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<m;i++)
if(FINISH[i]==FALSE)
{
printf("/n");
printf(" 系统不安全!!! 本次资源申请不成功!!!");
printf("/n");
return 1;
}
}
printf("/n");
printf("经安全性检查,系统安全,本次分配成功。");
printf("/n");
printf("本次安全序列:");
for(i=0;i<m;i++)
printf("进程%d",temp[i]);
printf("/n");
return 0;
};