📄 banker.cpp
字号:
// Banker.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
const int TASK_RUNNING=0;
const int TASK_SUCCEED=1;
const int TASK_WAITTING=2;
const int RLength=10;
int Resource_left=RLength;
class pcb
{
public:
int p_pid;
int p_stat;
int p_apply;
int p_occupy;
bool p_issuc;
int p_require;
pcb(int id ,int require,int occupy)
{
p_pid=id;
p_require=require;
p_stat=TASK_RUNNING;
p_occupy=occupy;
p_issuc=false;
p_apply=0;
}
friend ostream & operator <<(ostream &cout,const pcb &p)
{
cout<<p.p_pid<<'\t'<<p.p_stat<<'\t'<<p.p_require<<'\t'<<p.p_occupy<<endl;
return cout;
}
};
void banker(vector<int>&resource,vector<pcb>&pgrp);
void banker(vector<int>&resource,vector<pcb>&pgrp)
{
vector<pcb>::iterator p;
vector<int>::iterator r;
vector<pcb>::iterator current,q;
pcb proc(0,0,0);
int length;
cout<<"NOW ---------BANKER ALOGRITHM"<<endl;
for(;;)
{
for(p=pgrp.begin();p!=pgrp.end();p++)
{
if(p->p_stat==TASK_RUNNING)
{
current=p;
break;
}
}
if(current->p_apply==0)
{
cout<<"Enter the apply for the resource\n"<<current->p_pid<<'\t';
cin>>current->p_apply;
while(current->p_apply>(current->p_require-current->p_occupy))
{
cout<<cout<<"Enter the apply for the resource\n"<<current->p_pid<<'\t';
cin>>current->p_apply;
}
}
if(current->p_apply>Resource_left)
{
current->p_stat=TASK_WAITTING;
proc=*current;
pgrp.erase(current);
pgrp.insert(pgrp.end(),proc);
cout<<endl<<proc.p_pid<<"is waitting!"<<endl;
continue;
}
pcb backup(*current);//下面要进行假分配,所以现在要保留一个副本在这里,当假分配不能成真时恢复
length=Resource_left;
cout<<"length"<<length<<endl;
current->p_occupy+=current->p_apply;
cout<<"current->p_occupy"<<current->p_occupy<<endl;
length-=current->p_apply;
if(current->p_occupy==current->p_require)
length+=current->p_require;
current->p_issuc=true;
for(p=pgrp.begin();p!=pgrp.end();p++)
{
if(p->p_stat==TASK_SUCCEED)continue;
if(p==current&&p->p_issuc==true)continue;
if((p->p_require-p->p_occupy)>length)continue;
else
{
p->p_issuc=true;
length+=p->p_occupy;
continue;
}
}//先做标记,然后再查看,看是否有系统资源能满足其需求的进程
for(p=pgrp.begin();p!=pgrp.end();p++)
{
if(p->p_issuc==false&&p->p_stat!=TASK_SUCCEED)break;
}
if(p!=pgrp.end())//如果p不等于pgrp.end()则说明进程没有分配完,则分配不安全,假分配不成功
{
current->p_occupy=backup.p_occupy;
current->p_stat=TASK_WAITTING;
cout<<endl<<current->p_pid<<"is waitting."<<endl;
proc=*current;
pgrp.erase(current);
pgrp.insert(pgrp.end(),proc);
for(p=pgrp.begin();p!=pgrp.end();p++)
p->p_issuc=false;//假分配不成功,刚才在假分配的前提下做的标记(用于检查分配安全的)全部撤销。
cout<<"this way to require will make deadlock!!!!!!"<<endl;
continue;
}
resource.insert(resource.end(),current->p_apply,current->p_pid);
Resource_left-=current->p_apply;
cout<<current->p_pid<<"get "<<current->p_apply<<" resource(s)!"<<endl;
current->p_apply=0;
cout<<current->p_pid<<"current p_occupy---"<<current->p_occupy<<endl;
if(current->p_occupy<current->p_require)
{
proc=*current;
pgrp.erase(current);
pgrp.insert(pgrp.end(),proc);
for(p=pgrp.begin();p!=pgrp.end();p++)
p->p_issuc=false;
continue;
}
current->p_stat=TASK_SUCCEED;
current->p_occupy=0;
cout<<endl<<current->p_pid<<" has finished!!"<<endl;
resource.clear();
Resource_left+=current->p_require;
cout<<"resource_left---"<<Resource_left<<endl;
//看是否有等待的进程
for(p=pgrp.begin();p!=pgrp.end();p++)
{
if(p->p_stat==TASK_WAITTING)
break;
}
if(p==pgrp.end())//若p==pgrp.end()说明没有等待进程
{
for(q=pgrp.begin();q!=pgrp.end();q++)
{
if(q->p_stat==TASK_RUNNING)
break;
}
if(q==pgrp.end())
{
cout<<endl<<"SUCCEED!!"<<endl;
exit(0);
}
else
continue;
}
//有等待的进程,等待的进程为就绪态
p->p_stat=TASK_RUNNING;
proc=*p;
pgrp.erase(p);
pgrp.insert(pgrp.end(),proc);
continue;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int>resource;
vector<pcb>pgrp;
vector<int>::iterator r;
vector<pcb>::iterator p;
int id,qty,occupy;
//int n;
//cout<<"Enter the process numbers:"<<endl;
//cin>>n;
cout<<"Enter the max number for the requested resource: "<<endl;
cout<<"ID\tResource\toccupy"<<endl;
for(int i(1);i<=3;i++)
{
cout<<i<<'\t';
cin>>qty;
cout<<"------------";
cin>>occupy;
if(qty>10)
cout<<"you require is more than 10.it's impossible!";
pgrp.insert(pgrp.begin(),pcb(i,qty,occupy));
Resource_left-=occupy;
cout<<"Resource_left "<<Resource_left<<endl;
}
cout<<"Alogrithm"<<endl
<<"banker"<<endl;
banker(resource,pgrp);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -