贷款

银行家算法代码

  银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。

  银行家算法程序代码如下:

  #include

  #include

  #include

  #define FALSE0

  #define TRUE1

  #define W10

  #define R10

  int M;//总进程数

  int N;//资源种类

  int ALL_RESOURCE[W];//各种资源的数目总和

  int MAX[W][R];//M个进程对N类资源最大资源需求量

  int AVAILABLE[R];//系统可用资源数

  int ALLOCATION[W][R];//M个进程已经得到N类资源的资源量

  int NEED[W][R];//M个进程还需要N类资源的资源量

  int Request[R];//请求资源个数

  void output()

  {

  int i,j;

  cout<

  cout<<“各种资源的总数量:”<

  for(j=0;j

  cout<<“资源”<

  cout<

  cout<<“━━━━━━━━━━━━━━━━━━”<

  cout<<“目前各种资源可利用的数量为:”<

  for(j=0;j

  cout<<“资源”<

  cout<

  cout<<“━━━━━━━━━━━━━━━━━━”<

  cout<<“各进程还需要的资源数量:”<

  for(i=0;i

  cout<<“资源”<

  cout<

  for(i=0;i

  {

  cout<<“进程”<

  for(j=0;j

  cout<

  cout<

  }

  cout<

  cout<<“━━━━━━━━━━━━━━━━━━”<

  cout<<“各进程已经得到的资源量:”<

  for(i=0;i

  cout<<“资源”<

  cout<

  for(i=0;i

  {

  cout<<“进程”<

  for(j=0;j

  cout<

  cout<

  }

  cout<

  }

  void distribute(int k)

  {

  int j;

  for(j=0;j

  {

  AVAILABLE[j]=AVAILABLE[j]-Request[j];

  ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

  NEED[k][j]=NEED[k][j]-Request[j];

  }

  }

  void restore(int k)

  {

  int j;

  for(j=0;j

  {

  AVAILABLE[j]=AVAILABLE[j]+Request[j];

  ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];

  NEED[k][j]=NEED[k][j]+Request[j];

  }

  }

  int check()

  {

  int WORK[R],FINISH[W];

  int i,j;

  for(j=0;j

  for(i=0;i

  for(i=0;i

  {

  for(j=0;j

  {

  if(FINISH[i]==FALSE&&NEED[i][j]<=WORK[j])

  {

  WORK[j]=WORK[i]+ALLOCATION[i][j];

  }

  }

  FINISH[i]=TRUE;

  }

  for(i=0;i

  {

  if(FINISH[i]==FALSE)

  {

  cout<

  cout<<“系统不安全!!!本次资源申请不成功!!!”<

  cout<

  return1;

  }

  else

  {

  cout<

  cout<<“经安全性检查,系统安全,本次分配成功。”<

  cout<

  return0;

  }

  }

  }

  void bank()//银行家算法

  {

  int i=0,j=0;

  char flag=‘Y’;

  while(flag==‘Y’||flag==‘y’)

  {

  i=-1;

  while(i<0||i>=M)

  {

  cout<<“━━━━━━━━━━━━━━━━━━”<

  cout<

  cin>>i;

  if(i<0||i>=M)cout<<“输入的进程号不存在,重新输入!”<

  }

  cout<<“请输入进程”<

  for(j=0;j

  {

  cout<<“资源”<

  cin>>Request[j];

  if(Request[j]>NEED[i][j])//若请求的资源数大于进程还需要i类资源的资源量j

  {

  cout<

  cout<<“若继续执行系统将处于不安全状态!”<

  flag=‘N’;

  break;

  }

  else

  {

  if(Request[j]>AVAILABLE[j])//若请求的资源数大于可用资源数

  {

  cout<

  cout<<“若继续执行系统将处于不安全状态!”<

  flag=‘N’;

  break;

  }

  }

  }

  if(flag==‘Y’||flag==‘y’)

  {

  distribute(i);//调用change(i)函数,改变资源数

  if(check()//若系统安全

  {

  restore(i);//调用restore(i)函数,恢复资源数

  output();//输出资源分配情况

  }

  else//若系统不安全

  output();//输出资源分配情况

  }

  else//若flag=N||flag=n

  cout<

  cout<<“是否继续银行家算法演示,按‘Y’或‘y’键继续,按‘N’或‘n’键退出演示:”;

  cin>>flag;

  }

  }

  void version()

  {

  cout<

  cout<<“\t银行家算法”<

  }

  void main()//主函数

  {

  int i=0,j=0,p;

  version();

  getchar();

  cout<

  cin>>M;

  cout<

  cout<<“请输入总资源种类:”;

  cin>>N;

  cout<

  cout<<“请输入各类资源总数:(需要输入数为”<

  for(i=0;i

  cin>>ALL_RESOURCE[i];

  cout<

  cout<<“输入各进程所需要的各类资源的最大数量:(需要输入数为”<

  for(i=0;i

  {

  for(j=0;j

  {

  do

  {

  cin>>MAX[i][j];

  if(MAX[i][j]>ALL_RESOURCE[j])

  cout<

  }

  while(MAX[i][j]>ALL_RESOURCE[j]);

  }

  }

  cout<

  cout<<“输入各进程已经占据的各类资源的数量:(需要输入数为”<

  *N<<“个)”;

  for(i=0;i

  {

  for(j=0;j

  {

  do

  {

  cin>>ALLOCATION[i][j];

  if(ALLOCATION[i][j]>MAX[i][j])

  cout<

  }

  while(ALLOCATION[i][j]>MAX[i][j]);

  }

  }

  for(j=0;j

  {

  p=ALL_RESOURCE[j];

  for(i=0;i

  {

  p=p-ALLOCATION[i][j];//减去已经被占据的资源

  AVAILABLE[j]=p;

  if(AVAILABLE[j]<0)

  AVAILABLE[j]=0;

  }

  }

  for(i=0;i

  for(j=0;j

  NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];

  output();

  bank();

  }