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

📄 银行家算法实现系统资源管理.cpp

📁 操作系统课程设计
💻 CPP
字号:
#include<stdio.h>
#define m 4//资源种类
#define n 5//进程个数
int i,j, pr[n];//pr[n]进程编号
struct process //将进程定义为结构体类型,便于引用
{
  int allocation[n][m];//已分配的资源数量
  int need[n][m];//还需要申请的资源数
  int available[m];//可用资源数
  int add[m];//添加资源时,用于输入
  int del[m];//删除资源时用
}p;
void Input()//输入功能
{     printf("已分配的资源量:\n");
       for(i=0;i<n;i++)
         for(j=0;j<m;j++) 
		 {
			 scanf("%d",&p.allocation[i][j]);
		 }
	  printf("\n请输入资源需求量:\n");
       for(i=0;i<n;i++)
	     for(j=0;j<m;j++)
		 {
		   scanf("%d",&p.need[i][j]);
		 }
     printf("可用的资源:");
    for(i=0;i<m;i++)
     scanf("%d",&p.available[i]);
}
void Output()//显示系统资源
{   
	printf("显示系统资源使用分配情况: \n");
	printf("已分配的资源数量  ");
	printf("还需要申请的资源数");
    printf("\n");
    for(i=0;i<n;i++)
	{      
		
		for(j=0;j<m;j++)//已分配的资源数量
		{  
	       printf("%d   ",p.allocation[i][j]);
	  	  
		}
		printf("       ");
		for(j=0;j<m;j++)//还需要申请的资源数
		{  
	  	   printf("%d   ",p.need[i][j]);
		}
		 printf("\n");
	}
        printf("\n可用资源数:");//可用的资源
       for(i=0;i<m;i++)
       printf("%d  ",p.available[i]);
	   printf("\n");
}
bool Safe(process g)//安全性算法
{    
     int flag=1;
	 int r=0,l=0;//r标明所有进程的安全状态,l进程编号
     int work[m];//工作向量,标明系统可提供给进程继续运行所需的各类资源数
     bool finsh[n],rest=true;//rest 用于标记是否为1,1代表安全
     for(i=0;i<n;i++)//为每个进程的finish赋值为false
          finsh[i]=false;
     for(i=0;i<m;i++)
         work[i]=g.available[i];//可用资源标记为work 防止修改时混乱
      do
	  {
        for(i=0;i<n;i++)
		{ 
          if(finsh[i]==false)
		  {
                  for(j=0;j<m;j++)//work<need 说明资源不充足,逐类资源进行验算
				  {
					  if(work[j]<g.need[i][j])
					  {
						  flag=0;//不安全置为0
						  break;
					  }
		  }
                 if(j>=m)  //如果j>=m说明work >=need资源充足,逐类资源进行验算
				 {
                   flag=1;//表明安全
                   finsh[i]=true;
                   pr[l]=i;//标记进程号
                   l++;
                   for (j=0;j<m;j++)
                    work[j]=work[j]+g.allocation[i][j]; 
				 }
		  }
		}
          r=r+1;//共循环次数 直到所有进程都安全 或不安全为止
	  }while(r<n); 
     if(flag==0) 
		 rest=false;//不安全
      return rest; //返回rest的值判断是否安全
}
void Safe()//输出安全序列
{    
     if (Safe(p))
	 {
	  for(i=0;i<n;i++)
      printf("p%d  ",i);
	  printf("在该时刻的安全序列是");
      for(i=0;i<n;i++)
      printf("p%d  ",pr[i]);
	 }
     else
      printf("\n在该时刻不安全!\n\n");
}
void add( )//添加资源
{ 
  printf("添加可用的资源:");
   int add[m];
   for(i=0;i<m;i++)
   scanf("%d",&p.add[i]);
   for(i=0;i<m;i++)
    p.available[i]=p.available[i]+p.add[i];
    printf("\n此时可用资源为: ");
   for(i=0;i<m;i++)
   printf("%d ",p.available[i]);
}
void del()//删除资源
{
  printf("删除可用的资源:");
   int add[m];
   for(i=0;i<m;i++)
   scanf("%d",&p.del[i]);
   for(i=0;i<m;i++)
    p.available[i]=p.available[i]-p.del[i];
    printf("\n此时可用资源为: ");
   for(i=0;i<m;i++)
   printf("%d ",p.available[i]);
}
void request(int request[],int k)//第K个进程申请资源
{
   bool bj=false;//初始值为false
   for(i=0;i<m;i++)
    if (request[i]>p.need[k][i]) bj=true;
    if (bj==true)
	{
      printf("请求资源大于需要的资源!可选择添加资源");
      return;
	}
    for(i=0;i<m;i++) 
     if(request[i]>p.available[i]) bj=true;
     if (bj==true)
	 {
       printf("需要添加资源,可用资源不充足!");
       return;
	 }
	 int a[m],b[m],c[m],d[m];
     for(i=0;i<m;i++)//当bj不等于true时,对m种资源进行更新
	 { 
		 a[i]=p.available[i]=p.available[i]-request[i];
         b[i]=p.need[k][i]=p.need[k][i]-request[i];
        c[i]=p.allocation[k][i]=p.allocation[k][i]+request[i];
	 }
	 
	 if (Safe(p))
	 {
	  printf("分配成功,安全序列是");
      for(i=0;i<n;i++)
      printf("%d ",pr[i]);
	  printf("\n\n第%d个进程当前资源为:\n",k);
      printf("已分配资源      需要资源     请求的资源\n");
	  for (i=0;i<m;i++)//输出当前进程的请求情况及资源情况
         printf("%d  ",c[i]);
	     printf("      ");
	 for (i=0;i<m;i++)
		 printf("%d  ",b[i]);
	     printf("      ");
	 for (i=0;i<m;i++)
		 printf("%d ",request[i]);
	 printf("\n可用资源为:");
	 for (i=0;i<m;i++)//退出前还原为初始状态
	 {
		  d[i]=a[i]+c[i];
	      printf("%d  ",d[i]);
	 }
	 for(i=0;i<m;i++)//还原
   { 
	p.available[i]=p.available[i]+request[i];
    p.need[k][i]=p.need[k][i]+request[i];
    p.allocation[k][i]=p.allocation[k][i]-request[i];
	}
      return;
	}
   printf("\n结果如下:系统不安全,分配失败");
   printf("\n\n回收完毕!");
   for(i=0;i<m;i++)//还原
   { 
	p.available[i]=p.available[i]+request[i];
    p.need[k][i]=p.need[k][i]+request[i];
    p.allocation[k][i]=p.allocation[k][i]-request[i];
   }
   printf("第%d个进程当前资源为:\n",k);
         printf("已分配资源      需要资源     请求的资源\n");
		 for (i=0;i<m;i++)//输出当前进程的请求情况及资源情况
	     printf("%d   ",p.allocation[k][i]);
	     printf("       ");
	     for (i=0;i<m;i++)
		 printf("%d    ",p.need[k][i]);
	     printf("      ");
	     for (i=0;i<m;i++)
		 printf("%d   ",request[i]);
	

}

void main()//主程序
{ 
  while(1)
  {
   printf("\n************欢迎使用系统资源管理(用银行家算法实现)************");
   printf("\n                             设计者:05多媒体1班  梁燕      \n");
   printf("\n             1   初始化系统资源          2  添加资源        ");
   printf("\n             3   删除资源                4  申请资源        ");
   printf("\n             5   银行家算法              6  显示系统资源    ");
   printf("\n             7   退出资源管理系统                           \n");
   printf("\n**************************谢谢使用****************************\n\n");
   printf("\n请输入你的选择:");
   int p;
   scanf("%d",&p);
    if(p>0&&p<=7)
	{
     switch(p)
	 {  case 1: Input();
                Output();
                 break;
		case 2:  add()   ;break;
	    case 3:  del()   ;break;
        case 4:  
                   printf("\n请输入申请资源的进程号:p");
                   int q;
                   scanf("%d",&q);
                   if (q>n)
                    printf("不存在该进程!\n");
                   else
				   { int a[m];
                     printf("请输入进程申请各类资源的数量:");
                     for(i=0;i<m;i++)
                     scanf("%d",&a[i]);
                     request(a,q);
				   };                                          
                 break;
        case 5: Output(); 
			     Safe();break;
		case 6: Output(); 
			     break;

         case 7:  printf("退出成功!\n");return;
	 }
	}
	else printf("输入错误,请重新输入!");
  }
}
/*测试数据:Allocation    Need      Available
       p0   0032          0012      1622
       p1   1000          1750
       p2   1354          2356
       p3   0332          0652
       p4   0014          0656
 p2提出请求:1 2 2 2*/

⌨️ 快捷键说明

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