# 银行家算法 C++实现

#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

*/

Reset
------------------------------

1.输入系统信息 Input OS information
2.输入进程信息 Input Process information
3.执行银行家算法 Run Banker's
4.查看系统与进程信息 Print all information
5.重置所有信息 Reset
-1.退出 exit
------------------------------
1
OS

3

R0:3 3 2
R1:R2:------------------------------

1.输入系统信息 Input OS information
2.输入进程信息 Input Process information
3.执行银行家算法 Run Banker's
4.查看系统与进程信息 Print all information
5.重置所有信息 Reset
-1.退出 exit
------------------------------
2
Process

5

R0:7 5 3
R1:R2:

R0:0 1 0
R1:R2:

R0:3 2 2
R1:R2:

R0:2 0 0
R1:R2:

R0:9 0 2
R1:R2:

R0:3 0 2
R1:R2:

R0:2 2 2
R1:R2:

R0:2 1 1
R1:R2:

R0:4 3 3
R1:R2:

R0:0 0 2
R1:R2:
------------------------------

1.输入系统信息 Input OS information
2.输入进程信息 Input Process information
3.执行银行家算法 Run Banker's
4.查看系统与进程信息 Print all information
5.重置所有信息 Reset
-1.退出 exit
------------------------------
3
Banker
Work      Need      Allocation      Work+Allocation      Finish
P1|  3  3  2|     1  2  2|     2  0  0|     5  3  2|   true
P3|  5  3  2|     0  1  1|     2  1  1|     7  4  3|   true
P4|  7  4  3|     4  3  1|     0  0  2|     7  4  5|   true
P0|  7  4  5|     7  4  3|     0  1  0|     7  5  5|   true
P2|  7  5  5|     6  0  0|     3  0  2|    10  5  7|   true
T0 safe list
------------------------------

1.输入请求向量 Request
2.退出到主页面 Return
------------------------------
1

1

R0:1 0 2
R1:R2:Safe
Work      Need      Allocation      Work+Allocation      Finish
P1|  2  3  0|     0  2  0|     3  0  2|     5  3  2|   true
P3|  5  3  2|     0  1  1|     2  1  1|     7  4  3|   true
P4|  7  4  3|     4  3  1|     0  0  2|     7  4  5|   true
P0|  7  4  5|     7  4  3|     0  1  0|     7  5  5|   true
P2|  7  5  5|     6  0  0|     3  0  2|    10  5  7|   true
Safe list exist
------------------------------

1.继续输入请求 Request
2.退出到主界面 Return
1

4

R0:3 3 0
R1:R2:没有足够资源 等待...
No enough resource wait...
------------------------------

1.继续输入请求 Request
2.退出到主界面 Return
1

0

R0:0 2 0
R1:R2:Safe
Work      Need      Allocation      Work+Allocation      Finish
No safe List
------------------------------

1.继续输入请求 Request
2.退出到主界面 Return
1

0

R0:0 1 0
R1:R2:Safe
Work      Need      Allocation      Work+Allocation      Finish
P1|  2  2  0|     0  2  0|     3  0  2|     5  2  2|   true
P3|  5  2  2|     0  1  1|     2  1  1|     7  3  3|   true
P4|  7  3  3|     4  3  1|     0  0  2|     7  3  5|   true
P0|  7  3  5|     7  3  3|     0  2  0|     7  5  5|   true
P2|  7  5  5|     6  0  0|     3  0  2|    10  5  7|   true
Safe list exist
------------------------------

posted @ 2017-06-29 22:37  LowBee  阅读(3201)  评论(0编辑  收藏  举报