#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int TASK_RUNNING=0;
const int TASK_SUCCEED=1;
const int TASK_WAITTING=2;
const int RLength=10;
int Rcs_left =RLength;
ofstream ff("result.txt");
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)
{
p_pid=id;
p_require=require;
p_stat=TASK_RUNNING;
p_occupy=0;
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 rand (vector<int>&resource,vector<pcb>&pgrp);
void banker(vector<int>&resource,vector<pcb>&pgrp);
int main()
{
vector<int>resource;
vector<pcb> pgrp;
cout<<"请输入请求资源的最大申请量:"<<endl;
cout <<"进程号/t 最大申请量"<<endl;
ff<<"请输入请求资源的最大申请量"<<endl;
ff<<"进程号/t 最大申请量"<<endl;
int qty;
for (int i(1);i<=4;i++)
{
do
{
cout<< i<<'/t';
ff<<i<<'/t';
cin>>qty;
ff<<qty<<endl;
}while(qty>Rcs_left||qty< 1);
pgrp. insert(pgrp.begin(),pcb(i,qty));
}
//输入各进程申请的资源总量,以及初始化各个过程;
cout <<"算法选择:"<<'/t'<<"随机算法(R)"<<'/t'<<"银行家算法(B)"<<" (按其他任意键退出)"<<endl;
ff<<"算法选择:"<<'/t'<<"随机算法(R)"<<'/t'<<"银行家算法(B)"<<" (按其他任意键退出)"<<endl;
char choice;
cin>>choice;
ff<<choice<<endl;
if (choice=='R'||choice=='r')
rand(resource,pgrp);
else if (choice=='B'||choice=='b')
banker(resource,pgrp);
else
return (0);
return(1);
}
void rand (vector<int>&resource,vector<pcb>&pgrp)
{
vector<pcb>::iterator p,q;
vector<pcb>::iterator current;
int temp;
cout<<"现在进行的是————随机算法"<<endl;
ff<<"现在进行的是————随机算法"<<endl;
for(; ;)
{
//select a TASK_RUNNIU process,maybe different from the former one;
for(p=pgrp.begin();p!=pgrp.end();p++)
{
if(p->p_stat==TASK_RUNNING)
{
current=p;
break;
}
}
if (current->p_apply==0)
{
cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
ff<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
cin>>temp;
ff<<temp<<endl;
while (temp>p->p_require-p->p_occupy)
{
cout<<"申请量超过实际需求量!"<<endl;
cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
ff<<"申请量超过实际需求量!"<<endl;
ff<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
cin>>temp;
ff<<temp<<endl;
}
p->p_apply=temp;
}
// input the apply for the current process;
if (current->p_apply>Rcs_left)
{ //has problem
//apply too much ,please wait……
current->p_stat=TASK_WAITTING;
cout<<endl<<"资源不足,进程"<<current->p_pid<<" 等待分配/n";
ff<<endl<<"资源不足,进程"<<current->p_pid<<" 等待分配/n";
for(p=pgrp.begin();p!=pgrp.end();p++)
{
if (p->p_stat==TASK_RUNNING) break;
}
if (p==pgrp.end())
{ cout<<"死锁!!!"<<endl;
ff<<"死锁!!!"<<endl;
exit(1);
}
continue;
}
resource.insert(resource.begin(),current->p_apply,current->p_pid);
cout<<temp<<"个资源分配给进程"<<p->p_pid<<endl;
cout<<endl;
ff<<temp<<"个将资源分配给进程"<<p->p_pid<<endl;
ff<<endl;
Rcs_left-=current->p_apply;
current->p_occupy+=current-> p_apply;
current->p_apply=0;
if (current->p_occupy<current->p_require)
{
pcb proc(*current);
pgrp.erase(current);
pgrp.insert(pgrp.end(),proc);
//current->p_apply=0;
//delete current and insert into the end
continue;//go on and should select another process
}
// succeed
cout<<endl<<"进程/t"<<p->p_pid<<"/t成功完成分配!!"<<endl;
ff<<endl<<"进程/t"<<p->p_pid<<"/t成功完成分配!!"<<endl;
Rcs_left+=current->p_occupy;
resource.clear();
current->p_stat=TASK_SUCCEED;
//current->p_apply=0;
for (p=pgrp.begin();p!=pgrp.end();p++)
{
if (p->p_stat==TASK_WAITTING)
break;
}
if (p==pgrp.end())
{
for (q=pgrp.begin();q!=pgrp.end();q++)
{
if (q->p_stat==TASK_RUNNING)
break;
}
if (q==pgrp.end())
{
cout<<"该进程分配成功完成!!"<<endl;
ff<<"该进程分配成功完成!!"<<endl;
exit(0);
}
else continue;
//There is a process in the queue;
}
for (p=pgrp.begin();p!=pgrp.end();p++)
{
if (p->p_stat==TASK_WAITTING&&Rcs_left>=p->p_apply)
break;
}
if (p!=pgrp.end())
{
p->p_stat=TASK_RUNNING;
pcb proc(*p);
pgrp.erase(p);
pgrp.insert(pgrp.end(),proc);
continue;
}
else
{
cout<<"可能出现死锁!!!"<<endl;
ff<<"可能出现死锁!!!"<<endl;
exit(1);
}
}
}
void banker(vector<int>&resource,vector<pcb>&pgrp)
{
vector<pcb>::iterator p;
vector<pcb>::iterator current ,q;
pcb proc(0,0);
int length;
cout<<"现在进行————银行家算法"<<endl;
ff<<"现在进行————银行家算法"<<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<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
ff<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
cin>>current->p_apply;
ff<<current->p_apply<<endl;
while (current->p_apply>current->p_require-current->p_occupy)
{
cout<<cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
ff<<cout<<"请输入该进程的当前申请量/n"<<current->p_pid<<'/t';
cin>>current->p_apply;
ff<<current->p_apply<<endl;
}
}
if (current->p_apply>Rcs_left)
{
current->p_stat=TASK_WAITTING;
proc=*current;
pgrp.erase(current);
pgrp.insert(pgrp.end(),proc);
cout<<endl<<"进程"<<p->p_pid<<"进入等待状态!"<<endl;
ff<<endl<<"进程"<<p->p_pid<<"进入等待状态!"<<endl;
continue;
}
pcb backup(*current);
length=Rcs_left;
current->p_occupy+=current->p_apply;
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())
{
current->p_occupy=backup.p_occupy;
current->p_stat=TASK_WAITTING;
cout<<endl<<"让进程"<<current->p_pid<<"等待分配."<<endl;
ff<<endl<<"让进程"<<current->p_pid<<"等待分配."<<endl;
proc=*current;
pgrp.erase(current);
pgrp.insert(pgrp.end(),proc);
for (p=pgrp.begin();p!=pgrp.end();p++)
p->p_issuc=false;
continue;
}
resource.insert(resource.end(),current->p_apply,current->p_pid);
Rcs_left-=current->p_apply;
cout<<endl<<"进程"<<current->p_pid<<"获准得到请求的"<<current->p_apply<<"个资源"<<endl;
ff<<endl<<"进程"<<current->p_pid<<"获准得到请求的"<<current->p_apply<<"个资源"<<endl;
current->p_apply=0;
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<<"进程"<<current->p_pid<<"已经运行结束!!!"<<endl;
ff<<"进程"<<current->p_pid<<"已经运行结束!!!"<<endl;
resource.clear();
Rcs_left+=current->p_require;
for(p=pgrp.begin();p!=pgrp.end();p++)
{
if (p->p_stat==TASK_WAITTING)
break;
}
if (p==pgrp.end())
{
for(q=pgrp.begin();q!=pgrp.end();q++)
{
if (q->p_stat==TASK_RUNNING)
break;
}
if (q==pgrp.end())
{
cout<<endl<<"该进程分配成功完成!!"<<endl;
ff<<endl<<"该进程分配成功完成!!"<<endl;
exit(0);
}
else
continue;
}
proc=*p;
pgrp.erase(p);
pgrp.insert(pgrp.end(),proc);
p->p_stat=TASK_RUNNING;
continue;
}
}