实验目的
模拟银行家算法
实验仪器
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;
}