变量描述
输入初始化
首先会给我们这样一个表,分别是最大需要资源数量,当前有多少个资源,那么很明显,还需要多少个资源就是前者减去后者。
已知系统总的可用资源为10,5,7,那么我们用这个数减去所有已经分配的资源数,就是目前还有多少是可以利用的,代码实现如下
代码
void init() {
cout << "请输入每个进程的运转所需要的最大资源数量:\n";
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
cin >> Max[i][j];
cout << "请输入现在为每个进程所分配的资源数量:\n";
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
cin >> Allocation[i][j];
//计算每个进程还需要多少资源才能工作 Need=MAX-allocation
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
Need[i][j] = Max[i][j] - Allocation[i][j];
//该进程用于分配给每个进程以达到最大需要资源量进行工作
cout << "请输入每个进程一共拥有的资源数量数量:\n";
for (int j = 1; j < M; j++)
cin >> sum[j];
for (int j = 1; j < M; j++) {
int tmp = 0;
for (int i = 1; i < N; i++) {
tmp += Allocation[i][j];
}
Avaliable[j] = sum[j] - tmp;
}
}
测试数据
MAX
7 5 3
3 2 2
9 0 2
2 2 2
4 3 3
Allocation
0 1 0
2 0 0
3 0 2
2 1 1
0 0 2
10 5 7
输出初始化
代码
void output() {
cout << "\n";
cout << "\t" << "Allocation" << "\t" << "Need" << "\t\t" << "Avaliable" << "\n";
for (int i = 1; i < N; i++) {
cout << "p" << i << "\t";
for (int j = 1; j < M; j++) {
cout << Allocation[i][j] << " ";
}
cout << "\t\t";
for (int j = 1; j < M; j++) {
cout << Need[i][j] << " ";
}
cout << "\t\t";
if (i == 1) {
for (int j = 1; j < M; j++) {
cout << Avaliable[j] << " ";
}
}
cout << "\n";
}
}
运行效果
判断是否合法
判断是否合法的一个条件就是 是否当前有的闲置资源都大于我所需要的资源,如果有一个不满足,那一定是不合法的。
代码
bool check_work(int need[], int work[]) {//检查每个时间的所有进程是否都资源都够
int flag = 1;
for (int i = 1; i < M; i++) {
if (need[i] > work[i]) {//当前需要的资源量与目前还剩余的资源量
flag = 0;//如果需要的大于当前有的,就不够
break;
}
}
return flag;
}
进程分配过程
该部分就是逐个检查当前资源数量是否全部大于所需要的资源数量,如果都大于了,说明是可以分配的,那就分配给他让他做这个进程,注意,当这个进程做完之后,那他还要释放他所持有的所有资源。然后作为下一阶段的闲置资源数量。
代码
其中加入了一些输出,方便观察运行过程。
int check_security() {
memcpy(Work, Avaliable, sizeof Work);//开始的资源数量
cout << "\n当前每种资源还有的数量\n";
for (int i = 1; i < M; i++)
cout << Work[i] << " ";
cout << "\n";
cout << "\n";
cout << "\t" << "Work " << "\t\t" << "Allocation" << "\t" << "Need" << "\t\t" << "Work+Allocation" << "\t"<<"Isfinish" << "\n";
//开始模拟分配过程
for (int k = 1; k < N; k++) {
for (int i = 1; i < N; i++) {//对于每一个时间
if (Finish[i] == 1)//当前进程已经完成了,就不用继续往下看
continue;
if (check_work(Need[i], Work)) {//如果当前有的资源够分配
for (int j = 1; j < M; j++)
Work_allo[j] = Work[j] + Allocation[i][j];//回收资源
Finish[i] = 1;
List[++FinishNum] = i;//安全进程
cout << "p" << i << "\t";
output_work(Need[i],Allocation[i],Finish[i]);
memcpy(Work,Work_allo,sizeof(Work));
break;
}
}
}
int flag = 1;
for (int i = 1; i < N; i++) {
if (!Finish[i]) {
flag = 0;
cout << "p" << i << "\t";
output_work(Need[i], Allocation[i],Finish[i]);
}
}
if (flag) {//安全
cout << "系统处于安全状态!\n安全序列为:\n";
for (int i = 1; i <= FinishNum; i++)
cout << List[i] << " ";
cout << "\n";
}
else {
cout << "系统处于不安全状态!\n";
}
return flag;
}
输出部分
void output_work(int Need[],int Allocation[],int Isfinish) {
for (int j = 1; j < M; j++) {
cout << Work[j] << " ";
}
cout << "\t\t";
for (int j = 1; j < M; j++) {
cout << Allocation[j] << " ";
}
cout << "\t\t";
for (int j = 1; j < M; j++) {
cout << Need[j] << " ";
}
cout << "\t\t";
for (int j = 1; j < M; j++) {
cout << Work_allo[j] << " ";
}
cout << "\t\t";
cout << Isfinish;
cout << "\n";
}
运行效果
新增资源分配
当前要给当前的某个进程再分配一些资源,即当前拥有的资源数量增多,需要的资源数减少,闲置的资源减少,问是否安全。
代码
注意需要先检查两种情况
原来值需要2个资源就够了,但你给他发了3个,他根本用不了这么多,属于资源浪费,这样分配是不合法的。
现在还有2个资源是闲置的,但是你却要3个,很明显我是完全给不起的,不合法。
int banker() {
if (!check_work(requst, Need[give_num])) {//请求资源已经大于了他所需要的资源
cout << "出错!请求资源数量已经大于了所需要的数量\n";
return 1;
}
if (!check_work(requst, Avaliable)) {
cout << "当前可用资源不足,需要等待\n";
return 1;
}
for (int j = 1; j < M; j++) {
Avaliable[j] -= requst[j];//剩余总资源减少
Allocation[give_num][j] += requst[j];
Need[give_num][j] -= requst[j];//给他分配了他就不需要那么多了
}
output();
if (check_security()) {
cout << "安全!将进行资源分配\n";
}
else {//不够了,恢复
for (int j = 1; j < M; j++) {
Avaliable[j] += requst[j];
Allocation[give_num][j] -= requst[j];
Need[give_num][j] += requst[j];
}
}
return 0;
}
效果
完整代码
#include<iostream>
using namespace std;
const int N = 6, M = 4;
int Max[N][M];//表示某个进程对某个资源的最大需求量
int Allocation[N][M];//当前拥有,已分配的资源
int Need[N][M];//还需要多少资源才能达到最大值
int Avaliable[M],sum[M];//把所有的资源分给每个进程之后还剩多少资源可以利用,总共有多少资源
int Finish[N];//判断每个进程是否能完成
int Work[M];//动态的工作过程的资源剩余量
int Work_allo[M];//当当前进程结束之后,回收资源
int List[M];//安全队列
int requst[M];//需求进程的资源数
int FinishNum = 0;//当前有多少个进程合法
int give_num;//需求进程的编号
void init() {
cout << "请输入每个进程的运转所需要的最大资源数量:\n";
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
cin >> Max[i][j];
cout << "请输入现在为每个进程所分配的资源数量:\n";
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
cin >> Allocation[i][j];
//计算每个进程还需要多少资源才能工作 Need=MAX-allocation
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
Need[i][j] = Max[i][j] - Allocation[i][j];
//该进程用于分配给每个进程以达到最大需要资源量进行工作
cout << "请输入每个进程一共拥有的资源数量数量:\n";
for (int j = 1; j < M; j++)
cin >> sum[j];
for (int j = 1; j < M; j++) {
int tmp = 0;
for (int i = 1; i < N; i++) {
tmp += Allocation[i][j];
}
Avaliable[j] = sum[j] - tmp;
}
}
void init_requst() {
cout << "\n请输入要分配资源的编号:\n";
cin >> give_num;
cout << "请输入要分配的资源数量\n";
for (int i = 1; i < M; i++)
cin >> requst[i];
}
void output() {
cout << "\n";
cout << "\t" << "Allocation" << "\t" << "Need" << "\t\t" << "Avaliable" << "\n";
for (int i = 1; i < N; i++) {
cout << "p" << i << "\t";
for (int j = 1; j < M; j++) {
cout << Allocation[i][j] << " ";
}
cout << "\t\t";
for (int j = 1; j < M; j++) {
cout << Need[i][j] << " ";
}
cout << "\t\t";
if (i == 1) {
for (int j = 1; j < M; j++) {
cout << Avaliable[j] << " ";
}
}
cout << "\n";
}
}
void output_work(int Need[],int Allocation[],int Isfinish) {
for (int j = 1; j < M; j++) {
cout << Work[j] << " ";
}
cout << "\t\t";
for (int j = 1; j < M; j++) {
cout << Allocation[j] << " ";
}
cout << "\t\t";
for (int j = 1; j < M; j++) {
cout << Need[j] << " ";
}
cout << "\t\t";
for (int j = 1; j < M; j++) {
cout << Work_allo[j] << " ";
}
cout << "\t\t";
cout << Isfinish;
cout << "\n";
}
bool check_work(int need[], int work[]) {//检查每个时间的所有进程是否都资源都够
int flag = 1;
for (int i = 1; i < M; i++) {
if (need[i] > work[i]) {//当前需要的资源量与目前还剩余的资源量
flag = 0;//如果需要的大于当前有的,就不够
break;
}
}
return flag;
}
int check_security() {
memcpy(Work, Avaliable, sizeof Work);//开始的资源数量
cout << "\n当前每种资源还有的数量\n";
for (int i = 1; i < M; i++)
cout << Work[i] << " ";
cout << "\n";
cout << "\n";
cout << "\t" << "Work " << "\t\t" << "Allocation" << "\t" << "Need" << "\t\t" << "Work+Allocation" << "\t"<<"Isfinish" << "\n";
//开始模拟分配过程
for (int k = 1; k < N; k++) {
for (int i = 1; i < N; i++) {//对于每一个时间
if (Finish[i] == 1)//当前进程已经完成了,就不用继续往下看
continue;
if (check_work(Need[i], Work)) {//如果当前有的资源够分配
for (int j = 1; j < M; j++)
Work_allo[j] = Work[j] + Allocation[i][j];//回收资源
Finish[i] = 1;
List[++FinishNum] = i;//安全进程
cout << "p" << i << "\t";
output_work(Need[i],Allocation[i],Finish[i]);
memcpy(Work,Work_allo,sizeof(Work));
break;
}
}
}
int flag = 1;
for (int i = 1; i < N; i++) {
if (!Finish[i]) {
flag = 0;
cout << "p" << i << "\t";
output_work(Need[i], Allocation[i],Finish[i]);
}
}
if (flag) {//安全
cout << "系统处于安全状态!\n安全序列为:\n";
for (int i = 1; i <= FinishNum; i++)
cout << List[i] << " ";
cout << "\n";
}
else {
cout << "系统处于不安全状态!\n";
}
return flag;
}
int banker() {
if (!check_work(requst, Need[give_num])) {//请求资源已经大于了他所需要的资源
cout << "出错!请求资源数量已经大于了所需要的数量\n";
return 1;
}
if (!check_work(requst, Avaliable)) {
cout << "当前可用资源不足,需要等待\n";
return 1;
}
for (int j = 1; j < M; j++) {
Avaliable[j] -= requst[j];//剩余总资源减少
Allocation[give_num][j] += requst[j];
Need[give_num][j] -= requst[j];//给他分配了他就不需要那么多了
}
output();
if (check_security()) {
cout << "安全!将进行资源分配\n";
}
else {//不够了,恢复
for (int j = 1; j < M; j++) {
Avaliable[j] += requst[j];
Allocation[give_num][j] -= requst[j];
Need[give_num][j] += requst[j];
}
}
return 0;
}
int main() {
init();
output();
cout << "检查t0时刻是否合法\n";
check_security();//检查初始状态是否合法
int flag = 1;
while (flag) {
cout << "\n对请求资源的银行家算法的检查\n";
memset(Finish, 0, sizeof Finish);
FinishNum = 0;
init_requst();
if (banker()) {
cout << "请重新输入\n";
continue;
}
cout << "是否继续检查?(输入0退出)\n";
cin >> flag;
};
return 0;
}
面向对象
#include<iostream>
#include<cstring>
const int N = 6, M = 4;
class BankerAlgorithm {
private:
int Max[N][M]; // 最大需求量
int Allocation[N][M]; // 当前已分配资源
int Need[N][M]; // 还需要的资源
int Avaliable[M], sum[M]; // 可用资源
int Finish[N]; // 判断每个进程是否能完成
int Work[M]; // 动态工作过程的资源剩余量
int Work_allo[M]; // 当前进程结束后回收资源
int List[M]; // 安全队列
int requst[M]; // 请求资源数
int FinishNum; // 合法进程数
int give_num; // 请求资源的进程编号
int Isfinish;
public:
BankerAlgorithm() : FinishNum(0) {
memset(Finish, 0, sizeof(Finish));
}
void init();
void init_requst();
void output();
void output_work(int Need[], int Allocation[], int Isfinish);
bool check_work(int need[], int work[]);
int check_security();
int banker();
};
// 类外方法定义
void BankerAlgorithm::init() {
std::cout << "请输入每个进程的运转所需要的最大资源数量:\n";
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
std::cin >> Max[i][j];
std::cout << "请输入现在为每个进程所分配的资源数量:\n";
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
std::cin >> Allocation[i][j];
//计算每个进程还需要多少资源才能工作 Need=MAX-allocation
for (int i = 1; i < N; i++)
for (int j = 1; j < M; j++)
Need[i][j] = Max[i][j] - Allocation[i][j];
//该进程用于分配给每个进程以达到最大需要资源量进行工作
std::cout << "请输入每个进程一共拥有的资源数量数量:\n";
for (int j = 1; j < M; j++)
std::cin >> sum[j];
for (int j = 1; j < M; j++) {
int tmp = 0;
for (int i = 1; i < N; i++) {
tmp += Allocation[i][j];
}
Avaliable[j] = sum[j] - tmp;
}
}
void BankerAlgorithm::init_requst() {
std::cout << "\n请输入要分配资源的编号:\n";
std::cin >> give_num;
std::cout << "请输入要分配的资源数量\n";
for (int i = 1; i < M; i++)
std::cin >> requst[i];
}
void BankerAlgorithm::output() {
std::cout << "\n";
std::cout << "\t" << "Allocation" << "\t" << "Need" << "\t\t" << "Avaliable" << "\n";
for (int i = 1; i < N; i++) {
std::cout << "p" << i << "\t";
for (int j = 1; j < M; j++) {
std::cout << Allocation[i][j] << " ";
}
std::cout << "\t\t";
for (int j = 1; j < M; j++) {
std::cout << Need[i][j] << " ";
}
std::cout << "\t\t";
if (i == 1) {
for (int j = 1; j < M; j++) {
std::cout << Avaliable[j] << " ";
}
}
std::cout << "\n";
}
}
void BankerAlgorithm::output_work(int Need[], int Allocation[], int Isfinish) {
for (int j = 1; j < M; j++) {
std::cout << Work[j] << " ";
}
std::cout << "\t\t";
for (int j = 1; j < M; j++) {
std::cout << Allocation[j] << " ";
}
std::cout << "\t\t";
for (int j = 1; j < M; j++) {
std::cout << Need[j] << " ";
}
std::cout << "\t\t";
for (int j = 1; j < M; j++) {
std::cout << Work_allo[j] << " ";
}
std::cout << "\t\t";
std::cout << Isfinish;
std::cout << "\n";
}
bool BankerAlgorithm::check_work(int need[], int work[]) {
int flag = 1;
for (int i = 1; i < M; i++) {
if (need[i] > work[i]) {//当前需要的资源量与目前还剩余的资源量
flag = 0;//如果需要的大于当前有的,就不够
break;
}
}
return flag;
}
int BankerAlgorithm::check_security() {
memcpy(Work, Avaliable, sizeof Work);//开始的资源数量
std::cout << "\n当前每种资源还有的数量\n";
for (int i = 1; i < M; i++)
std::cout << Work[i] << " ";
std::cout << "\n";
std::cout << "\n";
std::cout << "\t" << "Work " << "\t\t" << "Allocation" << "\t" << "Need" << "\t\t" << "Work+Allocation" << "\t" << "Isfinish" << "\n";
//开始模拟分配过程
for (int k = 1; k < N; k++) {
for (int i = 1; i < N; i++) {//对于每一个时间
if (Finish[i] == 1)//当前进程已经完成了,就不用继续往下看
continue;
if (check_work(Need[i], Work)) {//如果当前有的资源够分配
for (int j = 1; j < M; j++)
Work_allo[j] = Work[j] + Allocation[i][j];//回收资源
Finish[i] = 1;
List[++FinishNum] = i;//安全进程
std::cout << "p" << i << "\t";
output_work(Need[i], Allocation[i], Finish[i]);
memcpy(Work, Work_allo, sizeof(Work));
break;
}
}
}
int flag = 1;
for (int i = 1; i < N; i++) {
if (!Finish[i]) {
flag = 0;
/* cout << "p" << i << "\t";
output_work(Need[i], Allocation[i],Finish[i]);*/
}
}
if (flag) {//安全
std::cout << "系统处于安全状态!\n安全序列为:\n";
for (int i = 1; i <= FinishNum; i++)
std::cout << List[i] << " ";
std::cout << "\n";
}
else {
std::cout << "系统处于不安全状态!\n";
}
return flag;
}
int BankerAlgorithm::banker() {
memset(Finish, 0, sizeof Finish);
FinishNum = 0;
if (!check_work(requst, Need[give_num])) {//请求资源已经大于了他所需要的资源
std::cout << "出错!请求资源数量已经大于了所需要的数量\n";
return 1;
}
if (!check_work(requst, Avaliable)) {
std::cout << "当前可用资源不足,需要等待\n";
return 1;
}
for (int j = 1; j < M; j++) {
Avaliable[j] -= requst[j];//剩余总资源减少
Allocation[give_num][j] += requst[j];
Need[give_num][j] -= requst[j];//给他分配了他就不需要那么多了
}
output();
if (check_security()) {
std::cout << "安全!将进行资源分配\n";
}
else {//不够了,恢复
for (int j = 1; j < M; j++) {
Avaliable[j] += requst[j];
Allocation[give_num][j] -= requst[j];
Need[give_num][j] += requst[j];
}
}
return 0;
}
// 主函数
int main() {
BankerAlgorithm ba;
ba.init();
ba.output();
std::cout << "检查t0时刻是否合法\\n";
ba.check_security(); // 检查初始状态是否合法
int flag = 1;
while (flag) {
std::cout << "\\n对请求资源的银行家算法的检查\\n";
BankerAlgorithm* b = new BankerAlgorithm(); // 动态分配内存
*b = ba;
b->init_requst();
if (b->banker()) {
std::cout << "请重新输入\\n";
delete b; // 释放内存
continue;
}
std::cout << "是否继续检查?(输入0退出)\\n";
std::cin >> flag;
delete b; // 释放内存
}
return 0;
}