#include<iostream>
#include<string>
using namespace std;
//定义资源的最大数量
#define r_max 99
//定义全局变量
int num_r,i,j,order[r_max],Max[r_max][r_max],Allocation[r_max][r_max],Need[r_max][r_max],work_num,Avaliable[r_max];
//资源类包括资源的名字和数量
class resource
{
public:
string name;
int num;
};
//打印Max,Allocation,Need信息
void show(resource r[])
{
cout<<"\t\tMax\t\tAllocation\tNeed\n进程名\t\t";
for(j=0;j<3;j++)
{
for(i=0;i<num_r;i++)
{
cout<<r[i].name<<" ";
}
cout<<"\t\t";
}
cout<<endl;
for(i=0;i<work_num;i++)
{
cout<<" "<<i<<" "<<"\t\t";
for(j=0;j<num_r;j++)
{
cout<<Max[i][j]<<" ";
}
cout<<" \t";
for(j=0;j<num_r;j++)
{
cout<<Allocation[i][j]<<" ";
}
cout<<" \t";
for(j=0;j<num_r;j++)
{
cout<<Need[i][j]<<" ";
}
cout<<endl;
}
}
//更新Avaliable数组函数
void Avaliable_Updata(resource r[])
{
for(i=0;i<num_r;i++)
{
int sum=r[i].num;
for(j=0;j<work_num;j++)
{
sum=sum-Allocation[j][i];
}
Avaliable[i]=sum;
}
}
//更新Need数组函数
void Need_Updata()
{
for(i=0;i<work_num;i++)
{
for(j=0;j<num_r;j++)
{
Need[i][j]=Max[i][j]-Allocation[i][j];
}
}
}
//安全性检查函数
bool anquan()
{
int Work[r_max],i_order=0,Need_Temp[r_max][r_max];
for(i=0;i<num_r;i++)
{
Work[i]=Avaliable[i];
}
for(i=0;i<num_r;i++)
{
for(j=0;j<work_num;j++)
{
Need_Temp[i][j]=Need[i][j];
}
}
for(int p=0;p<work_num;p++)
{
for(i=0;i<work_num;i++)
{
int flag1=0;
for(j=0;j<num_r;j++)
{
if(Need_Temp[i][j]<=Work[j])
{
flag1++;
}
}
if(flag1==num_r)
{
for(int k=0;k<num_r;k++)
{
Work[k]=Work[k]+Allocation[i][k];
Need_Temp[i][k]=999;
}
order[i_order]=i;
i_order++;
}
}
}
if(i_order==work_num)
{
return true;
}
else
{
return false;
}
}
int main()
{
cout<<"请首先输入系统可供资源种类的数量:";
cin>>num_r;
resource r[r_max];
for(i=0;i<num_r;i++)
{
cout<<"资源"<<i+1<<"的名称:";
cin>>r[i].name;
cout<<"资源"<<i+1<<"的数量:";
cin>>r[i].num;
}
cout<<"请输入作业的数量:";
cin>>work_num;
cout<<"请输入各进程的最大需求量"<<work_num<<"*"<<num_r<<"矩阵[Max]:"<<endl;
for(i=0;i<work_num;i++)
{
for(j=0;j<num_r;j++)
{
cin>>Max[i][j];
}
}
cout<<"请输入各进程已经申请的资源量"<<"<"<<work_num<<"*"<<num_r<<"矩阵>[Allocation]:"<<endl;
for(i=0;i<work_num;i++)
{
for(j=0;j<num_r;j++)
{
cin>>Allocation[i][j];
}
}
Avaliable_Updata(r);
cout<<"系统目前可用的资源[Avaliable]:"<<endl;
for(i=0;i<num_r;i++)
{
cout<<r[i].name<<" ";
}
cout<<endl;
for(i=0;i<num_r;i++)
{
cout<<Avaliable[i]<<" ";
}
cout<<endl;
Need_Updata();
show(r);
if(anquan())
{
cout<<"系统是安全的!"<<endl;
cout<<"分配的序列为:";
for(i=0;i<work_num;i++)
{
if(i==0)
{
cout<<order[i];
}
else
{
cout<<"->"<<order[i];
}
}
cout<<endl;
}
else
{
cout<<"系统在T0时刻不安全!"<<endl;
exit(0);
}
while(1)
{
int a,b,temp,c[r_max],flag1=0;
cout<<"\t\t\t 0:离开"<<endl;
cout<<"\t\t\t 1:分配资源"<<endl;
cout<<"\t\t\t 2:查看当前资源分配情况"<<endl;
cout<<"请选择功能号:";
cin>>a;
getchar();
switch(a)
{
case 0:exit(0);break;
case 1:
//输入Requesti数组的值
cout<<"请输入要分配资源进程的序号:";
cin>>b;
cout<<"请输入你要为进程"<<b<<"分配各资源的数量"<<endl;
for(i=0;i<num_r;i++)
{
cout<<"请输入申请资源"<<r[i].name<<"的数量:";
cin>>temp;
Allocation[b][i]+=temp;
c[i]=temp;
}
//更新Avaliable数组
Avaliable_Updata(r);
//更新Need数组
Need_Updata();
for(i=0;i<num_r;i++)
{
if(Avaliable[i]<0)
{
cout<<"此分配请求不安全!"<<endl;
flag1=1;
for(j=0;j<num_r;j++)
{
Allocation[b][j]-=c[j];
}
Avaliable_Updata(r);
Need_Updata();
break;
}
}
if(anquan() && flag1==0)
{
cout<<"系统是安全的!"<<endl;
cout<<"分配的序列为:";
for(i=0;i<work_num;i++)
{
if(i==0)
{
cout<<order[i];
}
else
{
cout<<"->"<<order[i];
}
}
cout<<endl;
cout<<"系统目前可用的资源[Avaliable]:"<<endl;
for(i=0;i<num_r;i++)
{
cout<<r[i].name<<" ";
}
cout<<endl;
for(i=0;i<num_r;i++)
{
cout<<Avaliable[i]<<" ";
}
cout<<endl;
cout<<"分配后的资源分配情况:"<<endl;
show(r);
getchar();
}
else
{
cout<<"此分配请求不安全!"<<endl;
for(j=0;j<num_r;j++)
{
Allocation[b][j]-=c[j];
}
Avaliable_Updata(r);
Need_Updata();
}
break;
case 2:show(r);getchar();break;
default:cout<<"输入有误!请重新输入!"<<endl;getchar();break;
}
}
return 0;
}