操作系统实验报告:处理机调度问题——死锁的避免:银行家算法模拟(c++实现)

实验目的

模拟银行家算法

实验仪器

64 位操作系统, 基于 x64 的处理器 / SublimeText3

实验框图(流程图)

这里推荐一个免费的画流程图的网站:ProcessOn思维导图流程图-在线画思维导图流程图_在线作图实时协作

实验基本原理(源程序)

#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> Max, Allocation, Need;
vector<int> Available;
int resTypeNum, processNum;
vector<int> safeSequence;
void init() {
	cout << "请输入资源种类数量:\n";
	cin >> resTypeNum;

	Available.resize(resTypeNum);
	cout << "请依次输入每种资源总数量:\n";
	for (int i = 0; i < resTypeNum; i ++) {
		cin >> Available[i];
	}
	cout << "请输入进程数量:\n";
	cin >> processNum;
	vector<int> tmp(resTypeNum);
	Max.resize(processNum, tmp);
	Allocation.resize(processNum, tmp);
	Need.resize(processNum, tmp);

	bool ok = 0;
	do {
		cout << "请输入最大需求矩阵Max[" << processNum << "][" << resTypeNum << "]:\n";
		ok = 1;
		for (int i = 0; i < processNum; i ++) {
			// cout << "请依次输入第" << (i + 1) << "个进程所需要的最大资源数:\n";
			for (int j = 0; j < resTypeNum; j ++) {
				cin >> Max[i][j];
				if (Max[i][j] > Available[j]) ok = false;
			}
		}
		if (!ok) cout << "资源最大需求量大于系统中资源最大量,请重新输入最大需求矩阵\n";
	} while (!ok);

	ok = 0;
	vector<int> temp(resTypeNum);
	do {
		ok = true;
		cout << "请输入分配矩阵Allcation[" << processNum << "][" << resTypeNum << "]\n";
		for (int i = 0; i < processNum; i ++) {
			// cout << "请输入第" << (i + 1) << "个进程已经分配的资源数量:\n";
			for (int j = 0; j < resTypeNum; j ++) {
				cin >> Allocation[i][j];
				
				Need[i][j] = Max[i][j] - Allocation[i][j];
				temp[j] += Allocation[i][j];
				if (Allocation[i][j] > Max[i][j]) ok = false;
			}
		}
		if (!ok) cout << "已分配资源大于系统中资源最大量,请重新输入分配矩阵\n";
	} while (!ok);

	for (int i = 0; i < resTypeNum; i ++) 
		Available[i] -= temp[i];
}

bool check(int i, vector<int> &Work) { // 检查第i个进程能否执行
	for (int j = 0; j < resTypeNum; j ++) {
		if (Need[i][j] > Work[j]) return 0;
	}
	return 1;
}
void work(int i, vector<int> &Work) {
	for (int j = 0; j < resTypeNum; j ++) {
		Work[j] += Allocation[i][j];
	}
}
void safe() {
	vector<int> Work = Available;
	vector<bool> Finish(processNum, 0);
	cout << "\n";
	for (int j = 0; j < processNum; j ++) {
		for (int i = 0; i < processNum; i ++) {
			if (!Finish[i] && check(i, Work)) {
				Finish[i] = 1; 
				safeSequence.push_back(i + 1);
				work(i, Work);
			}
		}
	}
}
void printStation() {
	cout << "|";
	for (int i = 0; i < 8 * 2 + resTypeNum * 2 * 2 + 2 + 10 + max(0, resTypeNum * 2 - 10); i ++)
		cout << "-";
	cout << "|\n";
	cout << "|    \\Resourse\t|Max";
	for (int i = 0; i < resTypeNum * 2 - 3; i ++)
		cout << " ";
	cout << "|Need";
	for (int i = 0; i < resTypeNum * 2 - 4; i ++)
		cout << " ";
	cout << "|Allocation";
	for (int i = 0; i < resTypeNum * 2 - 10; i ++)
		cout << " ";
	cout << "|\n";
	cout << "|";
	for (int i = 0; i < 8 * 2 + resTypeNum * 2 * 2 + 2 + 10 + max(0, resTypeNum * 2 - 10); i ++)
		cout << "-";
	cout << "|\n";
	cout << "|Process\t";
	for (int j = 0; j < 3; j ++) {
		cout << "|";
		for (int i = 0; i < resTypeNum; i ++) 
			cout << (char)('A' + i) << " ";
	}
	for (int i = 0; i < 10 - resTypeNum * 2; i ++)
		cout << " ";
	cout << "|\n|";
	for (int i = 0; i < 8 * 2 + resTypeNum * 2 * 2 + 2 + 10 + max(0, resTypeNum * 2 - 10); i ++)
		cout << "-";
	cout << "|\n";
	for (int i = 0; i < processNum; i ++) {
		cout << "|P" << i + 1 << "\t\t|";

		for (int j = 0; j < resTypeNum; j ++) 
			cout << Max[i][j] << " ";
		cout << "|";
		for (int j = 0; j < resTypeNum; j ++) 
			cout << Need[i][j] << " ";
		cout << "|";
		for (int j = 0; j < resTypeNum; j ++) 
			cout << Allocation[i][j] << " ";
		for (int i = 0; i < 10 - resTypeNum * 2; i ++)
			cout << " ";
		cout << "|\n";
	}
	cout << "|";
	for (int i = 0; i < 8 * 2 + resTypeNum * 2 * 2 + 2 + 10 + max(0, resTypeNum * 2 - 10); i ++)
		cout << "-";
	cout << "|";
}
int main() {
	init();
	printStation();
	safe();
	if (safeSequence.size() == processNum) {
		cout << "存在安全序列:\n";
		for (int i = 0; i < processNum; i ++) {
			cout << safeSequence[i];
			if (i != processNum - 1) cout << "->";
		}
		cout << "\n";
	} else {
		cout << "不存在安全序列\n";
	}
	return 0;
}

实验数据、分析与实验结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值