【操作系统原理】银行家算法

  1. 题目:
    在这里插入图片描述
  2. 代码:
#include <iostream> 
#include <stack>
using namespace std;
#define n 5   //进程个数
#define m 3   //资源种类

int sourced[n][m] = {2,1,2,4,0,2,3,0,5,2,0,4,3,1,4};   //已占资源数组
int need[n][m] = {3,4,7,1,3,4,0,0,3,2,2,1,1,1,0};   //最大资源需求量
int available[m] = { 2,3,3 };     //目前可利用资源
bool finish[n] = {false,false, false, false, false};
stack<int>q;   //创建一个栈记录安全序列的序列号

bool securitylist(int available[m], int need[n][m], int sourced[n][m], bool finish[m]) {     //判断是否存在安全序列并输出该序列
	for (int j = 0; j < 6; j++) {
		for (int i = 0; i < n; i++) {
			if (finish[i] == false && available[0] >= need[i][0] && available[1] >= need[i][1] && available[2] >= need[i][2]) {   //如果可利用的资源数可以满足一个进程的需求
				available[0] = available[0] + sourced[i][0];
				available[1] = available[1] + sourced[i][1];
				available[2] = available[2] + sourced[i][2];    //满足需求后归还资源,更新available数组
				finish[i] = true;
				q.push(i);
			}
		}
	}
	int num = 0;
	for (int i = 0; i < n; i++) {
		if (finish[i] == true) num++;
	}
	if (num == n ) {
		cout << "该状态是安全的 且安全序列为(从后往前输出):";
		for (int i = 0; i < n; i++) {
		if (!q.empty()){
			cout << q.top()+1 << "\t";
			q.pop();
		}
	}
		return true;
	}
	else {
		cout << "该状态不安全!";
		return false;
	}
}

void YN(int available[m], int need[n][m], int source[n][m]) {
	int k;
	int temp[m];   //进程请求的资源数
	cout << "请输入请求资源的进程序号:";
	cin >> k;
	cout << "请输入该进程请求的资源数:";
	for (int i = 0; i < 3; i++) { cin >> temp[i]; }
	if (!(temp[0] <= need[k - 1][0] && temp[1] <= need[k - 1][1] && temp[2] <= need[k - 1][2])) {
		cout << "资源请求无法被满足!";
	}
	else if (!(available[0] >= temp[0] && available[1] >= temp[1] && available[2] >= temp[2])) {
		cout << "发生阻塞!";
	}
	else {
		cout << "进程资源请求成功!" << endl;
		for (int i = 0; i < 3; i++) {
			available[i] = available[i] - temp[i];    //试探性分配
			source[k - 1][i] = source[k - 1][i] + temp[i];
			need[k - 1][i] = need[k - 1][i] - temp[i];
		}
		//对新的状态进行安全判断,若不安全,则取消试探性分配
		if (securitylist) cout << "新状态安全,可以分配!";
		else {
			for (int i = 0; i < 3; i++) {
				available[i] = available[i] + temp[i];    //取消试探性分配
				source[k - 1][i] = source[k - 1][i] - temp[i];
				need[k - 1][i] = need[k - 1][i] + temp[i];
			}
		}
	}
}

int main() {
	cout << "--------------------------------------------" << endl;
	cout << "----------------银行家算法------------------" << endl;
	cout << " ----------------------------------------- " << endl;
	cout << "|   该算法具有如下功能:                   |" << endl;
	cout << "|   1.初始状态的安全性并输出安全序列      |" << endl;
	cout << "|   2.指定进程请求资源的合法性            |" << endl;
	cout << " ----------------------------------------- " << endl;
	while (1){
		cout << "请选择您需要的功能(输入对应序号):";
	int a;
	cin >> a;
	switch (a) {
	case 1: {
		securitylist(available, need, sourced, finish);
		cout << endl;
		break;
	}
	case 2: {
		YN(available, need, sourced);
		cout << endl;
		break;
	}
	}
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值