计算机操作系统-银行家算法-C语言

 ̄綄美尐妖づ 提交于 2020-01-11 03:28:31

银行家算法

给进程分配资源,是系统处于安全状态;当进程向系统申请资源时,系统要预判分配资源后是否还存在安全状态,如果存在则分配,否则不分配。先看效果再附源码

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10 
struct POC{
 char JobName;//进程名
 int Allocation[3];//已拥有资源数 
 int Need[3];//还需求资源数 
 int Pass;//是否已经过 1是 0否 
}job[N]={{'A', 0,1,0, 7,4,3 ,0},//3:7  5 3 
      {'B', 2,0,0, 1,2,2 ,0},//1:5  3 2 
      {'C', 3,0,2, 6,0,0 ,0},//4:10 5 5 
      {'D', 2,1,1, 0,1,1 ,0},//2:7  4 3
      {'E', 0,0,1, 4,3,1 ,0} //5:10 5 6  
};//3 3 2
int Number=5,SafetySequenceNumber;
int Available[3]={3,3,2};

struct POC{
 char JobName;//进程名
 int Allocation[3];//已拥有资源数 
 int Need[3];//还需求资源数 
 int Pass;//是否已经过 1是 0否 
}job[N]={{'A', 0,1,0, 7,4,3 ,0},//3:7  5 3 
      {'B', 2,0,0, 1,2,2 ,0},//1:5  3 2 
      {'C', 3,0,2, 6,0,0 ,0},//4:10 5 5 
      {'D', 2,1,1, 0,1,1 ,0},//2:7  4 3
      {'E', 0,0,1, 4,3,1 ,0} //5:10 5 6  
};//3 3 2
int Number=5,SafetySequenceNumber;
int Available[3]={3,3,2};
//1.1安全序列
void SafetySequence(char c[N],int k){
 int j;
    for(j=0;j<Number;j++){
  if(Available[0]>=job[j].Need[0]&&Available[1]>=job[j].Need[1]&&Available[2]>=job[j].Need[2]&&
     (job[j].Need[0]!=0||job[j].Need[1]!=0||job[j].Need[2]!=0)&&job[j].Pass==0){
   job[j].Pass=1;
   for(int n=0;n<3;n++){
    Available[n]=job[j].Allocation[n]+Available[n];
   }
   c[k]=job[j].JobName;
   k++;
   //已经找到一个安全序列,输出 
   if(k==Number){
       SafetySequenceNumber++; 
    for(int i=0;i<Number;i++){
        printf("->%c",c[i]);
       }
       printf("\n");
   }else{
    //递归继续查找 
    SafetySequence(c,k);
   }
   //恢复数据,回溯 
      k--;
      for(int n=0;n<3;n++){
    Available[n]-=job[j].Allocation[n];
   }
   job[j].Pass=0;
  }
 } 
}
//1.是否安全
int IsSafety(){
 int i,k=0; 
 char c[Number];
 printf("\n进程名\t已有资源\t仍需资源");
 for(i=0;i<Number;i++){
       printf("\n%c\t %d %d %d\t\t %d %d %d",job[i].JobName,job[i].Allocation[0],job[i].Allocation[1],job[i].Allocation[2],
    job[i].Need[0],job[i].Need[1],job[i].Need[2]);
 }
 printf("\n可用资源:%d %d %d\n\n",Available[0],Available[1],Available[2]); 
 for(i=0;i<Number;i++){
  if(job[i].Need[0]==0&&job[i].Need[1]==0&&job[i].Need[2]==0){
   c[k]=job[i].JobName;
   k++;
  }
 }
 SafetySequenceNumber=0;
 SafetySequence(c,k);
 if(SafetySequenceNumber!=0){
  printf("\n存在%d个安全序列",SafetySequenceNumber);
     return 1;
 }
 else{
  printf("不存在安全序列");
     return 0;
 }
}
//2.请求处理 
void Resqust(){
 char RJN;
 int i,RRN[3];
 printf("\n输入请求进程名(如:A):");
 scanf("%s",&RJN);
 printf("输入请求资源数(如:1 1 1):");
 scanf("%d %d %d",&RRN[0],&RRN[1],&RRN[2]);
 if(RRN[0]>Available[0]||RRN[1]>Available[1]||RRN[2]>Available[2]||RRN[0]<0||RRN[1]<0||RRN[2]<0){
  printf("\n请求资源大于可用资源or小于0\n");
 }
 else{
  for(i=0;i<Number;i++){
      if(job[i].JobName==RJN){
    //如果请求资源大于等于需求资源,则完成进程释放资源 
    if(RRN[0]>=job[i].Need[0]&&RRN[1]>=job[i].Need[1]&&RRN[2]>=job[i].Need[2]){
     for(int k=0;k<3;k++){
      Available[k]+=job[i].Allocation[k];
      job[i].Need[k]=0;
      job[i].Allocation[k]=0;
     }
    //否则分配资源 
    }else{
     for(int j=0;j<3;j++){
      Available[j]-=RRN[j];
      job[i].Need[j]-=RRN[j];
      job[i].Allocation[j]+=RRN[j]; 
     }
     
    }
    break;     
   }
  }
  if(i==Number){
   printf("进程名有误\n");
   return;
  } 
  printf("\n预判:\n");
  //如果存在安全序列 
  if(IsSafety()==1){
   //分配资源  
   for(i=0;i<Number;i++){
    //如果请求资源>=需求资源,则删除进程 
    if(job[i].JobName==RJN&&RRN[0]>=job[i].Need[0]&&RRN[1]>=job[i].Need[1]&&RRN[2]>=job[i].Need[2]){//未完成的进程 
     for(int j=i;i<Number;i++){
      job[i].JobName=job[i+1].JobName;
      for(int k=0;k<3;k++){
        job[i].Allocation[k]=job[i+1].Allocation[k];
        job[i].Need[k]=job[i+1].Need[k];
      }       
     }
     Number--;
     break;
    }    
   }
   printf(",已分配\n");
  }
  else{
   printf(",不能分配!\n");
   for(int i=0;i<3;i++){
    Available[i]+=RRN[i];
   }
  }
 }
} 
//0.主函数 
int main(){
 int k;
 do {
  printf("\n\n");
  printf("\t\t         银行家算法      \n");
  printf("\t\t*****************************\n");
  printf("\t\t*                          *\n");
  printf("\t\t*       1----当前状态       *\n");
  printf("\t\t*       2----请求资源     *\n");
  printf("\t\t*       0----退    出     *\n");
  printf("\t\t*                          *\n");
  printf("\t\t*****************************\n");
  printf("\t\t   请选择菜单项(0-2):");
  scanf("%d",&k);
  switch(k)
  {
   case 1:
    printf("当前状态:\n");
          IsSafety();
    break;
   case 2:
              printf("\n请求资源:\n");
              Resqust();
     break;
   default:
       break;
  }  
 }while (k!=0);
 return 0;
} 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!