#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<stdio.h>
#include<conio.h>
#define MAX_PROCESS 32 //最大进程数
#define MAX_COURCE 64 //最大资源类别
char ch=' ';
int MAX_FACT_PROCESS = 5; //实际总进程数
int MAX_FACT_COURCE = 3; //实际资源类别数
int Available[MAX_COURCE]={3,3,2};
//可利用资源向量
int Max[MAX_PROCESS][MAX_COURCE]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //最大需求矩阵
int Allocation[MAX_PROCESS][MAX_COURCE]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //分配矩阵
int Need[MAX_PROCESS][MAX_COURCE]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; //需求矩阵
int Request[MAX_PROCESS][MAX_COURCE];
int Work[MAX_COURCE];
void chushizhi() //初始数据输出
{
cout<<"进程"<<setw(7)<<"Max"<<setw(15)<<"Allocation"<<setw(7)<<"Need"<<setw(13)<<"Available"<<endl;
for(int i1=0;i1<MAX_FACT_PROCESS;i1++)
{
cout<<"P"<<i1<<setw(2)<<ch;
for(int j1=0;j1<MAX_FACT_COURCE;j1++)
cout<<setw(2)<<Max[i1][j1]<<ch;
cout<<setw(2)<<ch;
for(int j2=0;j2<MAX_FACT_COURCE;j2++)
cout<<setw(2)<<Allocation[i1][j2]<<ch;
cout<<setw(2)<<ch;
for(int j3=0;j3<MAX_FACT_COURCE;j3++)
cout<<setw(2)<<Need[i1][j3]<<ch;
cout<<setw(2)<<ch;
if(i1==0)
{
for(int j4=0;j4<MAX_FACT_COURCE;j4++)
cout<<setw(2)<<Available[j4]<<ch;
}
cout<<endl;
}
}
int Safty(){ //安全性算法
int n=0;
Work[0]=Available[0];
Work[1]=Available[1];
Work[2]=Available[2];
int X[MAX_COURCE]; //中间变量
bool Finish[MAX_PROCESS];
for(int i=0;i<MAX_FACT_PROCESS;i++)
Finish[i]=false;
cout<<"进程"<<setw(7)<<"Work"<<setw(10)<<"Need"<<setw(14)<<"Allocation"<<setw(17)<<"Work+Allocation"<<setw(12)<<"Finish";
cout<<endl;
for(int j=0;j<MAX_FACT_PROCESS;j++)
{
for(int i=0;i<MAX_FACT_PROCESS;i++)
{
if(Work[0]>=Need[i][0]&&Work[1]>=Need[i][1]&&Work[2]>=Need[i][2]&&Finish[i]==false)//这里也可以用调用函数
{
X[0]=Work[0];
X[1]=Work[1];
X[2]=Work[2];
Work[0]=Work[0]+Allocation[i][0];
Work[1]=Work[1]+Allocation[i][1];
Work[2]=Work[2]+Allocation[i][2];
Finish[i]=true;
if(Finish[i]==true){ //假如Finish为true,则输出该进程的数据
cout<<"P"<<i<<setw(2)<<ch;
for(int j1=0;j1<MAX_FACT_COURCE;j1++)
cout<<setw(2)<<X[j1]<<ch;
cout<<setw(2)<<ch;
for(int j2=0;j2<MAX_FACT_COURCE;j2++)
cout<<setw(2)<<Need[i][j2]<<ch;
cout<<setw(2)<<ch;
for(int j3=0;j3<MAX_FACT_COURCE;j3++)
cout<<setw(2)<<Allocation[i][j3]<<ch;
cout<<setw(2)<<ch;
for(int j4=0;j4<MAX_FACT_COURCE;j4++)
cout<<setw(2)<<Work[j4]<<ch;
cout<<setw(14)<<ch;
cout<<setw(2)<<Finish[i]<<ch;
cout<<setw(2)<<ch;
cout<<endl;
}
}
}
}
int k=0; //判断是否所有进程的Finish都为true
for(i=0;i<MAX_FACT_COURCE;i++)
{
if(Finish[i]==true)
k++;
}
if(k==MAX_FACT_COURCE){
cout<<"系统处于安全状态"<<endl; //是则处于安全状态
return 1;
}
else{
cout<<"系统处于不安全状态!!!无法分配资源"<<endl; //否则处于非安全状态
return 0;
}
}
//设置系统的进程数量、资源类别数量及可用数量
//以及各进程的需求情况
void Read_Initiate()
{
int i,j;
cout<<"请输入系统实际资源类别数量:";
cin>>MAX_FACT_COURCE;
for(j=0;j<MAX_FACT_COURCE;j++)
{
cout<<"请输入第"<<j+1<<"类资源的可用数量:";
cin>>Available[j];
}
cout<<"请输入系统实际运行的进程数量:";
cin>>MAX_FACT_PROCESS;
cout<<"请输入各进程运行的需求矩阵"<<endl;
for(i=0;i<MAX_FACT_PROCESS;i++)
{
cout<<"输入第"<<i+1<<"个进程的需求情况"<<endl;
for(j=0;j<MAX_FACT_COURCE;j++)
{
cout<<"输入第"<<j+1<<"种资源的数量:";
cin>>Max[i][j];
}
}
}
//初始化分配矩阵
void Allocated_list()
{
int i,j;
cout<<"输入已分配资源列表"<<endl;
for(i=0;i<MAX_FACT_PROCESS;i++)
{
cout<<"请输入第"<<i+1<<"个进程的分配情况"<<endl;
for(j=0;j<MAX_FACT_COURCE;j++)
{
cout<<"请输入第"<<j+1<<"类资源的分配数量:";
cin>>Allocation[i][j];
}
}
}
void main()
{ int flag;
char c;
cout<<"\n\n\n\n\n\n\n\n\n\t ";
for(int i=0;i<40;i++)
cout<<"*";
cout<<endl<<"\t"
<<" * 银 行 家 算 法 演 示 *"<<endl;
cout<<endl<<"\t"
<<" * \001 孙云 李萍霞 陈一嘉 马中杰 \001 *"<<endl;
printf("\t ");
for( i=0;i<40;i++)
printf("*");
printf("\n\n\n\n\n");
getch();
again:
cout<<"*************************************************"
<<'\n'<<"点击1执行!"
<<'\n'<<"点击2退出!"
<<'\n'<<"点击3设置初始化数据,否则使用默认值!"
<<'\n'<<"*************************************************"<<endl;
cin>>flag;
if(flag == 3)
{
Read_Initiate();
Allocated_list();
goto again;
}
if(flag==2)
exit(0);
if(flag==1){
cout<<"初始数据为:"<<endl;
chushizhi();
cout<<"初始数据安全性检测:"<<endl;
Safty();
for(int j=0;j<MAX_PROCESS;j++)
{
cout<<"*************************************************"
<<'\n'<<"点击1执行!"
<<'\n'<<"点击2退出!"
<<'\n'<<"*************************************************"<<endl;
cin>>flag;
if(flag==2)
exit(0);
if(flag==1)
{
int i,r;
cout<<"输入请求进程i"<<endl;
cin>>i;
cout<<"进程"<<i<<"请求资源分配"<<endl;
for(r=0; r<MAX_FACT_COURCE; r++)
{
cout<<"输入第"<<r<<"类资源需求量"<<endl;
cin>>Request[i][r];
}
bool bNeed = true , bAvailable = true;
for(r=0; r<MAX_FACT_COURCE; r++)
{
if(Request[i][r]>Need[i][r])
{
bNeed = false;
break;
}
}
for(r=0; r<MAX_FACT_COURCE; r++)
{
if(Request[i][r]>Available[r])
{
bAvailable = false;
break;
}
}
if(bNeed)
{
if(bAvailable) //满足条件,给于资源
{
for(r=0; r<MAX_FACT_COURCE; r++)
{
Available[r]=Available[r]-Request[i][r];
}
for(r=0; r<MAX_FACT_COURCE; r++)
{
Allocation[i][r]=Allocation[i][r]+Request[i][r];
}
for(r=0; r<MAX_FACT_COURCE; r++)
{
Need[i][r]=Need[i][r]-Request[i][r];
}
cout<<"进程"<<i<<"请求资源得到分配后安全性检测:"<<endl;
if(!Safty()){ //如果不安全,则改回原来的数据
for(r=0; r<MAX_FACT_COURCE; r++)
{
Available[r]=Available[r]+Request[i][r];
}
for(r=0; r<MAX_FACT_COURCE; r++)
{
Allocation[i][r]=Allocation[i][r]-Request[i][r];
}
for(r=0; r<MAX_FACT_COURCE; r++)
{
Need[i][r]=Need[i][r]+Request[i][r];
}
}
else{ //如果安全,则输出更改后的数据
cout<<"进程"<<i<<"分配后变为:"<<endl;
cout<<"进程"<<setw(7)<<"Max"<<setw(15)<<"Allocation"<<setw(7)<<"Need"<<setw(13)<<"Available"<<endl;
for(int i1=0;i1<MAX_FACT_COURCE;i1++)
{
cout<<"P"<<i1<<setw(2)<<ch;
for(int j1=0;j1<MAX_FACT_COURCE;j1++)
cout<<setw(2)<<Max[i1][j1]<<ch;
cout<<setw(2)<<ch;
for(int j2=0;j2<MAX_FACT_COURCE;j2++)
cout<<setw(2)<<Allocation[i1][j2]<<ch;
cout<<setw(2)<<ch;
for(int j3=0;j3<MAX_FACT_COURCE;j3++)
cout<<setw(2)<<Need[i1][j3]<<ch;
cout<<setw(2)<<ch;
if(i1==0)
{
for(int j4=0;j4<MAX_FACT_COURCE;j4++)
cout<<setw(2)<<Available[j4]<<ch;
}
cout<<endl;
}
}
}
else{
cout<<"资源不足,进程"<<i<<"等待"<<endl;
}
}
else{
cout<<"所求资源已超出所需的最大值,出错!!!"<<endl;
}
}
}
}
}