银行家算法及安全算法

来源:四六级 发布时间:2020-10-17 点击:

 实验名称:银行家算法 实验时间:

 2015.04.20 实验目的:

 1:利用银行家算法避免死锁

 2:掌握银行家算法的基本原理 3:掌握安全算法的基本原理 实验仪器:

 PC vc6.0 实验原理:

 1:银行家算法的基本原理 ■锲行家算法:进程 Pj 发出资源请求 Requests

 2:安全算法的基本原理

 ■安全性算法 Work: -Available; Finish [ i …“ii); 刁 — 我一满足下刘条件的进覆 t rinhh[ i ]^fal*c 且 Ncc ( ( l L

 <VX 7 ot k 找型 1 — Work:=Work+AllocatioHj; Finish [ i ]|:=true; 实验内容:请使用银行家算法来避免死锁的产生 程序代码:(供参考)

 #i nclude<iostream.h> #i ncludevstri ng.h> #in clude<stdio.h> #defi ne False 0 #defi ne True 1 Finish( > J^true?

 2:安全算法的基本原理

 int Max[100][100]={0};〃各进程所需各类资源的最大需求 int Avaliable[100]={0};〃 系统可用资源

  char name[100]={0};// 资源的名称 int Allocation[100][100]={0};// 系统已分配资源 int Need[100][100]={0};// 还需要资源 int Request[100]={0};// 请求资源向量 int temp[100]={0};// 存放安全序列 int Work[100]={0};// 存放系统可提供资源 int M=100;// 作业的最大数为 100 int N=100;// 资源的最大数为 100 void showdata()〃显示资源矩阵 {

 int i,j; cout«"系统目前可用的资源[Avaliable]:"«endl; for(i=0;i<N;i++) cout<<name[i]<<" "; cout<<endl; for (j=0;j<N;j++) cout<<Avaliable[j]<<" ";// 输出分配资源 cout<<endl; cout<<" Max Allocation coutvv"进程名 "; for(j=0;j<3;j++){ Need"<<endl;

  for(i=0;i<N;i++) cout<<name[i]<<" "; cout<<" "; }

 cout<<endl; for(i=0;i<M;i++){ cout<<" "<<i<<" " for(j=0;j<N;j++) cout<<Max[i][j]<<" "; cout<<" "; for(j=0;j<N;j++) cout<<Allocation[i][j]<<" "; cout<<" "; for(j=0;j<N;j++) cout<<Need[i][j]<<" "; cout<<endl; }

 }

 int cha ngdata(i nt i)〃进行资源分配 {

 int j; for (j=0;j<M;j++) { Avaliable[j]=Avaliable[j]-Request[j]; Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]-Request[j];

  }

 return 1; }

 int safe()〃安全性算法 {

 int i,k=0,m,apply,Finish[100]={0}; int j; int flag=0; Work[0]=Avaliable[0]; Work[1]=Avaliable[1]; Work[2]=Avaliable[2]; for(i=0;i<M;i++){ apply=0; for(j=0;j<N;j++){ if (Finish[i]==False&&Need[i][j]<=Work[j]){ apply++; if(apply==N){ for(m=0;m<N;m++) Work[m]=Work[m]+Allocation[i][m];// 变分配数

  Finish[i]=True; temp[k]=i; i=-1; k++; flag++; }

 }

 }

 }

 for(i=0;i<M;i++){ if(Finish[i]==False){ coutvv"系统不安全"<<end ; //不成功系统不安全 return -1; }

 }

 coutvv"系统是安全的!"<<endl;〃如果安全,输出成功 coutvv"分配的序列 :

 " ; for(i=0;ivM;i++){// 输出运行进程数组 coutvvtemp[i]; if(ivM-1) coutvv"->"; coutvvendl; return 0;

  }

 void share()//利用银行家算法对申请资源对进行判定 {

 char ch; int i=0,j=0; ch="y"; coutvv"请输入要求分配的资源进程号 ( 0-"v<M-1vv"):"; cin >>i;〃输入须申请的资源号 coutvv"请输入进程"vvivv"申请的资源:"<<endl; for(j=0;j<N;j++) {

 coutvvname[j]vv":"; ci n»Request[j];〃输入需要申请的资源 }

 for (j=0;jvN;j++){ if(Request[j]>Need[i][j])// 判断申请是否大于需求,若大于则出 错 {

 coutvv"进程"vvivv"申请的资源大于它需要的资源"; coutvv" 分配不合理,不予分配!

 "vvendl; ch="n"; break;

  else { if(Request[j]>Avaliable[j])// 判断申请是否大于当前资 源,若大于则 { // 出错 coutvv"进程"vvivv"申请的资源大于系统现在可利用的资源" cout<<" 分配出错,不予分配 !"<<endl; ch="n"; break; }

 }

 }

 if(ch=="y") { cha ngdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 }

 }

 void addresources(){//添 加资源 int n,flag; coutvv"请输入需要添加资源种类的数量 :

 " ; cin>>n;

  flag=N; N=N+n; for(int i=0;i<n;i++){ coutvv"名称:" ; cin>>name[flag]; coutvv"数量:"; cin>>Avaliable[flag++] ; }

 showdata(); safe(); }

 void delresources(){〃 删除资源 char ming; int i,flag=1; coutvv"请输入需要删除的资源名称: do{ cin>>ming; for(i=0;ivN;i++) if(ming==name[i]){ flag=0; break; if(i==N)

  cout<<" 该资源名称不存在,请重新输入:

 " } while(flag); for(int j=i;j<N-1;j++) {

 name[j]=name[j+1]; Avaliable[j]=Avaliable[j+1]; }

 N=N-1; showdata(); safe(); }

 void cha ngeresources(){/修改资源函数 cout«"系统目前可用的资源[Avaliable]:"«endl; for(int i=0;i<N;i++) cout<<name[i]<<":"<<Avaliable[i]<<endl; cout«"输入系统可用资源[Avaliable]:"«endl; cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2]; coutvv"经修改后的系统可用资源为"<<endl; for (int k=0;k<N;k++) cout<<name[k]<<":"<<Avaliable[k]<<endl; showdata(); safe(); }

 void addprocess(){//添加作业

  int flag=M; M=M+1; coutvv"请输入该作业的最打需求量[Max]"«endl; for(int i=0;i<N;i++){ cout<<name[i]<<":"; cin>>Max[flag][i]; Need[flag][i]=Max[flag][i]-Allocation[flag][i]; }

 showdata(); safe(); }

 int mai n()〃 主函数 {

 int i,j,number,choice,m,n,flag; char ming;<<endl; coutvv"请首先输入系统可供资源种类的数量 cin>>n; N=n; for(i=0;i<n;i++) {

 coutvv"资源"<<i+1<<"的名称:"; cin>>ming; name[i]=ming; coutvv"资源的数量:";

 ***************** 资源管理系统的设计与实现

 cin>>number; Avaliable[i]=number; }

 coutvvendl; coutvv"请输入作业的数量:" cin>>m; M=m; coutvv" 请 输 入 各 进 程 的 最 大 需 求 量 ("vvmvv"*"vvnvv" 矩 阵)[Max]:"vve ndl; for(i=0;ivm;i++) for(j=0;jvn;j++)

  cin>>Max[i][j]; do{ flag=0; cout<<" 请输入各进程已经申请的资源量 ("<<m<<"*"<<n<<" 矩 阵)[Allocati on ]:"<<e ndl; for(i=0;i<m;i++) for(j=0;j<n;j++){ cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) flag=1; Need[i][j]=Max[i][j]-Allocation[i][j]; }

 if(flag) cout< < "申请的资源大于最大需求量,请重新输入 !\n"; } while(flag); showdata();〃显示各种资源 safe();〃用银行家算法判定系统是否安全 while(choice) {

 cout<<"************** 银 行 家 算 法 演 示

  coutvv" 1:增加资源 "vvendl; coutvv" 2:删除资源 "vvendl; coutvv" 3:修改资源 "vvendl; coutvv" 4:分配资源 "vvendl; coutvv" 5:增加作业 "vvendl; coutvv" 0:离开 "vvendl;

 cout<<" coutvv"请选择功能号: cin>>choice; switch(choice) {

 case 1: addresources();break; case 2: delresources();break; case 3: changeresources();break; case 4: share();break; case 5: addprocess();break; case 0: choice=0;break; default: coutvv"请正确选择功能号 ( 0-5)!"<<endl;break; return 1; }

 <<endl;

推荐访问:算法 银行家
上一篇:中科院老年人大学成都分校2015年秋季招生简章
下一篇:四川政府采购四川省宜宾市长宁县公安局标准化物证保管室设备项目2次公开招标采购公告6615

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有