#include<iostream>
#include <vector>
using namespace std;
#define N 1000
bool findF(bool *arr,int end,int start) {
for (int i = start; i < end; i++) {
if (!arr[i]) return false;
}
return true;
}
bool Psatis(int k, int available[], int need[][N], int n);
class banker {
public:
const int m;
const int n;
int need[N][N];
int allocation[N][N];
int MAX[N][N];
int available[N];
bool finish[N];
banker(int n,int m) :n(n),m(m) {
//n个资源 m个进程
cout << "输入max序列" << endl;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> MAX[i][j];
cout << "输入allocation序列" << endl;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> allocation[i][j];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
need[i][j] = MAX[i][j] - allocation[i][j];
cout << "输入available序列" << endl;
for (int j = 0; j < n; j++) cin >> available[j];
for (int i = 0; i < N; i++) finish[i] = false;
}
~banker(){}
bool safetytest( vector<int>& trail);
bool bank(int *arr,int k) {
//第k个进程请求arr的数据
int i;
for (i = 0; i < n; i++) if (arr[i] > need[k][i]) return false;
for (i = 0; i < n; i++) if (arr[i] > available[i]) return false;
for (i = 0; i < n; i++) {
available[i]-=arr[i];
need[k][i] -= arr[i];
}
vector<int> trail;
if (safetytest(trail)) {
cout << "能直接分配给进程" << k << "资源" << endl;
vector<int>::iterator st = trail.begin();
cout << "释放顺序为:" << endl;
while (st != trail.end()) {
cout << *st << " ";
++st;
}
}
else {
cout << "分配失败" << endl;
//拷贝操作忽略
}
return true;
}
};
int main() {
banker*b =new banker(4, 4);
int arr[4] = { 1,1,1,1 };
if (b->bank(arr, 2)) cout << "2号进程请求成功" << endl;
return 0;
}
bool Psatis(int k, int available[], int need[][N], int n) {
for (int i = 0; i < n; i++) {
if (need[k][i] > available[i]) return false;
}
return true;
};
bool banker::safetytest(vector<int>& trail)
{
bool flag = true;
while (!findF(finish,n,0)) {
for (int i = 0; i < n; i++) {
if (!finish[i]) {
if (Psatis(i, &available[0],need, n)) {
//如果满足进程资源释放要求
finish[i] = true;
for (int j = 0; j < n; j++) {
need[i][j] = 0;
available[j] += allocation[i][j];
}//for
trail.push_back(i);
flag = false;
}//if
}//if
if (i == n - 1 && flag) return false;
}//for
flag = false;
}//while
return true;
}//safe
简简单单实现一个银行家算法
最新推荐文章于 2024-07-25 23:26:35 发布