- 题目:
- 代码:
#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;
}
}
}
}