#include <iostream>
using namespace std;
/*
多资源多请求
*/
#define NUM 1000
/*
* @param int pNum 进程数量
* @param int rNum 资源种类数量
* @param int* t 目前资源数
*
*/
bool safeCheck(int pNum, int rNum, int** need, int** allocation, int t[]) {
int count = 0;
int finish[NUM] = { 0 };
bool isSatisfy;
for (int i = 0; i < pNum; i++) {
for (int j = 0; j < pNum; j++) {
isSatisfy = true;
for (int k = 0; k < rNum; k++) {
if (t[k] < need[j][k] || finish[j] != 0) {
isSatisfy = false;
break;
}
}
//如果available都大于进程目前所需的need,则分配 finish设置成1
if (isSatisfy) {
for (int m = 0; m < rNum; m++) {
t[m] += allocation[j][m];
finish[j] = 1;
}
count++;
}
}
}
if (count == pNum) {
return true;
}
else {
return false;
}
}
int main() {
int** max;//最大需求
int** allocation;//目前已分配
int** need;//仍所需资源
int available[NUM];//目前资源数
int t_available[NUM];//目前资源数备份
max = (int **)malloc(sizeof(int *) * NUM);//分配指针数组
allocation = (int **)malloc(sizeof(int *) * NUM);//分配指针数组
need = (int **)malloc(sizeof(int *) * NUM);//分配指针数组
for (int i = 0; i < NUM; i++)
{
max[i] = (int *)malloc(sizeof(int) * (NUM));//分配每个指针所指向的数组
allocation[i] = (int *)malloc(sizeof(int) * (NUM));//分配每个指针所指向的数组
need[i] = (int *)malloc(sizeof(int) * (NUM));//分配每个指针所指向的数组
}
int pNum;//进程数
cout << "输入进程数量" << endl;
cin >> pNum;
int rNum;//资源种类数量
cout << "输入资源种类数量" << endl;
cin >> rNum;
cout << "输入当前资源数量, " << "分别输入" << rNum << "种资源数量" << endl;
for (int i = 0; i < rNum; i++) {
cin >> available[i];
}
//输入最大需求
for (int i = 0; i < pNum; i++) {
cout << "输入进程P" << i << "的最大需求, " << "分别输入" << rNum << "种资源数量" << endl;
for (int j = 0; j < rNum; j++) {
cin >> max[i][j];
}
}
//输入已分配
for (int i = 0; i < pNum; i++) {
cout << "输入进程P" << i << "的已分配资源, " << "分别输入" << rNum << "种资源数量" << endl;
for (int j = 0; j < rNum; j++) {
cin >> allocation[i][j];
need[i][j] = max[i][j] - allocation[i][j];//设置仍需求
}
}
//多请求
int continueFlag = 1;
do {
//发起资源请求
bool isSafeSema = true;
int request[1000] = { 0 };
int n;//请求资源的进程下标
cout << "请输入发起请求资源的进程" << endl;
cin >> n;
//发出请求量
cout <<"请输入请求量" << "分别输入" << rNum << "种资源数量" << endl;
for (int i = 0; i < rNum; i++) {
cin >> request[i];
}
//检测Request是否小于 Need 和 当前资源
for (int i = 0; i < rNum; i++) {
if (request[i] > need[n][i]) {
cout << "请求大于需求,不合法" << endl;
isSafeSema = false;
cout << "是否继续?输入1继续,0退出" << endl;
cin >> continueFlag;
break;
}
if (request[i] > available[i]) {
cout << "请求大于当前资源,不合法" << endl;
isSafeSema = false;
cout << "是否继续?输入1继续,0退出" << endl;
cin >> continueFlag;
break;
}
}
if (isSafeSema) {
//假定可为进程分配资源 修改available,allocation,need的值
for (int i = 0; i < rNum; i++) {
available[i] -= request[i];
t_available[i] = available[i];//设置备份
allocation[n][i] += request[i];
need[n][i] -= request[i];
}
//进行安全性检测,安全性检测算法
//bool safeCheck(int pNum, int rNum, int** need, int **allocation, int t[]) {
isSafeSema = safeCheck(pNum, rNum, need, allocation, available);
//safeCheck传的是指针,把available的值修改回来
for (int i = 0; i < rNum; i++) {
available[i] = t_available[i];
}
if (isSafeSema) {
cout << "通过安全性检测,资源分配成功" << endl;
}
else {
cout << "未通过安全性检测,不分配资源" << endl;
for (int i = 0; i < rNum; i++) {
available[i] += request[i];
allocation[n][i] -= request[i];
need[n][i] += request[i];
}
}
cout << "是否继续?输入1继续,0退出" << endl;
cin >> continueFlag;
}
} while (continueFlag == 1);
}
银行家算法 - 安全性检测
最新推荐文章于 2024-04-28 03:01:38 发布