⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 banker.cpp

📁 模拟银行家算法
💻 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 + -