死锁避免-银行家算法 模拟

本文详细介绍了银行家算法的实现过程,包括系统可用资源数、各进程资源的最大需求量、还需要的资源量及已得到的资源量等关键信息。通过交互式流程,用户可以输入需申请的资源数,系统会检查资源申请的合理性,并在确保系统安全的前提下进行资源分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "string.h"
#include "iostream.h"
#define M 5           //总进程数
#define N 3           //总资源数
#define FALSE 0
#define TRUE 1
//M个进程对N类资源最大资源需求量

int MAX[M][N]={

{7,5,3},

{3,2,2},

{9,0,2},

{2,2,2},

{4,3,3}};


//系统可用资源数

int AVAILABLE[N]={3,3,2} ;

 

//M个进程已经得到N类资源的资源量
int ALLOCATION[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};


//M个进程还需要N类资源的资源量

int NEED[M][N]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};


int Request[N]={0,0,0};


void main()
{
int i=0,j=0;
char flag='Y';
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
showdata();
while(flag=='Y'||flag=='y')
{
  i=-1;
  while(i<0||i>=M)
  {
   cout<<"  请输入需申请资源的进程号(从0到"<<M-1<<",否则重输入!):";
   cin>>i;

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

cout<<"  输入的进程号不存在,重新输入!"<<endl;

  }
  cout<<"  请输入进程"<<i<<"申请的资源数"<<endl;
  for (j=0;j<N;j++)
  {
   cout<<"  资源"<<j<<":  ";
   cin>>Request[j];
   if(Request[j]>NEED[i][j])
   {
    cout<<"  进程"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的资源量!";
    cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
    flag='N';
    break;
   }
   else
   {
    if(Request[j]>AVAILABLE[j])
    {
     cout<<"  进程"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
     cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;

     flag='N' ;

     break;

    }

}

 }
  if(flag=='Y'||flag=='y')
  {
   changdata(i);
   if(chkerr(0))
   {
    rstordata(i);
    showdata();
   }
   else
    showdata();
  }
  else
   showdata();
  cout<<endl;
  cout<<"  是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";

  cin>>flag;

}

}



void showdata()
{
int i,j;
cout<<"        系统可用的资源数为:"<<endl<<endl;
          cout<<"      ";

          for (j=0;j<N;j++)

                  cout<<"  资源"<<j<<":  "<<AVAILABLE[j];

          cout<<endl;

          cout<<endl;          

          cout<<"        各进程资源的最大需求量:"<<endl<<endl;

          for (i=0;i<M;i++)

          {     

                   cout<<"进程"<<i<<":";

                   for (j=0;j<N;j++)cout<<"  资源"<<j<<":  "<<MAX[i][j];

                   cout<<endl;   

          }

          cout<<endl;
          cout<<"        各进程还需要的资源量:"<<endl<<endl;
          for (i=0;i<M;i++)
          {
                  cout<<"进程"<<i<<":";

                   for (j=0;j<N;j++)

                            cout<<"  资源"<<j<<":  "<<NEED[i][j];

                   cout<<endl;
          }
          cout<<endl;
          cout<<"        各进程已经得到的资源量:  "<<endl<<endl;
          for (i=0;i<M;i++)
         {
                  cout<<"进程"<<i<<":";

                  for (j=0;j<N;j++)

                          cout<<"  资源"<<j<<":  "<<ALLOCATION[i][j];

                  cout<<endl;
         }
         cout<<endl;
}


void changdata(int k)

{
       int j;
       for (j=0;j<N;j++)
       {
                 AVAILABLE[j]=AVAILABLE[j]-Request[j];
                 ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
                 NEED[k][j]=NEED[k][j]-Request[j];
       }
}


void rstordata(int k)

{
        int j;
        for (j=0;j<N;j++)
        {
                 AVAILABLE[j]=AVAILABLE[j]+Request[j];
                 ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
                 NEED[k][j]=NEED[k][j]+Request[j];
         }
}


int chkerr(int s)

{
         int WORK[N],FINISH[M],temp[M];
         int i,j,k=0,flag;

         for(i=0;i<M;i++)

                 FINISH[i]=FALSE;

         for(j=0;j<N;j++)
                 WORK[j]=AVAILABLE[j];
         i=s;
         while(i<M)
         {
                 flag=0;
                 for (j=0;j<N;j++)
                          if(NEED[i][j]>WORK[j])
                                       flag=1;
  
                 if (FINISH[i]==FALSE&&flag==0)

                 {

                          for(j=0;j<N;j++)

                          WORK[j]=WORK[j]+ALLOCATION[i][j];
                          FINISH[i]=TRUE;
                          temp[k]=i;
                          k++;
                          i=0;
                  }
                  else
                  {
                           i++;
                   }
         }
         for(i=0;i<M;i++)
                 if(FINISH[i]==FALSE)
                 {
                            cout<<endl;
                            cout<<"  系统不安全!!! 本次资源申请不成功!!!"<<endl;
                            cout<<endl;
                            return 1;
                  }
          cout<<endl;
          cout<<"  经安全性检查,系统安全,本次分配成功。"<<endl;
          cout<<endl;
          cout<<"  本次安全序列:";
          for(i=0;i<M;i++)cout<<"进程"<<temp[i]<<"->";
                  cout<<endl<<endl;;
          return 0;
}
#include <stdio.h> #include <string.h> #define M 50 int max[M][M], allocation[M][M],need[M][M],available[M]; /*定义全局变量*/ int i=0, j=0, n=0, m=0; /*n--进程数 m--资源种数*/ void main() { int SafeCheck(); void print(); int c,p,q; int req[M], allocation1[M][M],need1[M][M],available1[M]; printf("*****************银行家算法****************\n"); printf("请输入进程总数: "); scanf("%d", &n); /*输入进程总数*/ printf("请输入资源种类总数: "); scanf("%d", &m); /*输入资源种类总数*/ printf("请输入每个进程对每类资源的最大矩阵 :\n"); for(i=0;i<n; i++) { printf("进程%d:\n",i); for(j=0;j<m; j++) { printf("\t资源%d:",j); scanf("%2d",&max[i][j]); /*输入最大矩阵*/ } } printf("请输入每个进程每类资源已分配的资源数 :\n"); for(i=0;i<n; i++) { printf("进程%d:\n",i); for(j=0;j<m; j++) { printf("\t资源%d:",j); scanf("%d", &allocation[i][j]); /*输入已分配资源数*/ } } printf("还需要的资源数为 :"); for (i=0;i<n; i++) { printf("\n进程%d\n",i); for(j=0;j<m; j++) { need[i][j]=max[i][j]-allocation[i][j]; printf("\t资源%d:",j); printf("%2d",need[i][j]); /*输出还需要的资源数*/ } } printf("\n请输入每类资源的可用资源数:\n"); for (j=0;j<m; j++) { printf("\t资源%d:",j); scanf("%d", &available[j]); /*输入可用资源数*/ } /*检测已知的状态是否安全*/ if (SafeCheck()) /*如果已知的状态安全则执行以下代码*/ { do { p=0,q=0; printf("\n输入请求资源的进程号: P"); scanf("%d", &i); /*输入请求资源的进程号*/ printf("输入该进程所需的每类资源的资源数 :\n"); for(j=0;j<m; j++) { printf("\t资源 Z%d ",j); scanf("%d",&req[j]); /*输入该进程所需的资源数 */ } for(j=0;j<m; j++) if(req[j]>need[i][j]) /*判断请求是否超过最大资源数*/ { p=1; break; } if(p) printf("申请的资源数超过所需的资源数的最大值,拒绝分配资源!\n"); else { for(j=0;j<m; j++) if(req[j]>available[j]) /*判断请求是否超过可用资源数 */ { q=1; break; } if(q) printf("申请的资源数超过可用资源数的最大值,拒绝分配资源!\n"); else { for(j=0;j<m; j++) /*请求满足条件 */ { available1[j]=available[j]; /* 保存原已分配的资源数,需要的资源数,和可用的资源数*/ allocation1[i][j]=allocation[i][j]; need1[i][j]=need[i][j]; available[j]=available[j]-req[j]; /* 系统尝试把资源分配给请求的进程 */ allocation[i][j]=allocation[i][j]+req[j]; need[i][j]=need[i][j]-req[j]; } printf("试分配了资源.\n"); print(); /*输出可用资源数*/ /*进行安全检测*/ if(SafeCheck()==0) /*分配后状态不安全*/ { for (j=0;j<m; j++) { available[j]=available1[j]; /* 还原分配前的已分配的资 源数,仍需要的资源数和可用的资源数 */ allocation[i][j]=allocation1[i][j]; need[i][j]=need1[i][j]; } printf("系统不安全状态,拒绝分配资源!:\n"); printf("试分配作废,系统资源恢复!\n"); print(); } else { printf("资源分配成功!\n"); printf("系统新状态:\n"); printf("进程 已分配资源数 需要的资源数\n"); for (i=0;i<n; i++) { printf("%2d",i); printf(" "); for(j=0;j<m; j++) printf("%2d",allocation[i][j]); printf(" "); for(j=0;j<m; j++) printf("%2d",need[i][j]); printf("\n"); } print(); } } } printf("\nDo you want to continue? 1 or 0 ?\n"); /*判断是否继续进行资源分配*/ scanf("%d",&c); } while (c==1); } } int SafeCheck() /*安全性检测函数 */ { int k=0,f, v=0; int work[M],a[M]; char finish[M]; for(i=0;i<n; i++) finish[i]='F'; /*初始化各进程均没得到足够资源并等待完成*/ for(j=0;j<m; j++) work[j]=available[j]; /*用work[j]表示进程可用的各类资源数 */ k=n; do { /*for(j=0;j<m; j++) temp[j]=work[j]; 保存扫描进程前的可用资源数*/ for (i=0;i<n; i++) { if (finish[i]=='F') //检测待完成的进程 { f=1; for (j=0;j<m; j++) if (need[i][j]>work[j]) f=0; if (f==1) /*找到还没完成的且需求数小于可提供进程继续运行的*/ { finish[i]='T'; // 标志已完成的进程 a[v++]=i; /*记录安全序列 */ for (j=0;j<m; j++) work[j]=work[j]+allocation[i][j]; /*释放该进程已分配的资源*/ } } } /* for (j=0;j<m; j++) { if(temp[j]!=work[j]) k=1; }*/ }while(k--); f=1; for (i=0;i<n; i++) /*判断是否所有的进程都完成*/ { if (finish[i]=='F') { f=0; break; } } if (f==0) /*若有进程没完成,则为不安全状态*/ { printf("不安全状态.\n"); return(0); /*不安全状态标志*/ } else /* 否则为安全状态*/ { printf("系统为安全状态.\n"); printf("进程安全序列为:\n"); for (i=0;i<n;i++) printf ("%d ",a[i]); /*输出安全序列*/ printf("\n"); return(1); /*安全状态标志*/ } } void print() /*输出函数*/ { printf("系统可用资源: \n"); for(j=0;j<m; j++) { printf("\t资源%d ",j); printf("%2d ",available[j]); printf("\n"); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值