史上最完整的和课本最接近的《操作系统》第四版银行家算法实验
#include "string.h"
#include "iostream"
using namespace std;
#define FALSE 0
#define TRUE 1
#define W 5
#define R 4
void Menu1() {
cout << " --------------------银行家算法测试----------------------" << endl;
cout << " | 1.输入总进程数M、总资源数N |" << endl;
cout << " | 2.输入最大需求矩阵Max、分配矩阵Allocation |" << endl;
cout << " | 3.输入进程的资源申请 |" << endl;
cout << " | 4.输出系统状态 |" << endl;
cout << " | 5.退出程序 |" << endl;
cout << " |______________________________________________________|" << endl;
}
void Menu() {
cout<<endl<<endl;
cout << " --------------------银行家算法----------------------" << endl;
cout<<endl;
}
void Input1() {
cout<<"输入总进程数M"<<endl;
cin>>M;
cout<<"输入总资源数N"<<endl;
cin>>N;
printf("输入最大需求矩阵Max[%d][%d]:\n",M,N);
for(int i=0; i<M; i++)
for(int j=0; j<N; j++)
cin>>Max[i][j];
printf("输入分配矩阵Allocation[%d][%d]:\n",M,N);
for(int i=0; i<M; i++)
for(int j=0; j<N; j++)
cin>>Allocation[i][j];
}
void Input() {
cout<<"输入总进程数M"<<endl;
cin>>M;
cout<<"输入总资源数N"<<endl;
cin>>N;
}
void PrintData() {
int i,j;
printf(" 各种资源的总数量(AllResource):");
printf(" [");
for (j=0; j<N; j++)
printf(" %d",AllResource[j]);
printf(" ]");
printf("\n\n");
printf(" 最大需求矩阵(Max) \n\n");
printf(" 资源类型");
for(int i=0; i<N; i++) {
printf(" %c",i+65);
}
printf("\n");printf("\n");
for (i=0; i<M; i++) {
printf(" 进程;p%d",i);
for (j=0; j<N; j++)
printf(" %d",Max[i][j]);
printf("\n");
}
printf("\n");
printf(" 分配矩阵(Allocation) \n\n");
printf(" 资源类型");
for(int i=0; i<N; i++) {
printf(" %c",i+65);
}
printf("\n");printf("\n");
for (i=0; i<M; i++) {
printf(" 进程;p%d",i);
for (j=0; j<N; j++)
printf(" %d",Allocation[i][j]);
printf("\n");
}
printf("\n");
printf(" 需求矩阵(Need) \n\n");
printf(" 资源类型");
for(int i=0; i<N; i++) {
printf(" %c",i+65);
}
printf("\n");printf("\n");
for (i=0; i<M; i++) {
printf(" 进程;p%d",i);
for (j=0; j<N; j++)
printf(" %d",Need[i][j]);
printf("\n");
}
printf("\n");
printf(" 系统目前可利用资源向量(Available):");
printf(" [");
for (j=0; j<N; j++)
printf(" %d",Available[j]);
printf(" ]");
printf("\n\n");
}
void Distribution(int k) {
int j;
for (j=0; j<N; j++) {
Available[j]=Available[j]-Request[j];
Allocation[k][j]=Allocation[k][j]+Request[j];
Need[k][j]=Need[k][j]-Request[j];
}
}
void Restore(int k) {
int j;
for (j=0; j<N; j++) {
Available[j]=Available[j]+Request[j];
Allocation[k][j]=Allocation[k][j]-Request[j];
Need[k][j]=Need[k][j]+Request[j];
}
}
int Safety(int s) {
int WORK[W],Finish[W];
int i,j,k=0;
for(i=0; i<M; i++)
Finish[i]=FALSE;
for(j=0; j<N; j++)
WORK[j]=Available[j];
i=s;
do {
if(Finish[i]==FALSE&&Need[i][j]<=WORK[j]) {
WORK[j]=WORK[j]+Allocation[i][j];
Finish[i]=TRUE;
i=0;
} else {
i++;
}
} while(i<M);
for(i=0; i<M; i++) {
if(Finish[i]==FALSE) {
printf("\n =======================\n");
printf(" =======系统不安全========\n");
printf(" =======================\n\n");
return 1;
} else {
printf("\n =======================\n");
printf(" =======系统安全========\n");
printf(" =======================\n\n");
return 0;
}
}
}
void Bank() {
int i=0,j=0;
char flag='Y';
while(flag=='Y'||flag=='y') {
i=-1;
while(i<0||i>=M) {
printf(" 请输入需申请资源的进程号(从P0到开始到P%d)>>P",M-1);
cin>>i;
cout<<endl;
if(i<0||i>=M)
printf(" 输入的进程号不存在,重新输入!\n");
}
printf(" 请输入进程P%d申请的资源数:\n",i);
for (j=0; j<N; j++) {
printf(" 资源%d:",j);
cin>>Request[j];
if(Request[j]>Need[i][j]) {
printf("进程P%d申请的资源数大于进程P%d还需要%d类资源的资源量!\n",i,i,j);
printf("申请不合理,出错Request[%d]>NEED[%d][%d]!请重新选择!\n\n",j,i,j);
flag='N';
break;
} else if(Request[j]>Available[j]) {
printf("进程P%d申请的资源数大于系统可用%d类资源的资源量!\n",i,i,j);
printf("申请不合理,出错Request[j]>AVAILABLE[j]!请等待\n\n");
flag='N';
break;
}
}
if(flag=='Y'||flag=='y') {
Distribution(i);
if(Safety(i)==0) {
PrintData();
} else if(Safety(i)==1) {
Restore(i);
PrintData();
}
}
printf("\n");
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: \n");
}
}
int main() {
Menu();
int i=0,j=0,p;
for (j=0; j<N; j++) {
p=AllResource[j];
for (i=0; i<M; i++) {
p=p-Allocation[i][j];
Available[j]=p;
if(Available[j]<0)
Available[j]=0;
}
}
for (i=0; i<M; i++)
for(j=0; j<N; j++)
Need[i][j]=Max[i][j]-Allocation[i][j];
PrintData();
Bank();
}
下面给出运行截图