// Banker.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;
const int M = 100; //进程的最大值
const int N = 100; //资源的最大值
int Avaliable [N]; //Available:可利用资源向量
int temp[100]={0}; //存放安全序列
int Work[100]={0}; //存放系统可提供资源
char Name[N]; //资源的名称
int Max[M][N]; //M进程对N类资源的最大需求
int Allocation[M][N]; //M进程已获得的资源N
int Need[M][N]; //表示M进程尚需资源N的数量
int Request[M][N]; // 表示M进程请求资源N
int NumR; //资源种类的数量
int NumC; //进程的数量
/*
以上数据存在如下关系:
Need[M][N] = Max[M][N] - Allocation[M][N]
*/
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
void Initialize()// 对开始时的资源、进程进行初始化
{
/* 对Available[i]进行初始化 */
cout<<"请输入资源种类的数量"<<endl;
cin>>NumR;
for (int i = 0;i<NumR;i++)
{
cout<<"资源"<<i+1<<"的名称:";
cin>>Name[i]; //输入资源的名称
cout<<"资源"<<i+1<<"的数量:"<<endl;
cin>>Avaliable[i]; //输入资源的数量
}
cout<<endl<<"请输入进程的数量:";
cin>>NumC; //输入进程数量
/* 对 Max[i][j]的初始化 */
cout<<"请输入各进程的最大需求量("<<NumC<<"*"<<NumR<<"矩阵)[Max]:"<<endl<<"资源:";
for(int i=0;i<NumR;i++)
{
cout<<Name[i]<<" ";
}
cout<<endl;
for(int i=0;i<NumC;i++)
{
cout<<"进程"<<i<<":" ;
for(int j=0;j<NumR;j++)
cin>>Max[i][j];//输入进程i对资源j的最大需求
}
/* 对Allocation[i][j] Need[i][j]进行初始化*/
cout<<"请输入各进程已经申请的资源量("<<NumC<<"*"<<NumR<<"矩阵)[Allocation]:"<<endl<<"资源:";
for(int i=0;i<NumR;i++)
{
cout<<Name[i]<<" ";
}
cout<<endl;
for(int i=0;i<NumC;i++)
{
cout<<"进程"<<i<<":" ;
for(int j=0;j<NumR;j++)
{
cin>>Allocation[i][j];//输入进程i对资源j的最大需求
Need[i][j]=Max[i][j]-Allocation[i][j];
}
}
}
void ShowDate()// 显示资源分布状况
{
cout<<"系统目前可用的资源[Avaliable]:"<<endl;
for(int i=0;i<NumR;i++)
cout<<Name[i]<<" ";
cout<<endl;
for (int j=0;j<NumR;j++)
cout<<Avaliable[j]<<" ";//输出可用分配资源
cout<<endl;
cout<<" Max Allocation Need"<<endl;
cout<<"进程名 ";
for(int j=0;j<NumC;j++){
for(int i=0;i<NumR;i++)
cout<<Name[i]<<" ";
cout<<" ";
}
cout<<endl;
for(int i=0;i<NumC;i++){
cout<<" "<<i<<" ";
for(int j=0;j<NumR;j++)
cout<<Max[i][j]<<" ";
cout<<" ";
for(int j=0;j<NumR;j++)
cout<<Allocation[i][j]<<" ";
cout<<" ";
for(int j=0;j<NumR;j++)
cout<<Need[i][j]<<" ";
cout<<endl;
}
}
bool Safe()
{
int i,k=0,m,apply,Finish[100]={0};//Finish[100]初始化
int j;
int flag=0;
for(int i=0;i<NumR;i++)
{
Work[i]=Avaliable[i];
}
for(i=0;i<NumC;i++)
{
apply=0; //当 apply 用来计算检验过的资源数
for(j=0;j<NumR;j++)
{
if (Finish[i]==0&&Need[i][j]<=Work[j]) // 对进程 i 的 j 资源进行确认
{
apply++;
if(apply==NumR)
{
for(m=0;m<NumR;m++)
Work[m]=Work[m]+Allocation[i][m];//变分配数
Finish[i]=1;
temp[k]=i;
i=-1;
k++;
flag++;
}
}
}
}
for(i=0;i<NumC;i++){
if(Finish[i]==0){
cout<<"系统不安全"<<endl;//不成功系统不安全
return 0;
}
}
cout<<"系统是安全的!"<<endl;//如果安全,输出成功
cout<<"分配的序列:";
for(i=0;i<NumC;i++){//输出运行进程数组
cout<<temp[i];
if(i<NumC-1) cout<<"->";
}
cout<<endl;
return 1;
}
void Banker() //银行家算法
{
int i,j;
char k;
cout<<"请输入发出请求的进程:\n";
cin>>i;
cout<<"请输入请求资源类型: \n";
cin>>k;
for(int l=0;l<NumR;l++)
{
if(k==Name[l])
{
j=l;
break;
}
}
cout<<"请输入请求资源数量"<<endl;
cin>>Request[i][j];
if(Request[i][j]>Need[i][j])
{
cout<<"error :Your request is beyond system's need !"<<endl;
}
else if(Request[i][j]>Max[i][j])
{
cout<<"error : Your request is beyond system's have ! "<<endl;
}
else
{
Avaliable[j]=Avaliable[j]-Request[i][j];
Allocation[i][j] = Allocation[i][j]+Request[i][j];
Need[i][j] = Need[i][j] - Request[i][j];
ShowDate(); //显示修改后的资源分布情况
if(Safe())
{
cout<<"分配成功!"<<endl;
}
else
{
Avaliable[j]=Avaliable[j]+Request[i][j];
Allocation[i][j] = Allocation[i][j]-Request[i][j];
Need[i][j] = Need[i][j] + Request[i][j];
cout<<"分配失败,进程P"<<i<<"请等待"<<endl;
}
}
}
int main()
{
Initialize();
ShowDate();
while(1)
{
Banker();
}
return 0;
}