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

📄 4.txt

📁 模拟实现银行家算法
💻 TXT
字号:
#include<string.h>
#include<stdio.h>
#define M 5       //定义进程数   
#define N 3         //定义资源数  
#define False 0
#define True 1
char saf='t';
int Max[][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int Avaliable[]={3,3,2}; //系统可用资源
int Allocation[][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//系统已分配资源
int Need[][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//还需要资源
int Request[3];
void showdata()//显示资源矩阵
{
   int i,j;
   printf("系统可用的资源:\n");
   printf("resouce:");
   for (j=0;j<N;j++)
   printf("%d,",Avaliable[j]);//输出分配资源
   printf("\n");
   printf("各进程的资源需求:\n");
   for (i=0;i<M;i++)
   {
	   printf("pr%d: ",i);
	   for (j=0;j<N;j++)  
	   {
		   printf("%d,",Max[i][j]);//输出最大需求资源数
	   }
	   printf("\n");
   }    
   printf("各进程得到资源:\n");
   for (i=0;i<M;i++)
   {
      printf("pr%d: ",i);
      for(j=0;j<N;j++)
		  printf("%d,",Allocation[i][j]);//输出已分配资源数
	  printf("\n");
   }
   printf("各进程还需求资源:\n");
   for (i=0;i<M;i++)
   {
	   printf("pr%d: ",i);
	   for(j=0;j<N;j++)
		   printf("%d,",Need[i][j]);//输出还需要资源数
	   printf("\n");
   }
}
int shifang(int i)//释放资源
{      
	 int j;
     for (j=0;j<N;j++)
  {
      Avaliable[j]=Avaliable[j]+Request[j];
      Allocation[i][j]=Allocation[i][j]-Request[j];
      Need[i][j]=Need[i][j]+Request[j];
  }

	return 1;
}
int changdata(int i)//进行资源分配
{ 
  int j;
  for (j=0;j<M;j++)
  {
      Avaliable[j]=Avaliable[j]-Request[j];
      Allocation[i][j]=Allocation[i][j]+Request[j];
      Need[i][j]=Need[i][j]-Request[j];
  }
  return 1;
}
int safe()//安全性算法
{
	int Work[3],Finish[M]={0},temp[M];
     int i,k=0,m,apply;
	 int j;
	 for(i=0;i<3;i++)
	 {
		 Work[i]=Avaliable[i]; 
	 }
	 for(i=0;i<M;i++) 
	 { 
		apply=0;
		for(j=0;j<3;j++)
		{
			if (Finish[i]==False&&Need[i][j]<=Work[j])
			{   
				apply++;
				if(apply==3)
				{
					for(m=0;m<3;m++)
					Work[m]=Work[m]+Allocation[i][m];//变分配数
					Finish[i]=True;
					temp[k]=i;
					i=-1; 
				    k++;
				}
		       
			}
		  else 
			  if(Finish[i]==False)
			  {
			      if(i==M-1)
				  {
				  printf("系统不安全\n");//如果不成功,输出系统不安全
				  saf='f';
				  return saf;
				  }
			      break;
			  }
		}
	 }
    printf("系统资源分配成功!");//如果安全,输出成功
    printf("分配的序列:\n");
        for(i=0;i<M;i++)//输出运行进程数组
		{
            printf("pr%d  ",temp[i]);
		}
		return 0;
}
void share()//利用银行家算法对申请资源对进行判定
{
	char ch;
	int i=0,j=0;
	ch='y';
	char saf='t';
	printf("\n请输入要求分配的资源进程号从(0 to 4):");  
    scanf("%d",&i);//输入须申请的资源号
    printf("请输入进程 %d 申请的资源:\n",i);
	for(j=0;j<3;j++)
	{
		printf("第 %d 个资源:",j+1);
		scanf("%d",&Request[j]);//输入需要申请的资源
	}
	for (j=0;j<N;j++)
	{
		if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错
		{ 
			printf("进程 %d 申请的资源大于它需要的资源",i);
            printf(" error!\n");
			ch='n';
            break;
		}
		else 
		{
			if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则
			{                         //出错
				printf("进程 %d 申请的资源大于available",i);
			    printf(" error!\n");
				ch='n';
				break;
			}
		}
	}
	if(ch=='y')//利用银行家算法
	{
		changdata(i);//根据进程需求量变换资源
		showdata();//根据进程需求量显示变换后的资源
	    safe();//根据进程需求量进行安全算法判断
		if(saf=='f')
		{
			shifang(i);
		}
		
	}
}
void Revision()
{
	printf("请选择: 1:修改进程还需要的资源  2:修改进程可用资源");
	int choice1;
	scanf("%d",&choice1);
    if(choice1==1)
	{
	printf("输入要修改的资源号(0~4)");
	int p;
    scanf("%d",&p);
	printf("输入修改后进程还需要的资源(1,1,1)\n");
	scanf("%d,%d,%d",&Need[p][0],&Need[p][1],&Need[p][2]);
    printf("经修改后各进程还需求资源:\n");
    for (int a=0;a<M;a++)
    {
       printf("pr%d:",a);
       for(int b=0;b<N;b++)      
	   printf("%d, ",Need[a][b]);//输出还需要资源数
       printf("\n");
    }
	}
	if(choice1==2)
	{
		printf("输入系统可用资源EX(1,1,1)\n");
		scanf("%d,%d,%d",&Avaliable[0],&Avaliable[1],&Avaliable[2]);
		printf("经修改后的系统可用资源为\n");
	    for (int k=0;k<N;k++)
        printf("%d,",Avaliable[k]);

	}


	   
}


int main()//主函数
{

    int choice;
    showdata();//显示各种资源
    safe();//用银行家算法判定系统是否安全
    do{
	   printf("\n*****输入要进行的操作 1:分配资源 2: 修改资源 3:显示资源   4:离开*****");
	   scanf("%d",&choice);
	   if(choice==1)
	   {
	     share();
	   }
	   if(choice==2)
	   {
		 Revision();
	   }
	   if(choice==3)
	   {
		   showdata();
	   }

       if(choice==4)
		   break;
	}while((choice==1)||(choice==2)||(choice==3));
    return 1;
}

⌨️ 快捷键说明

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