#include <iostream>
using namespace std;
int Available[100]; //可利用资源数组
int Max[50][100]; //最大需求矩阵
int Allocation[50][100]; //分配矩阵
int Need[50][100]; //需求矩阵
int Request[50][100];
int Finish[50];
int p[50];
int m,n; //m个进程,n个资源
int IsSafe( ) //系统安全性检查
{
int i,j,L=0;
int Isfind=1;
int Work[100];
for(i=0; i<n; i++)
Work[i]=Available[i] ; //建立Available副本Work,即对Work初始化
for(i=0; i<m; i++)
Finish[i]=0 ; // 对Finish进行初始化
while(L<m&&Isfind)
{
Isfind=0;
for(i=0; i<m; i++)
{
if (Finish[i]==1)
continue;
else
{
for(j=0; j<n; j++)
if(Need[i][j]>Work[j])
break;
if(j==n)
{
Finish[i]=1 ; //表示进程i能结束
for(int k=0; k<n; k++)
Work[k]+=Allocation[i][k] ; //进程i能结束,释放资源
p[L++]=i;
Isfind=1;
if(L==m)
break;
}
}
}
}
if ( L==m ) //判定是否存在安全系列。提示:判定L与m值的关系
{
cout<<"系统是安全的!"<<"安全系列是:"<<endl;
for(i=0; i<m; i++)
{
cout<<p[i];
if(i<m-1)
cout<<"-->";
}
cout<<endl;
return 1;
}
else
{
cout<<"系统处于不安全状态!";
return 0;
}
}
int main()
{
int i,j,mi,flag=1;
cout<<"输入进程数目:\n";
cin>>m;
cout<<"输入资源的种类数:\n";
cin>>n;
cout<<"输入每个进程最多所需要的各资源数,按照"<<m<<"×"<<n<<"矩阵输入!\n";
for(i=0; i<m; i++)
for (j=0; j<n; j++)
cin>>Max[i][j];
cout<<"输入每个进程已分配的各资源数,也按照"<<m<<"×"<<n<<"矩阵输入!\n";
for(i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
cin>>Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];
if (Need[i][j]<0)
{
cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入!\n";
j--;
continue;
}
}
}
cout<<"请输入各个资源现有的数目:\n";
for(i=0; i<n; i++)
cin>>Available[i];
if(IsSafe()!=1)
return 0;
while(1)
{
flag=1;
cout<<"输入要申请资源的进程号(第一个进程号为0,以此类推):\n";
cin>>mi;
cout<<"输入该进程所请求各资源的数量:\n";
for(i=0; i<n; i++)
cin>>Request[mi][i];
for(i=0; i<n&&flag; i++)
{
if (Request[mi][i]>Need[mi][i] )
{
cout <<"进程P"<<mi<<"的资源请求数超过进程的需求量,拒绝分配!\n";
flag=0;
break;
}
if (Request[mi][i]>Available[i] )
{
cout <<"进程P"<<mi<<"的请求数超过了系统所可用的资源数,拒绝分配!\n";
flag=0;
break;
}
}
if(flag)
{
for(i=0; i<n; i++) //试探分配资源给进程mi
{
Available[i]-=Request[mi][i] ;
Allocation[mi][i]+=Request[mi][i];
Need[mi][i]-=Request[mi][i] ;
}
if (IsSafe()==1) cout<<"同意分配请求!\n" ; // 提示:调用安全性检测函数
else
{
cout<<"资源分配请求被拒绝!\n";
for(i=0; i<n; i++) //恢复进程mi以前的资源分配状态
{
Available[i]+=Request[mi][i];
Allocation[mi][i]-=Request[mi][i] ;
Need[mi][i]+=Request[mi][i];
}
}
}
for(i=0; i<m; i++)
Finish[i]=0;
char YesNo;
while(1)
{
cout<<"继续请求资源分配请按 y或Y ,结束程序请按 n或N :";
cin>>YesNo;
cout<<endl;
if (YesNo=='y'||YesNo=='Y') break;
else if (YesNo=='n'||YesNo=='N') return 0;
}
}
}