银行家算法C++实现
来源:互联网 发布:网络黑钱提现 编辑:程序博客网 时间:2024/06/05 18:34
#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;}/*测试用例:133 3 2257 5 30 1 03 2 22 0 09 0 23 0 22 2 22 1 14 3 30 0 23111 0 2143 3 0100 2 0100 1 0*/
阅读全文
0 0
- C语言实现银行家算法
- 银行家算法的C实现
- C语言实现银行家算法
- 操作系统c实现银行家算法
- [C#]银行家算法的实现
- 银行家算法C,Java实现
- C语言实现操作系统银行家算法
- C语言实现 操作系统 银行家算法
- 银行家算法的C语言实现
- C实现银行家算法(避免死锁)
- 银行家算法c模拟
- c 银行家算法
- c语言银行家算法
- C ++ 银行家算法
- 银行家算法 C语言
- 银行家算法(C++)
- 银行家算法实现
- 银行家算法实现
- 图
- [AVC(H.264)] x264 ratecontrol小记
- 性能测试初探---接口性能测试
- SpringBoot系列之四全局配置
- POJ 1849 Two 笔记
- 银行家算法C++实现
- 计算几何练习3
- 进一步理解!linux下bus,device,driver三者关系
- 组成原理模型机
- L1-003. 个位数统计
- 给Dragonboard 410c开发板接上触摸屏显示器
- 2017 ICPC-ACM全国邀请赛(陕西) 随笔
- 1、Java内存区域
- int main(int argc,char* argv[])详解