银行家算法C语言模拟程序

银行家算法C语言模拟程序 这个最简单的模拟程序,为了完成操作系统作业而做的。大家放心,绝对可以运行,呵呵! 有什么不完善的地方请提出!(在计数器的运用上比较乱,希望大家看的明白) 作者:luo卢丹) 源程序: #include<stdio.h>

#include<stdlib.h>

#include<conio.h> int Available[10];           //可使用资源向量

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

int Allocation[10][10]={0};      //分配矩阵

int Need[10][10]={0};            //需求矩阵

int Work[10];                //工作向量

int Finish[10];              //状态标志

int Request[10][10];         //进程申请资源向量

int Pause[10];

int List[10];

int i,j;

int n;                       //系统资源总数

int m;                       //总的进程数

int a;                       //当前申请的进程号

int l,e;                     //计数器

int b=0,c=0,f=0,g;           //计数器 void mainenter()//主要的输入部分代码

{

 printf(“请输入系统总共有的资源数:”);

 scanf(“%d”,&n);

 printf(“请输入总共有多少个进程:”);

 scanf(“%d”,&m);

 for(i=1;i<=n;i++)

 {

  printf(“第%d类资源有的资源实例:”,i);

  scanf(“%d”,&Available[i]);

 }

 for(i=1;i<=m;i++)

 {

  for(j=1;j<=n;j++)

  {

   printf(“进程P[%d]对第%d类资源的最大需求量:”,i,j);

   scanf(“%d”,&Max[i][j]);

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

  }

 }

} void mainrequest()  //进程提出新申请的代码部分

{

    printf(“请输入申请资源的进程:”);

    scanf(“%d”,&a);

 for(i=1;i<=n;i++)

 {

  printf(“请输入进程P[%d]对%d类资源的申请量:”,a,i);

  scanf(“%d”,&Request[a][i]);

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

   printf(“/n出错!进程申请的资源数多于它自己申报的最大量/n”);

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

   printf(“/nP[%d]必须等待/n”,a); //以下是试探性分配   Available[i]=Available[i]-Request[a][i];

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

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

  Work[i]=Available[i];

 }

 for(i=1;i<=m;i++) 

 {

  Pause[i]=Available[i];//Pause[i]只是一个暂时寄存的中间变量,为防止在下面                         //安全性检查时修改到Available[i]而代替的一维数组

  Finish[i]=false;

 }

 for(g=1;g<=m;g++)

 {

  for(i=1;i<=m;i++)

  {

   b=0;                 //计数器初始化

   for(j=1;j<=n;j++)

   {    

    if(Need[i][j]<=Pause[j])

    {

     b=b+1;    

    }

                if(Finish[i]==false&&b==n)

    {

     for(l=1;l<=n;l++)

     {

      Pause[l]=Pause[l]+Allocation[i][l]; 

     }

     Finish[i]=true; 

     printf(“$$ %d “,i);//依次输出进程安全序列之一中每个元素

    }

   }

  }

 }

    printf(“/n”);

 for(i=1;i<=m;i++)  

 {

  if(Finish[i]==true) f=f+1;//统计Finish[i]==true的个数

 }

 if (f==m)

 {

  printf(“safe static”);

     f=0;//将计数器f重新初始化,为下一次提出新的进程申请做准备

 }

 else

 {

  printf(” unsafe static “);//以下代码为当系统被判定为不安全状态时                             //返回提出申请前的状态

  for(i=1;i<=n;i++)

  {

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

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

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

  }

 }

}

void mainprint()

{

 printf(“当前的系统状态/n”);

 printf(”        目前占有量     最大需求量      尚需要量 /n进程”);

 for(i=1;i<=n;i++)

  for(j=1;j<=n;j++)

  {

   printf(”  %d类”,j);

  }

 for(i=1;i<=m;i++)

 {

  printf(“/nP[%d]”,i);

  for(j=1;j<=n;j++)

  {

   printf(”   %d “,Allocation[i][j]);

  }

  for(j=1;j<=n;j++)

  {

   printf(”   %d “,Max[i][j]);

  }

  for(j=1;j<=n;j++)

  {

   printf(”   %d “,Need[i][j]);

  }

 }

 printf(“/n/n系统剩余资源量:   “);   

 for(i=1;i<=n;i++)

 {

  printf(”   %d “,Available[i]);

 }

 printf(“/n”);

} void main()

 { int k,h=1;

   while(h)

  {  system(“cls”); 

   {

    printf(“/n/n            ★ 欢迎使用本程序 ★/n”);

    printf(“/n/n  1:输入系统的资源数、申请进程数、每个类资源的实例数”);

    printf(“/n  2:……………………………………  输入进程的资源申请”);

    printf(“/n  3:……………………………………………  输出系统状态”);

    printf(“/n  4:…………………………………………………  退出程序”);

    printf(“/n/n please choose “);

    scanf(“%d”,&k);

   }

     switch(k)

   {

    case 1:mainenter();      break;

    case 2:mainrequest();      break;

    case 3:mainprint();      break;

    case 4:h=0;        break;

   }

     printf(“/n”);

     system(“pause”);

  }

   system(“cls”);

   printf(“/n/n       谢谢使用 /n”);

   printf(“/n/n  See you next time!!!/n/n/n”);

 } 以下是程序运行截图:  
         以此输入每个进程对各类资源的需求量;
    《银行家算法C语言模拟程序》  
      
所有进程输入完成后系统的当前状态
    《银行家算法C语言模拟程序》  
进程P[2]再次提出申请,系统为安全状态;
《银行家算法C语言模拟程序》  
对进程P[2]分配后的系统状态;
《银行家算法C语言模拟程序》  
进程P[1]再次提出资源申请,分配后系统为不安全状态,则不提供资源分配;
《银行家算法C语言模拟程序》  
由于P[1]分配后系统状态不安全,则退回到前一状态;

    原文作者:银行家问题
    原文地址: https://blog.csdn.net/luoludan/article/details/2581643
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞