#include "string.h"
#include "iostream.h"
#define M 5 //总进程数
#define N 3 //总资源数
#define FALSE 0
#define TRUE 1
int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//M个进程对N类资源最大资源需求量
int AVAILABLE[N]={3,3,2}; //系统可用资源数
int ALLOCATION[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//M个进程已经得到N类资源的资源量
int NEED[M][N]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};;//M个进程还需要N类资源的资源量
int Request[N]={0,0,0};
void main()
{
int i=-1,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)
{
cout<<"请输入需申请资源的进程号(0---"<<M-1<<",否则重输入!):";
cin>>i;
if(i<0||i>=M)cout<<" 输入的进程号不存在,重新输入!"<<endl;
}
cout<<" 请输入进程"<<i<<"申请的资源数"<<endl;
for (j=0;j<N;j++)
{
cout<<" 资源"<<j<<": ";
cin>>Request[j];
if(Request[j]>NEED[i][j])
{
cout<<" 进程"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的资源量!";
cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j])
{
cout<<" 进程"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
flag='N';
break;
}//end if
}//end for
}//end while
if(flag=='Y'||flag=='y')
{
if(chkerr(i))
{
cout<<endl;
cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl;
cout<<endl;
// rstordata(i);
showdata();
}
else
{
cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl;
cout<<endl;
changdata(i);
showdata();
}
}
else
showdata();
cout<<endl;
cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";
cin>>flag;
}
}
/*-------------显示进程及系统资源状况------------------*/
void showdata()
{
int i,j;
cout<<"系统可用的资源数:"<<endl;
for (j=0;j<N;j++)cout<<"资源"<<j<<": "<<AVAILABLE[j];
cout<<endl;
cout<<endl;
cout<<"各进程资源的最大需求量:"<<endl;
for (i=0;i<M;i++)
{
cout<<"进程"<<i<<":";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<MAX[i][j];
cout<<endl;
}
cout<<endl;
cout<<"各进程还需要的资源量:"<<endl;
for (i=0;i<M;i++)
{
cout<<"进程"<<i<<":";
for (j=0;j<N;j++)
cout<<" 资源"<<j<<": "<<NEED[i][j];
cout<<endl;
}
cout<<endl;
cout<<"各进程已经得到的资源量: "<<endl;
for (i=0;i<M;i++)
{
cout<<"进程"<<i<<":";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALLOCATION[i][j];
cout<<endl;
}
cout<<endl;
};
/*-----------系统给进程分配资源后修改对应数据-------------*/
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[N],FINISH[M],temp[M];
int i,j,k=0;
for(i=0;i<M;i++)FINISH[i]=FALSE; //把每个进程的FINISH[I]初始化为FALSE。
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
WORK[j]=AVAILABLE[j];//把工作向量WORK=系统资源数,每个循环里都一样
i=s;
while(i<M)
{
if (FINISH[i]==FALSE&&NEED[i][j]<=WORK[j]) // 从进程集合中找到一个满足
{ //FINISH[i]==FALSE和NEED[i][j]<=WORK
WORK[j]=WORK[j]+ALLOCATION[i][j];
FINISH[i]=TRUE;
temp[k]=i;
k++;
i=0;
}
else
i++;
}
}
for(i=0;i<M;i++)
if(FINISH[i]==FALSE)
{
cout<<endl;
cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl;
cout<<endl;
return 1;
}
}
cout<<endl;
cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl;
cout<<endl;
cout<<" 本次安全序列:";
for(i=0;i<M;i++)cout<<"进程"<<temp[i]<<"->";
cout<<endl<<endl;;
return 0;
};
评论1