银行家算法

原创 2017年01月03日 19:27:37
#include<iostream>
using namespace std;
#include<cstdlib>
#include<list>
#define M 3 //资源数
#define N 5 //进程数

struct DijkstraNode
{
	int num;//进程名
	int max[M];//进程对某类资源的最大需求
	int allocation[M];//已分配的
	int need[M];//尚需求的
	bool finish;//状态
	DijkstraNode()
	{
		num=0;
		finish=false;
		for(size_t i=0;i<M;++i)
		{
			max[i]=0;
			allocation[i]=0;
			need[i]=0;
		}
	}
};
class Dijkstra
{
	typedef DijkstraNode Node;
public:
	int MaxNum[M]; //各类资源的总数
	int Available[M];//可利用的资源
	int Safeylist[N]; //保存安全序列
	int Work[M];
	
	void Init()
	{
		cout<<"各类资源的总数(M=3)"<<endl;
		for(size_t i=0;i<M;++i)
		{
			cin>>MaxNum[i];
		}
		cout<<"进程名(N=5)"<<" "<<"对资源最大需求"<<" "<<"已分配的"<<endl;
		for(size_t i=0;i<N;++i)
		{
			Node n;
			cin>>n.num;
			for(size_t i=0;i<M;++i)
			{
				cin>>n.max [i];
			}
			for(size_t i=0;i<M;++i)
			{
				cin>>n.allocation [i];
			}
			l.push_back (n);
		}
		//求need
		list<Node>::iterator it=l.begin ();
		while(it!=l.end())
		{
			for(size_t i=0;i<M;++i)
			{
				it->need [i]=it->max [i]-it->allocation [i];
			}
			++it;
		}
		//求Available
		cout<<"可利用的资源为:";
		for(size_t i=0;i<M;++i)
		{
			list<Node>::iterator it=l.begin ();
			int num=0;
			while(it!=l.end())
			{
				num+=it->allocation [i];
				++it;
			}
			Available[i]=MaxNum[i]-num;
			cout<<Available[i]<<" ";
		}
		cout<<endl;
	}

  
	void SafeyList()
	{
		memcpy(Work,Available,M*sizeof(Available[0]));
		bool state=_saftlist();
		if(state)
		   _Display();
	}
  
	void Request()
	{
		while(1)
		{
			cout<<"是否请求分配资源:1.是 0.否:"<<endl;
			int state=0;
			cin>>state;
			if(state==1)
			{
				int  n;
				int request[M]={0};
				cout<<"输入要请求资源的进程:"<<endl;
				cin>>n;
				cout<<"输入要请求的资源:"<<endl;
				for(size_t i=0;i<M;++i)
				{
					cin>>request[i];
				}
				//找进程的位置
				list<Node>::iterator it=l.begin ();
				while(it!=l.end())
				{
					if(it->num ==n)
						break;
					++it;
				}
				if(it==l.end())
				{
					cout<<"不是当前的进程"<<endl;
					continue;
				}
				//判断Request,need,Available
				int falg=0;
				for(size_t i=0;i<M;++i)
				{
					if(request[i]>it->need [i])
					{
						falg=1;
						cout<<"请求>需求,不能分配"<<endl;
						break;
					}
					if(request[i]>Available[i])
					{
						falg=1;
						cout<<"请求>可利用,不能分配"<<endl;
						break;
					}
				} 
				if(falg==1)
					continue;
				//备份
				int PrevAvailable[M];
				int PrevItAllocation[M];
				int PrevItNeed[M];
				memcpy(PrevAvailable,Available,M*sizeof(Available[0]));
				memcpy(PrevItAllocation,it->allocation,M*sizeof(PrevItAllocation[0]));
				memcpy(PrevItNeed,it->need,M*sizeof(PrevItNeed[0]));

				//假设可分配,修改值
				for(size_t i=0;i<M;++i)
				{
					Available[i] -= request[i];
					it->need [i] = it->need[i] - request[i];
					it->allocation [i] = it->allocation[i] + request[i];
				}

				//把finish初始化为false
				list<Node>::iterator it1 = l.begin ();
				while(it1!=l.end())
				{
					it1->finish =false;
					++it1;
				}

				//把安全序列清空
				for(size_t i=0;i<N;++i)
				{
					Safeylist[N]=0;
				}

				SafeyList();

				//检测是否存在安全序列
				list<Node>::iterator it2=l.begin ();
				while(it2!=l.end())
				{
					if(it2->finish ==false)
					{
						memcpy(Available,PrevAvailable,M*sizeof(Available[0]));
						memcpy(it->allocation,PrevItAllocation,M*sizeof(PrevItAllocation[0]));
						memcpy(it->need,PrevItNeed,M*sizeof(PrevItNeed[0]));
						cout<<"归位:"<<endl;
						cout<<"Avi"<<" "<<"All"<<" "<<"Need"<<endl;
						for(size_t i=0;i<M;++i)
						{
							cout<<Available[i]<<"   "<<it->allocation[i]<<"   "<<it->need[i]<<endl;
						}
						break;
					}
					++it2;
				}	
			}
			else 
				return;
		}

    }
protected:
	void _Display()
	{
		cout<<"安全序列为:"<<endl;
		for(size_t i=0;i<N;++i)
		{
			cout<<Safeylist[i]<<" ";
		}
		cout<<endl;
	}
	bool _saftlist()
	{
		for(size_t i=0;i<N;++i)
		{
			list<Node>::iterator it=_Find(); 
			if(it==l.end())
			{
				cout<<"找不到满足条件的进程,该序列不安全"<<endl;
				return false;
			}
			it->finish =true;
			Safeylist[i]=it->num ;

			//打印表
			cout<<"进程号"<<" "<<"work"<<"    "<<"need"<<"    "<<"allo"<<"    "
			<<"work+allo"<<"    "<<"finish"<<endl;
			cout<<it->num <<"     ";
			for(size_t j=0;j<M;++j)
			{
				cout<<Work[j]<<" ";
			}
			cout<<"   ";
			for(size_t j=0;j<M;++j)
			{
				cout<<it->need [j]<<" ";
			}
			cout<<"  ";
			for(size_t j=0;j<M;++j)
			{
				cout<<it->allocation [j]<<" ";
			}
			cout<<"  ";
			for(size_t j=0;j<M;++j)
			{
				cout<<Work[j]+it->allocation [j]<<" ";
			}
			cout<<"      ";
			cout<<it->finish <<endl;

			//更新work
			for(size_t j=0;j<M;++j)
			{
				Work[j] = Work[j]+ it->allocation [j];
			}
		
		}
		return true;
	}
	list<Node>::iterator _Find()
	{
		list<Node>::iterator it = l.begin ();
		while(it != l.end())
		{
			if(it->finish ==false)
			{
				size_t j=0;
				for(j=0;j<M;++j)
				{
					if(Work[j]<it->need [j])
						break;
				}
				if(j==M)   //都>=
					return it;
			}
			++it;
		}
		return it;
	}
private:
	list<Node> l;
};
void TestDijkstra()
{
	Dijkstra d;
	d.Init ();
    d.SafeyList ();
	d.Request ();
	
}
int main()
{
	TestDijkstra();
	system("pause");
	return 0;
}

银行家算法的python代码实现,感觉python写算法简直要起飞

上操作系统课,学到死锁,老师讲了银行家算法,正好在图书馆,用了1个多小时写出来,用python写算法发现自己最大的问题是有些语法一直学的不是很深入,查了半天函数的用法啊喂!!!坑爹,具体算法相信大家都...
  • ydjcs567
  • ydjcs567
  • 2016年10月15日 11:31
  • 1539

银行家算法

银行家算法是资源和死锁避免的算法,由艾兹格·迪杰斯特拉(Edsger Dijkstra) 设计的算法用于测已确定总数量的资源分配的安全性,在决定是否该分配应该被允许并进行下去之前,通过“s-state...
  • github_27609763
  • github_27609763
  • 2015年06月05日 00:39
  • 15860

银行家算法

一 概念银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。二 算法流程及数据结...
  • qq_30091945
  • qq_30091945
  • 2017年03月12日 14:26
  • 543

Python3实现银行家算法、安全性算法

Python3实现银行家算法、安全性算法学习期间写的,希望大家一起进步。 Available = [] #各可用资源数目 Used ={} #某进程目前占有各资源数 Need = {}...
  • qq_33035017
  • qq_33035017
  • 2017年11月20日 22:17
  • 193

python模拟银行家算法

前言: 大二第一学期学习了操作系统,期末实验课题要求模拟算法。遂根据自己学习的python写下此文。以此锻炼自己编码能力。虽说是重复造轮子,但还是自己的思路体现 代码及注释如下(银行家算法不再赘述):...
  • qq_33323584
  • qq_33323584
  • 2016年12月22日 15:51
  • 405

银行家算法简述解析

背景简介: 在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,...
  • shouldnotappearcalm
  • shouldnotappearcalm
  • 2017年04月06日 16:22
  • 1278

银行家算法

#include using namespace std; #define n 5 #define m 3 int Allocation[n][m]; //已分配的资源 int Max[n][m];...
  • HLW0522
  • HLW0522
  • 2016年08月08日 19:14
  • 357

banker.py-银行家算法

  • 2013年05月21日 22:23
  • 4KB
  • 下载

银行家算法(Java实现)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理...
  • u014634576
  • u014634576
  • 2016年09月20日 21:52
  • 5441

关于银行家算法的模拟实现

import java.util.Scanner; public class Bank { int Available[];//可利用资源向量 int Max[][];//最大需求矩阵 ...
  • zhang1281480917
  • zhang1281480917
  • 2015年12月13日 10:25
  • 268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:银行家算法
举报原因:
原因补充:

(最多只允许输入30个字)