银行家算法

银行家算法模拟实现
直接上代码吧!!!
bank.h:

#include<iostream>
using namespace std;
#include<vector>

//预定资源数组
#define PRO 50//最大进程数
#define MAXAVSUR 10//最大资源种类数
int AVAILABLE[MAXAVSUR];//现有可使用资源数
int ALLOCATION[PRO][MAXAVSUR];//已分配资源数
int NEED[PRO][MAXAVSUR];//各个进程现需资源数
int REQUESET[MAXAVSUR];//银行家算法中请求申请资源的数目

//初始化方式以一个进程为单位,现将本进程的ALLOCATION 输完紧接着输入 NEED
void init(int pro, int sur)
{
	cout << "请按照格式给出初始化数据!!" << endl;
	cout << "格式:ALLOCATION [SUR1] [SUR2] .... | NEED [SUR1] [SUR2] ....\n";
	for (int i = 0; i<pro; i++)
	{
		for (int j = 0; j<sur; j++)
		{
			cin >> ALLOCATION[i][j];
		}
		for (int j = 0; j<sur; j++)
		{
			cin >> NEED[i][j];
		}
	}
	cout << "格式:AVAILABLE [SUR1] [SUR1]...\n";
	for (int j = 0; j<sur; j++)
	{
		cin >> AVAILABLE[j];
	}
	
	cout << "初始化工作完毕!!" << endl;
	cout << "------------------------------------------------------" << endl;
	cout << "AVAILABLE" << endl;
	for (int j = 0; j<sur; j++)
	{
		cout << AVAILABLE[j]<<" ";
	}
	cout << endl;
	cout << "ALLOCATION\t\t\t  NEED\t\t\t " << endl;
	for (int i = 0; i<pro; i++)
	{
		for (int j = 0; j<sur; j++)
		{
			cout << ALLOCATION[i][j] << "\t";
		}
		for (int j = 0; j<sur; j++)
		{
			cout << NEED[i][j] << "\t";
		}
		cout << endl;
	}
}
//安全性算法
bool safe(int* list, int pro, int sur, int req)
{
	//work数组定义
	int work[MAXAVSUR];
	for (int i = 0; i<sur; i++)
	{
		work[i] = AVAILABLE[i];
	}
	//标记当前安全进程
	bool finish[PRO] = { false };
	int l = 0;//一次找一个,找pro次
	int j = 0;//控制每个进程的资源类型
	bool flag = false;
	//每一趟循环必须寻找到一个或者多个,用flag表示寻到一个或者多个。
	//当flag为假时,表明已经死锁,直接退出,返回flag表示不安全
	//当l = pro时表示安全序列可以找到,为安全,返回flag。
	while (l < pro)
	{
		flag = false;
		for (int i = 0; i < pro; i++)
		{
			if (finish[i] == true)
				continue;
			for (j = 0; j < sur; j++)
			{
				if (NEED[i][j] > work[j])
					break;
			}
			if (j == sur)
			{
				flag = true;
				finish[i] = true;
				for (int k = 0; k < sur; k++)
				{
					work[k] += ALLOCATION[i][k];
				}
				list[l++] = i;
			}
			else
				continue;
		}
		if (flag == false)
			return flag;
	}
	return flag;
	
}
void bank()
{
	int n, m, pro1;//进程数,资源种类,请求分配的进程
	//初始化工作
	printf("请输入进程个数[n]: ");
	cin >> n;
	printf("请输入资源种类数:[m]: ");
	cin >> m;
	init(n, m);
	//银行家算法
	
	
	bool avalid = false;//检测所要求申请资源进程的合法性
	while (1)
	{
		cout << "请输入想要为之申请资源的进程编号,编号在0~n范围之内[pro]: ";
		cin >> pro1;
		bool safe_sur = false;
		while (avalid == false)
		{
			if (pro1 > n)
			{
				cout << "输入的进程不存在,请重新输入:[pro] ";
				cin >> pro1;
			}
			else
				avalid = true;
		}
		//用户为申请进程初始化申请资源
		int request[MAXAVSUR];
		cout << "输入所要分配的各个资源的数目" << endl;
		while (1)
		{
			for (int j = 0; j < m; j++)
			{
				cin >> request[j];
			}
			int i = 0;
			for (i = 0; i < m; i++)
			{
				if (request[i]>AVAILABLE[i] || request[i]>NEED[pro1][i])
				{
					cout << "request > AVAILABLE or request>NEED请重新输入!!" << endl;
					break;
				}
			}
			if (i == m)
			{
				safe_sur = true;
			}
			break;
		}
		if (safe_sur == false)
		{
			cout << "不予以分配!!" << endl;
			continue;
		}
		//预分配结果 
		for (int j = 0; j < m; j++)
		{
			AVAILABLE[j] -= request[j];
			NEED[pro1][j] -= request[j];
			ALLOCATION[pro1][j] += request[j];
		}
		//安全性算检测
		//1.如果安全输出安全序列,并进行是否能进行资源回收工作
		//2.否则直接退出
		int list[PRO] = { 0 };
		if (safe(list, n, m, pro1))
		{
			cout << "------------------------------------------------------" << endl;
			cout << "AVAILABLE:" << endl;
			
			int s;
			//以下循环为判断是否需要回收资源,flag为表识
			bool flag = false;
			for (s = 0; s < m; s++)
			{
				if (NEED[pro1][s] != 0)
					break;
			}
			if (s == m)
				flag = true;
			//在打印目前所剩资源之前得进行回收资源操作
			for (int j = 0; j<m; j++)
			{
				//1.判断是否有资源可回收,判断flag标识
				if (flag)
				{
					AVAILABLE[j] += ALLOCATION[pro1][j];
					ALLOCATION[pro1][j] = 0;
				}
				cout << AVAILABLE[j]<< " ";
			}
			cout << endl;
			cout << "安全序列为:" << endl;
			for (int i = 0; i < n; i++)
			{
				cout << list[i] << " ";
			}
			cout << endl;
			cout << "ALLOCATION\t\t\t  NEED\t\t\t " << endl;
			for (int i = 0; i<n; i++)
			{
				for (int j = 0; j<m; j++)
				{
					cout << ALLOCATION[i][j] << "\t";
				}
				for (int j = 0; j<m; j++)
				{
					cout << NEED[i][j] << "\t";
				}
				cout << endl;
			}
			cout << endl;
		}
		else
		{
			cout << "------------------------------------------------------" << endl;
			
			cout << "不可给予分配,不存在安全序列!" << endl;
			//不予以分配是将预分配的资源换回
			cout << "AVAILABLE" << endl;
			for (int j = 0; j < m; j++)
			{
				AVAILABLE[j] += request[j];
				NEED[pro1][j] += request[j];
				ALLOCATION[pro1][j] -= request[j];
			}

			for (int j = 0; j<m; j++)
			{
				cout << AVAILABLE[j] << " ";
			}
			cout << endl;
		}
		cout << "继续分配选择y/n?" << endl;
		char ch;
		cin >> ch;
		if (ch == 'y')
			continue;
		else
			break;
	}
}

void testbank()
{
	bank();
}

main.cpp:

#include"bank.h"

int main()
{
	testbank();
	return 0;
}

测试用例即效果展示:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值