/*因为是早期写的程序,代码风格都不好,比如main函数应该保持短小精悍。那么那时爱X就没做到,呵呵。*/
/*银行家算法 */
#include<iostream.h>
#define FALSE 0
#define TRUE 1
#define n 3 //n个进程
#define m 3 //m类资源
typedef struct
{
int Available[m]; //可利用资源向量Available
int Max[n][m]; //最大需求矩阵Max
int Allocation[n][m]; //进程i当前已分得Rj类资源的数目
int Need[n][m]; //需求矩阵Need,进程尚需的各类资源数
int Request[n][m]; //进程的请求向量
}Process;
typedef struct
{
int Work[m]; //系统可提供给进程继续运行所需的各类资源数
int Finish[n]; //进程完成标志
}Safe;
bool SafeAlgorithm(Safe newSafe,Process newProcess); //安全性算法
bool SafeAlgorithm(Safe newSafe,Process newProcess)
{
int successfulNumber=0; //用来记录成功的进程总数
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(newSafe.Finish[i]==FALSE && newProcess.Need[i][j]<=newSafe.Work[j])
{
newSafe.Work[j]=newSafe.Work[j]+newProcess.Allocation[i][j];
newSafe.Finish[i]=TRUE;
}
}
for(int k=0;k<n;k++)
{
if(newSafe.Finish[k]==TRUE)
successfulNumber++;
}
if(successfulNumber==n)
{
cout<<"系统安全!"<<endl<<endl;
return TRUE; //系统安全
}
else
{
cout<<"系统不安全!"<<endl<<endl;
return FALSE; //系统不安全
}
//return TRUE;
}
int main()
{
Process newProcess;
Safe newSafe;
//下面是一系列的初始化,首先对进程阶段初始化
int i,j;
for(i=0;i<m;i++)
{
cout<<"请输入第"<<i+1<<"类资源数。"<<endl;
cin>>newProcess.Available[i];
}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cout<<"请输入第"<<i+1<<"个进程"<<"需要"<<j+1<<"类资源的最大数。"<<endl;
cin>>newProcess.Max[i][j];
//cout<<"第"<<i+1<<"个进程对第"<<j+1<<"类资源需求数输入成功"<<endl;
cout<<endl;
newProcess.Allocation[i][j]=0; //初始情况下,当前进程i分得资源j的资源数全为0
newProcess.Need[i][j]=newProcess.Max[i][j]; //初始情况下,当前进程i还需要的资源j的数目为输入的值
cout<<"请输入第"<<i+1<<"个进程"<<"申请第"<<j+1<<"类资源的数量"<<endl;
cin>>newProcess.Request[i][j];
}
//下面进行Safe的初始化工作
for(i=0;i<m;i++)
{
newSafe.Work[i]=newProcess.Available[i];
newSafe.Finish[i]=FALSE;
}
//====================此时,初始化工作全部结束。=========================
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(newProcess.Request[i][j]<=newProcess.Need[i][j])
{
if(newProcess.Request[i][j]<=newProcess.Available[j])
{
newProcess.Available[j]=newProcess.Available[j]-newProcess.Request[i][j];
newProcess.Allocation[i][j]=newProcess.Allocation[i][j]+newProcess.Request[i][j];
newProcess.Need[i][j]=newProcess.Need[i][j]-newProcess.Request[i][j];
bool result=SafeAlgorithm(newSafe,newProcess); //系统执行安全性算法
if(result=TRUE)
{
cout<<"进程P"<<i+1<<"分配第"<<j+1<<"种资源成功!"<<endl<<endl;
}
else
{
cout<<"由于系统不安全,分配失败!"<<endl<<endl;
}
//恢复原先的资源分配状态
newProcess.Available[j]=newProcess.Available[j]+newProcess.Request[i][j];
newProcess.Allocation[i][j]=newProcess.Allocation[i][j]-newProcess.Request[i][j];
newProcess.Need[i][j]=newProcess.Need[i][j]+newProcess.Request[i][j];
}
else
{
cout<<"尚无足够资源,进程P"<<i+1<<"需要等待"<<endl;
break; //该进程等待,下一个进程运行
}
}
else
{
cout<<"进程P"<<i+1<<"申请第"<<j+1<<"种资源过多,出错!"<<endl<<endl;
break; //一旦资源分配失败,该进程等待,下一个进程运行
}
return 0;
}