银行家算法代码_第1页
银行家算法代码_第2页
银行家算法代码_第3页
银行家算法代码_第4页
银行家算法代码_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

银行家算法代码1交互层的实现交互层被直接设计成main函数:intmain(){ _Resourcer; r.init(); _Controlc(r); vector<_Process>p; boolis=false; while(true){ intx; cout<<endl; cout<<"1.创建进程"<<endl; cout<<"2.执行一个进程"<<endl; cout<<"3.退出"<<endl; while(true){/*输入数据合法性检查*/ cin>>x; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(x<=0) { cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } switch(x){ case1:p=create(r,c),is=true;break; case2:if(is)run(p,r,c);else{cout<<"您还未创建进程!"<<endl;}break; case3:exit(0); default:cout<<"输入数据不合法,请重新输入!"<<endl; } //输出各矩阵的状态 out(p,r,c); } return0;}2交互逻辑层的实现1. vector<_Process>create(_Resource&r,_Control&c)(创建进程)的实现。 vector<_Process>create(_Resource&r,_Control&c){ cout<<"请输入需要创建的进程数目:"<<endl; inti; while(true){ /*输入数据合法性检查*/ cin>>i; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } vector<_Process>p; //进程初始化 _Processaaa; for(intj=0;j<i;j++){ p.push_back(aaa); } intx=0; for(vector<_Process>::iteratoriter=p.begin();iter!=p.end();iter++){ cout<<"P"<<x<<"初始化"<<endl; (*iter).init(r); x++; } //添加进程 for(vector<_Process>::size_typeindex=0;index!=p.size();index++){ c.add_Process(p[index],r); } //初始安全态检查 if(c.safeChecked(r)){;} else{ cout<<"系统初始状态不安全!"<<endl; system("pause"); exit(0); } returnp;}2. voidrun(vector<_Process>&p,_Resource&r,_Control&c)(执行进程)的实现 voidrun(vector<_Process>&p,_Resource&r,_Control&c){ inti; cout<<"请输入需要执行的进程号:"<<endl; while(true){ /*输入数据合法性检查*/ cin>>i; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } cout<<"初始化第"<<i<<"个进程的请求向量:"<<endl; //置进程的资源请求向量 for(vector<int>::size_typesz=0;sz!=p[i].Request.size();sz++){ cout<<"请输入请求向量的第"<<sz<<"个值:"<<endl; intk; while(true){/*输入数据合法性检查*/ cin>>k; if(cin.fail()) { cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(k<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } p[i].Request[sz]=k; } c.run_Process(p[i],i,r);}3. voidout(vector<_Process>&p,_Resource&r,_Control&c)的实现。 voidout(vector<_Process>&p,_Resource&r,_Control&c){ //输出Available矩阵 cout<<"Available:"<<endl; for(vector<int>::size_typesz=0;sz!=r.Available.size();sz++){ cout<<r.Available[sz]<<""; } cout<<endl; //输出Max矩阵 cout<<"Max:"<<endl; for(vector<Max_row>::size_typei=0;i<r.Max.size();i++){ for(vector<int>::size_typesz=0;sz<r.Max[i].size();sz++){ cout<<r.Max[i][sz]<<""; } cout<<endl; } //Allocation矩阵 cout<<"Allocation:"<<endl; for(vector<Allocation_row>::size_typei=0;i<r.Allocation.size();i++){ for(vector<int>::size_typesz=0;sz<r.Allocation[i].size();sz++){ cout<<r.Allocation[i][sz]<<""; } cout<<endl; } //输出需求矩阵 cout<<"Need:"<<endl; for(vector<Need_row>::size_typei=0;i<r.Need.size();i++){ for(vector<int>::size_typesz=0;sz<r.Need[i].size();sz++){ cout<<r.Need[i][sz]<<""; } cout<<endl; }}3控制层的实现_Control类的实现。1. voidadd_Process(_Process&p,_Resource&r)方法的实现。 voidadd_Process(_Process&p,_Resource&r){ N++; //进程数加1 //置最大需求矩阵 Max_rowmr; for(vector<int>::iteratoriter=p.Request.begin();iter!=p.Request.end();iter++){ mr.push_back(*iter); } r.Max.push_back(mr); //置分配矩阵 Allocation_rowar; for(inti=0;i<r.getM();i++){ ar.push_back(0); } r.Allocation.push_back(ar); //置需求矩阵 Need_rownr; for(vector<int>::iteratoriter=p.Request.begin();iter!=p.Request.end();iter++){ nr.push_back(*iter); } r.Need.push_back(nr);}2. intrun_Process(_Process&p,intn,_Resource&r)(银行家算法)的设计如图4.6所示。intrun_Process(_Process&p,intn,_Resource&r){ //先判断Request<=Need booltemp_1=true; for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Need[n][index]){ cout<<"请求出错!因为进程所需要的资源数已超过它所宣布的最大值。"<<endl; return1; } } //再判断Request<=Available for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Available[index]) { cout<<"系统中尚无足够的资源,P"<<n<<"必须等待!"<<endl; return2; } } //进行试分配 _Resourcer_1=r; vector<int>::iteratoriter_2=r_1.Available.begin(); vector<int>::iteratoriter_3=r_1.Allocation[n].begin(); vector<int>::iteratoriter_4=r_1.Need[n].begin(); for(vector<int>::iteratoriter_1=p.Request.begin();iter_1!=p.Request.end();iter_1++){ //Available:=Available-Request *iter_2=*iter_2-*iter_1; //Allocation:=Allocation+Request *iter_3=*iter_3+*iter_1; //Need:=Need-Request *iter_4=*iter_4-*iter_1; //迭代器移向下一个元素 iter_2++; iter_3++; iter_4++; } //执行安全性检查 if(safeChecked(r_1)){ r=r_1; //判断此进程是否获得所有资源,若获得,则让其执行完毕后释放 booltemp=true; for(inti=0;i<r.getM();i++) { if(r.Need[n][i]!=0){ temp=false; break; } } if(temp){ //置最大需求矩阵 for(inti=0;i<r.getM();i++){ r.Max[n][i]=0; } //且置可利用资源向量 for(inti=0;i<r.getM();i++){ r.Available[i]+=r.Allocation[n][i]; r.Allocation[n][i]=0; } cout<<"进程P"<<n<<"执行完毕,已释放资源!"<<endl; } return0; } else{ cout<<"系统不处于安全态,P"<<n<<"进程需要等待"<<endl; return3; }}3. boolsafeChecked(_Resource&r_2)(安全性算法)的实现。 bool_Control::safeChecked(_Resource&r_2){ vector<int>Work; //初始化工作向量 for(vector<int>::iteratoriter=r_2.Available.begin();iter!=r_2.Available.end();iter++){ Work.push_back(*iter); } vector<bool>Finish; for(vector<Need_row>::iteratoriter=r_2.Need.begin();iter!=r_2.Need.end();iter++){ Finish.push_back(false); } //找出Finish[i]=false且Need<=Work的项step2: for(vector<int>::size_typei=0;i!=r_2.Need.size();i++){ if(!Finish[i]){ booltemp=false; for(vector<int>::size_typeindex=0;index!=Work.size();index++){ if(r_2.Need[i][index]<=Work[index]){ temp=true; } else{ temp=false; break; } } if(temp){ vector<int>::iteratoriter_2=r_2.Allocation[i].begin(); for(vector<int>::iteratoriter_1=Work.begin();iter_1!=Work.end();iter_1++){ *iter_1=*iter_1+*iter_2; iter_2++; } cout<<"P"<<i<<""; Finish[i]=true; gotostep2; //本来不应该使用goto语句,但由于在此使用goto语句更显方便,故破例用之 } } } //判断所有进程Finish是否都为true,是则返回true,否则返回false for(vector<bool>::size_typeindex=0;index!=Finish.size();index++){ if(Finish[index]); else returnfalse; } returntrue;}3进程层的实现类_Process的设计voidinit(_Resource&r)方法的实现。voidinit(_Resource&r){ for(inti=0;i<r.getM();i++){ inttemp; while(true){ /*输入数据合法性检查*/ cout<<"请输入第"<<i+1<<"类资源的需求量:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } Request.push_back(temp)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论