操作系统实验之银行家算法

操作系统实验之银行家算法

  操作系统实验中的银行家算法复杂难懂,那么我们究竟要怎么去理解呢?下面由小编为大家整理了操作系统实验银行家算法的相关知识,希望大家喜欢!

  操作系统实验——银行家算法

  一、实验目的

  1、 理解银行家算法。

  2、 掌握进程安全性检查方法与资源分配的方法。

  二、实验内容与基本要求

  编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。

进程已占资源最大需求数
资源种类A B C DA B C D
P00 0 1 20 0 1 2
P11 0 0 01 7 5 0
P21 3 5 42 3 5 6
P30 6 3 20 6 5 2
P40 0 1 40 6 5 6

  现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答:

  1、 现在系统是否处于安全状态?

  2、 如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?

  三、实验报告内容

  1、 银行家算法和安全性检查算法原理

  银行家算法:

  银行家算法最初级原为银行系统设计,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。在OS设计中,也可以用它来避免死锁。

  为实现银行家算法,每个新进程在进入系统时它必须申明在运行过程中,可能需要的每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当某一进程请求时,系统会自动判断请求量是否小于进程最大所需,同时判断请求量是否小于当前系统资源剩余量。若两项均满足,则系统试分配资源并执行安全性检查算法。

  安全性检查算法 :

  安全性检查算法用于检查系统进行资源分配后是否安全,若安全系统才可以执行此次分配;若不安全,则系统不执行此次分配。

  安全性检查算法原理为:在系统试分配资源后,算法从现有进程列表寻找出一个可执行的进程进行执行,执行完成后回收进程占用资源;进而寻找下一个可执行进程。当进程需求量大于系统可分配量时,进程无法执行。当所有进程均可执行,则产生一个安全执行序列,系统资源分配成功。若进程无法全部执行,即无法找到一条安全序列,则说明系统在分配资源后会不安全,所以此次分配失败。

  2、 程序流程图

  3、 程序及注释

  #include

  //////////////////////////////////////////////////////////////////////////

  //全局变量定义

  int Available[100]; //可利用资源数组

  int Max[50][100]; //最大需求矩阵

  int Allocation[50][100]; //分配矩阵

  int Need[50][100]; //需求矩阵

  int Request[50][100]; //M个进程还需要N类资源的资源量

  int Finish[50];

  int p[50];

  int m,n; //M个进程,N类资源

  /////////////////////////////////////////////////////////////////////////

  //安全性算法

  int Safe()

  {

  int i,j,l=0;

  int Work[100]; //可利用资源数组

  for (i=0;i

  Work[i]=Available[i];

  for (i=0;i

  Finish[i]=0;

  for (i=0;i

  {

  if (Finish[i]==1)

  continue;

  else

  {

  for (j=0;j

  {

  if (Need[i][j]>Work[j])

  break;

  }

  if (j==n)

  {

  Finish[i]=1;

  for(int k=0;k

  Work[k]+=Allocation[i][k];

  p[l++]=i;

  i=-1;

  }

  else continue;

  }

  if (l==m)

  {

  cout<<"系统是安全的"<<'\n';

  cout<<"系统安全序列是:\n";

  for (i=0;i

  {

  cout<

  if (i!=l-1)

  cout<<"-->";

  }

  cout<<'\n';

  return 1;

  }

  }

  }

  /////////////////////////////////////////////////////////////////////////////////

  //银行家算法

  int main()

  {

  int i,j,mi;

  cout<<"输入进程的数目:\n";

  cin>>m;

  cout<<"输入资源的种类:\n";

  cin>>n;

  cout<<"输入每个进程最多所需的各类资源数,按照"<

  for (i=0;i

  for(j=0;j

  cin>>Max[i][j];

  cout<<"输入每个进程已经分配的各类资源数,按照"<

  for (i=0;i

  {

  for(j=0;j

  {

  cin>>Allocation[i][j];

  Need[i][j]=Max[i][j]-Allocation[i][j];

  if (Need[i][j]<0)

  {

  cout<<"你输入的第"<

  j--;

  continue;

  }

  }

  }

  cout<<"请输入各个资源现有的数目:\n";

  for (i=0;i

  cin>>Available[i];

  Safe();

  while (1)

  {

  cout<<"输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\n";

  cin>>mi;

  cout<<"输入进程所请求的各个资源的数量\n";

  for (i=0;i

  cin>>Request[mi][i];

  for (i=0;i

  {

  if (Request[mi][i]>Need[mi][i])

  {

  cout<<"所请求资源数超过进程的需求量!\n";

  return 0;

  }

  if (Request[mi][i]>Available[i])

  {

  cout<<"所请求资源数超过系统所有的资源数!\n";

  return 0;

  }

  }

  for (i=0;i

  {

  Available[i]-=Request[mi][i];

  Allocation[mi][i]+=Request[mi][i];

  Need[mi][i]-=Request[mi][i];

  }

  if (Safe())

  cout<<"同意分配请求\n";

  else

  {

  cout<<"SORRY╮(╯▽╰)╭……你的请求被拒绝…\n";

  for (i=0;i

  {

  Available[i]+=Request[mi][i];

  Allocation[mi][i]-=Request[mi][i];

  Need[mi][i]+=Request[mi][i];

  }

  }

  for (i=0;i

  Finish[i]=0;

  char Flag; //标志位

  cout<<"是否再次请求分配?是请按Y/y,否请按N/n";

  while (1)

  {

  cin>>Flag;

  if (Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n')

  break;

  else

  {

  cout<<"请按要求重新输入:\n";

  continue;

  }

  }

  if (Flag=='Y'||Flag=='y')

  continue;

  else break;

  }

  }

  4、 运行结果以及结论

  图示为题目所给定的条件下的程序运行结果。可看出在现有分配情况下,该系统安全。

  下图为,P1提出请求后,程序的运行结果,可知,系统仍然安全,所以系统可以满足请求。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部