⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bank.cpp

📁 操作系统中的重要得法之一
💻 CPP
字号:
#include "dos.h"
#include "conio.h"
#include "stdio.h"

int available[3]={3,3,2};
int max[6][3];
int allocation[6][3];
int need[6][3];
int live[5]={1,1,1,1,1};
int stay[3][3];
int request[3],process[5];
int i,j,p=5,pro,x,k1;
char flag='y';
int b[10]={0,0,0,0,0,0};
int r,a,v[10];
int l[10]={0,1,2,3,4,5,6,7,8,9};
void zhibiao()
{ x=1;
  printf("***************************资源分配图***********************\n");
  printf("\n");
  printf("PRO ");
  printf("Max:");
  for(i=0;i<r;i++)
  {printf("%c  ",i+65);}printf("   ");
  printf("All:");  //显示每个进程已占用的资源数
  for(i=0;i<r;i++)
  {printf("%c  ",i+65);}printf("   ");
  
  printf("Nee:");  //显示每个进程还需要的资源数
  for(i=0;i<r;i++)
  {printf("%c  ",i+65);}printf("   ");

  printf("Ava:"); //显示剩余资源数
  for(i=0;i<r;i++)
  {printf("%c  ",i+65);}printf("   ");
  printf("\n");
  
  for(i=0;i<a;i++)
  {  if(live[i]==1)
   { printf("P%d      ",i);
     for(j=0;j<r;j++)
     {printf("%-3d",max[i][j]);}printf("       ");
     for(j=0;j<r;j++)
     {printf("%-3d",allocation[i][j]);}printf("       ");
     for(j=0;j<r;j++)
     {printf("%-3d",need[i][j]);}printf("       ");
    }
     if(x==1&&live[i]==1) {
		for(j=0;j<r;j++)
		 {printf("%-3d",available[j]);}
		 x=0;
	 }
     if(live[i]==1) printf("\n"); 
  }
}

int apply()
{ int v=1;
  for(i=0;i<=2;i++)
  {if(need[pro][i]<request[i])  {v=0;break;}
   if(available[i]<request[i])  {v=0;break;}}
  if(v==1){for(i=0;i<=2;i++)
           {stay[0][i]=allocation[pro][i];allocation[pro][i]+=request[i];
            stay[1][i]=need[pro][i];need[pro][i]-=request[i];
            stay[2][i]=available[i];available[i]-=request[i];}
           }
  return(v);
}
int test()
{ int work[3],finish[5]={0,0,0,0,0},v,k=0,t=0;
  for(i=0;i<p;i++)
  if(live[i]==0) {finish[i]=1;k1--;}
  for(i=0;i<=2;i++)  work[i]=available[i];
while(1)
{ for(i=0;i<=4;i++)
   { if(finish[i]==0) { v=1;
                        for(j=0;j<=2;j++)
                         if(need[i][j]>work[j])  {v=0;break;}
                        if(v==1) { finish[i]=1;
                                   for(j=0;j<=2;j++)  work[j]+=allocation[i][j];
                                   process[k]=i;k++;
                                  }
                       }
}
    if(t==k)  break;
       else   t=k;
    if(k==k1)  break;
  }
if(k==k1)  return(1);
else      return(0);


}


void main()
{
printf("请输入进程的个数:");
scanf("%d",&a);
printf("请输入资源的个数:");
scanf("%d",&r);
printf("请输入系统的%d类资源每类的总数:",r);
for(i=0;i<r;i++)
{scanf("%d",&v[i]);
}
printf("请输入max[%d][%d]:\n",a,r);
for(i=0;i<a;i++)
{
for(j=0;j<r;j++)
{scanf("%d",&max[i][j]);}
}
printf("请输入allocation[%d][%d]:\n",a,r); //输入每个进程已占用的资源数
for(i=0;i<a;i++)
{
for(j=0;j<r;j++)
{scanf("%d",&allocation[i][j]);}
}

printf("请输入need[%d][%d]:\n",a,r); //输入每个进程还需的资源数
for(i=0;i<a;i++)
{
for(j=0;j<r;j++)
{scanf("%d",&need[i][j]);}
}
for(i=0;i<r;i++)
{for(j=0;j<a;j++)
 b[i]+=allocation[j][i];
}
for(i=0;i<r;i++)
{available[i]=v[i]-b[i];
}

while(flag=='y'||flag=='Y')
{zhibiao();
k1=5;
printf("系统的%d个进程是:",a);
for(i=0;i<a;i++)
{
printf("%d",l[i]);
printf(" ");}

printf("请输入要申请资源的进程:P");
scanf("%d",&pro);
if(pro<0||pro>=a)  break;
printf("P%d 进程对%d种资源的请求量:",pro,r);
for(i=0;i<r;i++)
{
scanf("%d",&request[i]);
}
if(apply()==0)  {printf("错误/资源不够,P%d 等待!\n",pro);
                  printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:");
                  scanf("%s",&flag);}
else   if(test()==0) {printf("系统不安全,P%d 等待!\n",pro);
                       for(i=0;i<=2;i++)
                       { allocation[pro][i]=stay[0][i];
                         need[pro][i]=stay[1][i];
                         available[i]=stay[2][i];}
        printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:");
        scanf("%s",&flag);} 
else   {zhibiao();printf("系统安全!\n");
         printf("存在安全:");
         for(i=0;i<k1-1;i++)
         printf("P%d>",process[i]);
         printf("P%d",process[k1-1]);
         printf("\n 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:");
         scanf("%s",&flag);}
if(need[pro][0]==0&&need[pro][1]==0&&need[pro][2]==0)
    for(i=0;i<=2;i++)
{available[i]+=max[pro][i];
    live[pro]=0;}

}
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -