c语言 银行家算法(完整代码实现)

c语言 银行家算法(完整代码实现)银行家算法例子:T0时刻进程P1提出需要(1、0、2)个资源的请求T0时刻进程P4提出需要(3、3、0)个资源的请求T0时刻进程P0提出需要(0、2、0)个资源的请求全局变量:intMax[5][3]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};//五个进程对各种资源的最大需求intAllocation[5][3]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};//五个进程已分配的各种资源数目intNeed[5][3]={7,4,3

大家好,又见面了,我是你们的朋友全栈君。

银行家算法

例子:
在这里插入图片描述
T0时刻进程P1提出需要(1、0、2)个资源的请求
T0时刻进程P4提出需要(3、3、0)个资源的请求
T0时刻进程P0提出需要(0、2、0)个资源的请求
定义全局变量:

int Max[5][3] = { 
   7,5,3,3,2,2,9,0,2,2,2,2,4,3,3}; //五个进程对各种资源的最大需求
int Allocation[5][3] = { 
   0,1,0,2,0,0,3,0,2,2,1,1,0,0,2}; //五个进程已分配的各种资源数目 
int Need[5][3] = { 
   7,4,3,1,2,2,6,0,0,0,1,1,4,3,1}; //五个进程任需要各种资源的数目 
int Available[3] = { 
   3,3,2}; //可利用的各资源的数目
int Work[3]; //可用资源数 
bool Finish[5]; //进程是否完成 
int Request[3]; //进程提出对各个资源请求的数目 
int Sequence[5]; //安全序列 

安全性判断函数:

bool is_safe() //安全性判断 
{ 
   
int i,j,i1 = 0;
bool t = false;

for(i = 0; i < 3; i++) //把Available赋值给Work
{ 
   
Work[i] = Available[i];
}

for(i = 0; i<5; i++) //初始化所有进程未完成 
{ 
   
Finish[i] = false;
}

while(1)
{ 
   
for(j = 0; j < 5; j++) //寻找Need小于等于Work的进程 
{ 
   
if(Finish[j]) continue;
t = true;
for(i = 0; i < 3; i++)
{ 
   
if(Need[j][i] <= Work[i]) continue;
else
{ 
   
t = false;
break;
}
}
if(t) break; //判断第j个进程是否满足Need小于等于Work
}

if(t && (Finish[j] == false)) //是否找到Need小于等于Work的进程并且进程未完成 
{ 
   
for(i = 0; i < 3; i++)
{ 
   
Work[i] = Work[i] + Allocation[j][i];
}
Finish[j] = true; //进程完成 
Sequence[i1] = j; //安全序列
i1++;
}
else
{ 
   
for(i = 0; i < 5; i++)
{ 
   
if(Finish[i]) continue;
else return false;
}
return true;
}

}
return true;
} 

资源的请求函数:


void request_option(int a)             //资源的请求选择 
{ 
   
 int i;
 bool t = true;
 
 for(i = 0; i < 3; i++)                //判断Requesti是否小于等于Needi 
 { 
   
  if(Request[i] <= Need[a][i]) continue;
  else
  { 
   
   printf("错误!\n");          //Requesti大于Needi出现错误,请求失败 
   t = false;
   break;
  }
 }
 
 if(t)
 { 
   
  for(i = 0; i < 3; i++)         //判断Requesti是否小于等于Availablei 
  { 
   
   if(Request[i] <= Need[a][i]) continue;
   else
   { 
   
    printf("错误,进程堵塞!\n");    //Requesti大于Availablei出现错误,进程Pi堵塞 
    t =  false;
    break;
   }
  }
 }
 
 if(t)               //试分配 
 { 
   
  for(i = 0; i < 3; i++)
  { 
   
   Available[i] = Available[i] - Request[i];
   Allocation[a][i] = Allocation[a][i] + Request[i];
   Need[a][i] = Need[a][i] - Request[i];
  }  
 }
 
}

完整代码:

#include<stdio.h>
int Max[5][3] = { 
   7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};         //五个进程对各种资源的最大需求
int Allocation[5][3] = { 
   0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};  //五个进程已分配的各种资源数目 
int Need[5][3] = { 
   7,4,3,1,2,2,6,0,0,0,1,1,4,3,1};        //五个进程任需要各种资源的数目 
int Available[3] = { 
   3,3,2};                              //可利用的各资源的数目
int Work[3];                                             //可用资源数 
bool Finish[5];                                          //进程是否完成 
int Request[3];                                          //进程提出对各个资源请求的数目 
int Sequence[5];                                         //安全序列 

bool is_safe()                           //安全性判断 
{ 
   
 int i,j,i1 = 0;
 bool t = false;
 
 for(i = 0; i < 3; i++)               //把Available赋值给Work
 { 
   
  Work[i] =  Available[i];
 }
  
 for(i = 0; i<5; i++)                 //初始化所有进程未完成 
 { 
   
  Finish[i] = false;
 }
 
 while(1)
 { 
   
  for(j = 0; j < 5; j++)           //寻找Need小于等于Work的进程 
  { 
   
   if(Finish[j]) continue;
   t = true;
   for(i = 0; i < 3; i++)
   { 
   
    if(Need[j][i] <= Work[i]) continue;
    else
    { 
   
     t = false;
     break;
    }
   }
   if(t) break;                 //判断第j个进程是否满足Need小于等于Work
  }
  
  if(t && (Finish[j] == false))    //是否找到Need小于等于Work的进程并且进程未完成 
  { 
   
   for(i = 0; i < 3; i++)
   { 
   
    Work[i] = Work[i] + Allocation[j][i];
   }
   Finish[j] = true;           //进程完成 
   Sequence[i1] = j;           //安全序列
   i1++;
  }
  else
  { 
   
   for(i = 0; i < 5; i++)
   { 
   
    if(Finish[i]) continue;
    else return false;
   }
   return true;
  }
  
 }
 return true;
}

void request_option(int a)             //资源的请求选择 
{ 
   
 int i;
 bool t = true;
 
 for(i = 0; i < 3; i++)                //判断Requesti是否小于等于Needi 
 { 
   
  if(Request[i] <= Need[a][i]) continue;
  else
  { 
   
   printf("错误!\n");          //Requesti大于Needi出现错误,请求失败 
   t = false;
   break;
  }
 }
 
 if(t)
 { 
   
  for(i = 0; i < 3; i++)         //判断Requesti是否小于等于Availablei 
  { 
   
   if(Request[i] <= Need[a][i]) continue;
   else
   { 
   
    printf("错误,进程堵塞!\n");    //Requesti大于Availablei出现错误,进程Pi堵塞 
    t =  false;
    break;
   }
  }
 }
 
 if(t)               //试分配 
 { 
   
  for(i = 0; i < 3; i++)
  { 
   
   Available[i] = Available[i] - Request[i];
   Allocation[a][i] = Allocation[a][i] + Request[i];
   Need[a][i] = Need[a][i] - Request[i];
  }  
 }
 
}

void print_Sequence()        //打印安全序列 
{ 
   
 int i;
 printf("安全序列为:");
 for(i=0;i<4;i++)
 { 
   
  printf("P%d->",Sequence[i]);
 }
 printf("P%d\n",Sequence[4]);
}

int main()
{ 
   
 int i,a;
 if(is_safe())                          //判断T0系统是否处于安全状态
 { 
   
  printf("T0系统处于安全状态\n");
  print_Sequence();                 //打印输出找到的资源分配的安全序列
  printf("\n"); 
 }
 else
 { 
   
  printf("T0系统处于不安全状态\n");
 }
 
 printf("请输入资源请求的进程(0:P0 1:P1 2:P2 3:P3 4:P4):");
 scanf("%d",&a);
 printf("输入请求A、B、C资源的数目:");
 for(i = 0; i < 3; i++)
 { 
   
  scanf("%d",&Request[i]);
 } 
  
 request_option(a);
 if(is_safe())                          //系统是否处于安全状态
 { 
   
  printf("系统能满足该资源请求\n");
  print_Sequence();                 //打印输出找到的资源分配的安全序列
 }
  else
 { 
   
  printf("系统不能满足该资源请求\n");
 }
 
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139839.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号