#include <iostream>
using namespace std;
#define MAX_PROCESS_NUM 10 //最大进程数
#define MAX_RESOURCE_NUM 10 //最大资源数
int AVAILABLE[MAX_RESOURCE_NUM]; //可用资源数组
int MAX[MAX_PROCESS_NUM][MAX_RESOURCE_NUM]; //最大需求矩阵
int ALLOCATION[MAX_PROCESS_NUM][MAX_RESOURCE_NUM]; //分配矩阵
int NEED[MAX_PROCESS_NUM][MAX_RESOURCE_NUM]; //需求矩阵
int REQUEST[MAX_PROCESS_NUM][MAX_RESOURCE_NUM]; //进程需要资源数
bool FINISH[MAX_PROCESS_NUM]; //系统是否有足够的资源分配
int p[MAX_PROCESS_NUM]; //记录序列
int m,n; //m个进程,n个资源
void Init();
bool Safe();
void Bank();
void showdata();
void main()
{
Init();
Safe();
Bank();
}
//初始化数据
void Init()
{
int i,j;
bool haserror;
cout<<"请输入进程的数目(1~"<<MAX_PROCESS_NUM<<"):";
cin>>m;
cout<<"请输入资源的种类数目(1~"<<MAX_RESOURCE_NUM<<"):";
cin>>n;
cout<<"请输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入:"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>MAX[i][j];
haserror=true;
while(haserror==true){
haserror=false;
cout<<"请输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入:"<<endl;
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<<"个资源数错误!"<<endl;
haserror=true;
}
}
}
if(haserror==true)
{
cout<<"请重新输入!"<<endl;
printf("\n");
}
}
cout<<"请输入各个资源现有的数目:"<<endl;
for(i=0;i<n;i++)
{
cin>>AVAILABLE[i];
}
printf("\n");
}
//银行家算法
void Bank()
{
int i,cusneed;
char again;
bool haserror;
while(1)
{
showdata();
haserror=false;
cout<<"请输入要申请资源的进程号:"<<endl;
cin>>cusneed;
cout<<"请输入进程所请求的各资源的数量:"<<endl;
for(i=0;i<n;i++)
{
cin>>REQUEST[cusneed][i];
}
for(i=0;i<n;i++)
{
if(REQUEST[cusneed][i]>NEED[cusneed][i])
{
cout<<"您输入的第"<<i+1<<"个资源请求数超过进程的需求量!"<<endl;
haserror=true;
continue;
}
if(REQUEST[cusneed][i]>AVAILABLE[i])
{
cout<<"您输入的第"<<i+1<<"个资源请求数超过系统有的资源数!"<<endl;
haserror=true;
continue;
}
}
if(haserror==true)
{
cout<<"请重新输入!"<<endl;
printf("\n");
continue;
}
printf("\n");
for(i=0;i<n;i++)
{
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
}
if(Safe())
{
cout<<"同意分配请求!"<<endl;
printf("\n");
}
else
{
cout<<"您的请求被拒绝!"<<endl;
printf("\n");
for(i=0;i<n;i++)
{
AVAILABLE[i]+=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];
NEED[cusneed][i]+=REQUEST[cusneed][i];
}
}
for(i=0;i<m;i++)
{
FINISH[i]=false;
}
cout<<"您还想再次请求分配吗?是请按y或Y,否请按其它键。"<<endl;
cin>>again;
if(again=='y'||again=='Y')
{
printf("\n");
printf("\n");
continue;
}
break;
}
}
//安全性检查
bool Safe()
{
int i,j,k,l=0;
int Work[MAX_RESOURCE_NUM]; //工作数组
for(i=0;i<n;i++)
Work[i]=AVAILABLE[i];
for(i=0;i<m;i++)
{
FINISH[i]=false;
}
for(i=0;i<m;i++)
{
if(FINISH[i]==true)
{
continue;
}
else
{
for(j=0;j<n;j++)
{
if(NEED[i][j]>Work[j])
{
break;
}
}
if(j==n)
{
FINISH[i]=true;
for(k=0;k<n;k++)
{
Work[k]+=ALLOCATION[i][k];
}
p[l++]=i;
i=-1;
}
else
{
continue;
}
}
if(l==m)
{
cout<<"系统是安全的。"<<endl;
cout<<"安全序列:";
for(i=0;i<l;i++)
{
cout<<p[i];
if(i!=l-1)
{
cout<<"-->";
}
}
cout<<""<<endl;
printf("\n");
return true;
}
}
cout<<"系统是不安全的!"<<endl;
printf("\n");
return false;
}
//显示数据
void showdata()
{
int i,j;
printf("现系统的资源情况如下:\n");
printf("Available:\n ");
for (j=0;j<n;j++)
printf("资源%c: %d \t",j+65, AVAILABLE[j]);
printf("\n");
printf("\n");
printf("Need: \n");
for(i=0;i<m;i++)
{
printf("进程%d:",i);
for(j=0;j<n;j++)
printf(" %d ", NEED[i][j]);
printf("\n");
}
printf("\n");
printf("Allocation:\n");
for(i=0;i<m;i++)
{
printf("进程%d:",i);
for(j=0;j<n;j++)
printf(" %d ",ALLOCATION[i][j]);
printf("\n");
}
printf("\n");
}