#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define Process_Max 100 //进程数量最大值
#define Resource_Max 100 //资源种类最大值
using namespace std;
int Available[Resource_Max]; //系统当前每种资源可分配数
int Max[Process_Max][Resource_Max]; //每个进程对每种资源最大需求
int Allocation[Process_Max][Resource_Max]; //每个进程已分配资源
int Need[Process_Max][Resource_Max]; //每个进程当前需求资源
int Work[Resource_Max]; //工作向量
int Finish[Process_Max];
int List[Process_Max];
int instruct=0;
int Process_Num=0,Resource_Num=0;
int List_Num=0;
void Input_OS()
{
cout << "OS" << endl;
instruct=0;
while(Resource_Num<1){
cout << "输入资源种类 Enter Resource_Num:" << endl;
cin >> Resource_Num;
}
cout << "输入系统当前可利用资源数 Enter Available:" << endl;
for(int i=0;i<Resource_Num;i++)
{
cout << "R" << i << ":";
cin >> Available[i];
}
}
void Input_P()
{
instruct=0;
int a;
cout << "Process" << endl;
while(Process_Num<1){
cout << "输入进程数 Enter Process_Num:" << endl;
cin >> Process_Num;
}
for(int i=0;i<Process_Num;i++)
{
cout << "输入进程 P" << i << "的最大资源需求 Max:" << endl;
for(int j=0;j<Resource_Num;j++)
{
cout << "R" << j << ":" ;
cin >> Max[i][j];
}
cout << endl;
cout << "输入进程 P" << i << "的已分配资源 Allocation:" << endl;
cout << "输入 -1 设置该进程剩余已分配资源为 0 :" << endl;
for(int j=0;j<Resource_Num;j++)
{
cout << "R" << j << ":" ;
cin >> a;
if(a<0){
for(;j<Resource_Num;j++)Allocation[i][j]=0;
break;
}
Allocation[i][j]=a;
}
cout << endl;
for(int j=0;j<Resource_Num;j++)
Need[i][j]=Max[i][j]-Allocation[i][j];
}
}
void Reset_Finish()
{
memset(Finish,0,sizeof(Finish));
memset(Work,0,sizeof(Work));
List_Num=0;
}
int Safe() //安全性算法
{
int flag=0,Count=0;
cout << "Safe" << endl;
Reset_Finish();
cout << " Work Need Allocation Work+Allocation Finish"<<endl;
for(int i=0;i<Resource_Num;i++)Work[i]=Available[i];
while(List_Num<Process_Num)
{
for(int i=0;i<Process_Num;i++)
{
if(!Finish[i])
{
flag = 0;
for(int j=0;j<Resource_Num;j++)
{
if(Need[i][j]>Work[j])
{
flag=1;
break;
}
}
if(!flag)
{
List[List_Num++]=i;
cout << "P" << i <<"|";
for(int j=0;j<Resource_Num;j++)
{
printf("%3d",Work[j]);
Work[j]+=Allocation[i][j];
}
cout << "| ";
for(int j=0;j<Resource_Num;j++)printf("%3d",Need[i][j]);cout << "| ";
for(int j=0;j<Resource_Num;j++)printf("%3d",Allocation[i][j]);cout << "| ";
for(int j=0;j<Resource_Num;j++)printf("%3d",Work[j]);cout << "| ";
Finish[i]=1;
printf("true\n");
}
}
}
Count++;
if(Count>=Process_Num)break;
}
if(List_Num<Process_Num)
{
cout << "No safe List" << endl;
return 0;
}
else {
cout << "Safe list exist" << endl;
return 1;
}
}
void Request() //银行家算法
{
int pro,Request_Num[Resource_Max],inst=0;
int flag=0;
while(!inst)
{
cout << "输入发出请求的进程 Enter Process_Num:" << endl;
cin>> pro;
cout << "输入请求向量 Enter Request_Num:" <<endl;
for(int i=0;i<Resource_Num;i++)
{
cout << "R" << i << ":";
cin>> Request_Num[i];
}
flag=0;
for(int i=0;i<Resource_Num;i++)
{
if(Request_Num[i]>Need[pro][i])
{
cout << "Error:Out of range" << endl;
return;
}
}
for(int i=0;i<Resource_Num;i++)
{
if(Request_Num[i]>Available[i])
{
flag=1;
cout <<"没有足够资源 等待..." << endl;
cout << "No enough resource wait..." << endl;
}
}
if(!flag)
{
for(int i=0;i<Resource_Num;i++)
{
Available[i]-=Request_Num[i];
Allocation[pro][i]+=Request_Num[i];
Need[pro][i]-=Request_Num[i];
}
if(!Safe())
{
for(int i=0;i<Resource_Num;i++)
{
Available[i]+=Request_Num[i];
Allocation[pro][i]-=Request_Num[i];
Need[pro][i]+=Request_Num[i];
}
}
}
cout << "------------------------------" << endl;
cout << "请输入指令:" << endl;
cout << "1.继续输入请求 Request" << endl;
cout << "2.退出到主界面 Return" << endl;
cin >> inst;
if(inst!=1)return;
else inst=0;
}
}
void Banker() //计算T0时刻安全序列
{
instruct=0;
int flag=0,Count=0,inst=0;
cout << "Banker" << endl;
cout << " Work Need Allocation Work+Allocation Finish"<<endl;
for(int i=0;i<Resource_Num;i++)Work[i]=Available[i];
while(List_Num<Process_Num) //银行家算法及安全性算法
{
for(int i=0;i<Process_Num;i++)
{
if(!Finish[i])
{
flag = 0;
for(int j=0;j<Resource_Num;j++)
{
if(Need[i][j]>Work[j])
{
flag=1;
break;
}
}
if(!flag)
{
List[List_Num++]=i;
cout << "P" << i <<"|";
for(int j=0;j<Resource_Num;j++)
{
printf("%3d",Work[j]);
Work[j]+=Allocation[i][j];
}
cout << "| ";
for(int j=0;j<Resource_Num;j++)printf("%3d",Need[i][j]);cout << "| ";
for(int j=0;j<Resource_Num;j++)printf("%3d",Allocation[i][j]);cout << "| ";
for(int j=0;j<Resource_Num;j++)printf("%3d",Work[j]);cout << "| ";
Finish[i]=1;
printf("true\n");
}
}
}
Count++;
if(Count>=Process_Num)break;
}
if(List_Num<Process_Num)
{
cout << "No safe List" << endl;
return;
}
else cout << "T0 safe list" << endl;
Reset_Finish();
cout << "------------------------------" << endl;
cout << "请输入指令:" << endl;
cout << "1.输入请求向量 Request" << endl;
cout << "2.退出到主页面 Return" << endl;
cout << "------------------------------" << endl;
cin >> inst;
if(inst==1)Request();
else inst=0;
}
void Shout() //输出系统与进程信息
{
instruct=0;
cout << "Shout" << endl;
cout << "系统信息 OS:" << endl;
cout << "资源种类 Resource_Num:" << Resource_Num << endl;
cout << "当前可利用资源 Available:" << endl;
for(int i=0;i<Resource_Num;i++)
{
cout << "R" << i << ":" << Available[i] << " ";
}
cout << endl;
cout << "进程信息 Process:" << endl;
cout << "最大需求 Max:" <<endl;
for(int i=0;i<Process_Num;i++)
{
cout << "P" << i <<endl;
for(int j=0;j<Resource_Num;j++)
{
cout << "R" << j << ":" << Max[i][j] << " ";
}
cout <<endl;
}
cout << "已分配资源 Allocation:" << endl;
for (int i=0;i<Process_Num;i++)
{
cout << "p" << i <<endl;
for(int j=0;j<Resource_Num;j++)
{
cout << "R" << j << ":" << Allocation[i][j] << " ";
}
cout <<endl;
}
cout << "需求矩阵 Need:" << endl;
for (int i=0;i<Process_Num;i++)
{
cout << "p" << i <<endl;
for(int j=0;j<Resource_Num;j++)
{
cout << "R" << j << ":" << Need[i][j] << " ";
}
cout <<endl;
}
/*cout << "工作向量 Work:" << endl;
for (int i=0;i<Process_Num;i++)
{
cout << "p" << i <<endl;
for(int j=0;j<Resource_Num;j++)
{
cout << "R" << j << ":" << Work[j] << " ";
}
cout <<endl;
}*/
cout <<endl;
}
void Reset() //重置所有数据
{
cout << "Reset" << endl;
instruct=0;
Process_Num=0;
List_Num=0;
Resource_Num=0;
memset(Allocation,0,sizeof(Allocation));
memset(Available,0,sizeof(Available));
memset(Max,0,sizeof(Max));
memset(Need,0,sizeof(Need));
memset(Work,0,sizeof(Work));
Reset_Finish();
}
int main()
{
Reset();
do{
if(instruct==1)Input_OS();
else if(instruct==2)Input_P();
else if(instruct==3)Banker();
else if(instruct==4)Shout();
else if(instruct==5)Reset();
else if(!instruct);
else cout << "Error" << endl;
cout << "------------------------------" << endl;
cout << "请输入指令:" << endl;
cout << "1.输入系统信息 Input OS information" << endl;
cout << "2.输入进程信息 Input Process information" << endl;
cout << "3.执行银行家算法 Run Banker's" << endl;
cout << "4.查看系统与进程信息 Print all information" << endl;
cout << "5.重置所有信息 Reset" << endl;
cout << "-1.退出 exit" << endl;
cout << "------------------------------" << endl;
}while(scanf("%d",&instruct)!=EOF&&instruct!=-1);
return 0;
}
/*
测试用例:
1
3
3 3 2
2
5
7 5 3
0 1 0
3 2 2
2 0 0
9 0 2
3 0 2
2 2 2
2 1 1
4 3 3
0 0 2
3
1
1
1 0 2
1
4
3 3 0
1
0
0 2 0
1
0
0 1 0
*/
银行家算法C++实现
原文作者:银行家问题
原文地址: https://blog.csdn.net/qq_31431077/article/details/73555149
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qq_31431077/article/details/73555149
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。