📄 bank.cpp
字号:
#include <iostream>
#include <vector>
using namespace std;
class Resource
{
public:
int *pRe;
int m_count;
public:
Resource(int);
~Resource();
};
Resource::Resource(int count) : m_count(count)
{
pRe=new int[count];
}
Resource::~Resource()
{
delete [] pRe;
m_count=0;
}
class Process //进程类
{
public:
Resource *allocate;
Resource *need;
bool finish;
int m_count;
public:
Process(int);
Process(const Process&);
~Process();
};
Process::Process(int count) : m_count(count)
{
allocate=new Resource(count);
need=new Resource(count);
finish=false;
}
Process::Process(const Process& p) //深拷贝构造函数,allocator类使用
{
allocate=new Resource(p.m_count);
need=new Resource(p.m_count);
finish=p.finish;
m_count=p.m_count;
}
Process::~Process()
{
delete allocate;
delete need;
m_count=0;
}
int main()
{
cout<<" ---------------银行家算法---------------\n 作者:汪宏浩\n";
cout<<"请输入需要多少进程:";
int numPro;
cin>>numPro;
cout<<"请输入每个进程的资源数:";
int count;
cin>>count;
// VC 2008下可用
// allocator<Process> alloc;
// Process *p=alloc.allocate(numPro);
// for (int i=0;i<numPro;i++)
// alloc.construct(p+i,Process(count));
Resource *available; //整体的资源需求量
available=new Resource(count);
vector<Process> p(numPro,Process(count));
// 赋初值的
// Process p[5]={Process(4),Process(4),Process(4),Process(4),Process(4)};
//available->pRe[0]=1;
//available->pRe[1]=1;
//available->pRe[2]=2;
//available->pRe[3]=2;
//p[0].allocate->pRe[0]=0;
//p[0].allocate->pRe[1]=0;
//p[0].allocate->pRe[2]=3;
//p[0].allocate->pRe[3]=2;
//p[0].need->pRe[0]=0;
//p[0].need->pRe[1]=0;
//p[0].need->pRe[2]=1;
//p[0].need->pRe[3]=2;
//p[1].allocate->pRe[0]=1;
//p[1].allocate->pRe[1]=0;
//p[1].allocate->pRe[2]=0;
//p[1].allocate->pRe[3]=0;
//p[1].need->pRe[0]=1;
//p[1].need->pRe[1]=7;
//p[1].need->pRe[2]=5;
//p[1].need->pRe[3]=0;
//p[2].allocate->pRe[0]=1;
//p[2].allocate->pRe[1]=3;
//p[2].allocate->pRe[2]=5;
//p[2].allocate->pRe[3]=4;
//p[2].need->pRe[0]=2;
//p[2].need->pRe[1]=3;
//p[2].need->pRe[2]=5;
//p[2].need->pRe[3]=6;
//p[3].allocate->pRe[0]=0;
//p[3].allocate->pRe[1]=3;
//p[3].allocate->pRe[2]=3;
//p[3].allocate->pRe[3]=2;
//p[3].need->pRe[0]=0;
//p[3].need->pRe[1]=6;
//p[3].need->pRe[2]=5;
//p[3].need->pRe[3]=2;
//p[4].allocate->pRe[0]=0;
//p[4].allocate->pRe[1]=0;
//p[4].allocate->pRe[2]=1;
//p[4].allocate->pRe[3]=4;
//p[4].need->pRe[0]=0;
//p[4].need->pRe[1]=6;
//p[4].need->pRe[2]=5;
//p[4].need->pRe[3]=6;
system("cls");
cout<<"请先输入资源状态数......"<<endl;
cout<<"可用资源:"<<endl;
for (int i=0;i<count;i++)
{
cout<<"资源"<<(char)(i+65)<<"的数量:";
cin>>available->pRe[i];
}
cout<<"\n\n\n各个进程的资源状态:"<<endl;
for (i=0;i<numPro;i++)
{
cout<<"进程p["<<i<<"]:"<<endl;
cout<<" 已分配资源..."<<endl;
for (int j=0;j<count;j++)
{
cout<<" 资源"<<(char)(j+65)<<"的数量:";
cin>>p[i].allocate->pRe[j];
}
cout<<" 所需资源..."<<endl;
for (j=0;j<count;j++)
{
cout<<" 资源"<<(char)(j+65)<<"的数量:";
cin>>p[i].need->pRe[j];
}
}
cout<<"\n\n有进程提出请求否?(y/n)"<<endl<<" 输入:";
char ch;
cin>>ch;
ch&=0x0DF;
if (ch=='Y')
{
cout<<"现有进程为:";
for (int i=0;i<numPro;i++)
{
cout<<"p["<<i<<"] ";
}
REINPUT:
cout<<"\n选择进程:";
int sel;
cin>>sel;
if (sel<0 || sel>=numPro)
{
cout<<"没有该进程,请重新输入!"<<endl;
goto REINPUT;
}
cout<<" 输入请求资源数:"<<endl;
int request;
for (i=0;i<count;i++)
{
REQUEST:
cout<<" 请求资源"<<(char)(i+65)<<"的数量:";
cin>>request;
if (request>p[sel].need->pRe[i])
{
cout<<"请求量不能大于该进程的资源需求量!\n请重新输入!。。。"<<endl;
goto REQUEST;
}
p[sel].allocate->pRe[i]+=request;
p[sel].need->pRe[i]-=request;
available->pRe[i]-=request; //修改现在的资源分配情况。
}
}
int j=0, k=0;
int *l=new int[numPro]; //保存分配资源序列
bool isSafe=false; //判断系统是否安全
bool hasAlloc; //判断是否已经全部分配完
while (true)
{
bool allFinish=true; //标志,判断是否所有进程都执行结束
bool flag=true; //标志,用于判断
//int *tmpAvail; //保存可用资源数,用于判断系统的安全状态
if (j==0) //如果是一个新的探测轮回
{
hasAlloc=false;
}
if (p[j].finish==false) //如果当前进程未执行完毕
{
for (int i=0;i<count;i++)
flag&=(available->pRe[i]>=p[j].need->pRe[i]); //判断是否可分配
if (flag)
{
for (int i=0;i<count;i++)
available->pRe[i]+=p[j].allocate->pRe[i];
p[j].finish=true;
l[k++]=j; //保存分配序列
hasAlloc=true;
}
}
for (int i=0;i<numPro;i++)
{
allFinish&=p[i].finish;
//cout<<i<<p[i].finish<<' ';
}
if (allFinish) //如果所有的进程都执行完毕
{
isSafe=true; //状态是安全的
break; //退出
}
j++; //指向下一个进程
if (j==numPro) //如果已经到进程尾
{
if (!hasAlloc) //如果一个轮回也没有分配出资源
break; //则系统是不安全的,退出
j=0; //否则回到第一个进程
}
}
cout<<"\n\n";
if (!isSafe) //如果是不安全的
cout<<"无法分配!"<<endl;
else //安全的则输出安全序列
{
cout<<"系统安全!分配资源过程为:"<<endl<<" ";
for (int i=0;i<numPro;i++)
{
cout<<"p["<<l[i]<<']';
if (i!=numPro-1)
cout<<"-->";
}
}
cout<<endl;
delete available;
delete []l;
// VC 2008下可用
// for (int i=0;i<numPro;i++)
// alloc.destroy(p+i);
// alloc.deallocate(p,numPro);
system("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -