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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 手把手教你获取x信本地数据库(利用Sqlcipher查看)

    手把手教你获取x信本地数据库(利用Sqlcipher查看)最近一直在研究Xposed等一些hook框架,进行学习做一些demo,这次就正好拿x信练练手,学习学习,也可以学习x信手机本地数据库的表结构设计等。好,废话不多说,直接开干。前提是你的电脑已经安装了adb相关程序,如果你本身就是安卓开发者,想必肯定安装了AndroidStudio,那里直接就有adb相关程序。其次,你准备一台已经root过的安卓手机(要安装的有使用过的x信应用,不

    2025年8月22日
    3
  • linux异步io底层原理,异步IO简析

    linux异步io底层原理,异步IO简析什么是异步 IO UNIX 网络编程卷 1 中的 IO 多路复章节总结了几种典型 IO 模型 包括 阻塞 IO 非阻塞 IOIO 复用信号驱动式 IO 异步 IO 这些 IO 模型在本质上都是围绕着同步 异步 阻塞 非阻塞这几个特点在做一些不同的选择 IO 的过程是应用程序从某个设备读取数据 或者往设备写入数据 操作系统把这些设备抽象为描述符 fd 应用程序则在这些 fd 上面进行读写操作 由于 fd 的底层是设备 这里就会有个问题 设备还没

    2025年12月12日
    4
  • 理解maven命令package、install、deploy的联系与区别

    理解maven命令package、install、deploy的联系与区别  我们在用maven构建java项目时,最常用的打包命令有mvnpackage、mvninstall、deploy,这三个命令都可完成打jar包或war(当然也可以是其它形式的包)的功能,但这三个命令还是有区别的。下面通过分别执行这三个命令的输出结果,来分析各自所执行的maven的生命周期。mvncleanpackagemvncleaninstallm…

    2022年6月14日
    36
  • 我是如何学习和工作的(1) – 番茄工作法(1)[通俗易懂]

    我是如何学习和工作的(1) – 番茄工作法(1)[通俗易懂]我是如何学习和工作的(1) – 番茄工作法(1)

    2022年4月21日
    48
  • 1、ZigBee 开发教程之基础篇—ZigBee简介和学习方法

    1、ZigBee学习笔记之基础篇—ZigBee简介和学习方法文章目录1、ZigBee学习笔记之基础篇—ZigBee简介和学习方法1、前言2、ZigBee简介3、ZigBee和IEEE802.15.4的关系4、ZigBee的特点5、ZigBee无线网络通信信道分析6、ZigBee的网络拓扑模型7、ZigBee的应用范围8、本人所使用的开发板的硬件资料9、快速掌握ZigBee的学习方法1、前言​ ZigBee学习笔记系列是基于笔者需要使用ZigBee模组进行项目开发而写的学习笔记。

    2022年4月8日
    185
  • pycharm配置python运行环境_C中调用Python

    pycharm配置python运行环境_C中调用Python目录前言一、系统路径说明二、环境配置1.在VS中选择ReleaseX642.菜单栏中选择:项目->属性3.生成dll答疑python程序目录下没有Numpy路径?具体代码参考博客前言本文主要讲解在Python程序中调用C(C++)程序的方法。主要思路是:在VS中配置好环境后,将C语言程序打包生成动态库文件.dll。将.dll改名成.pyd之后,装入相应路径,在pycharm中直接import即可环境:win10Pycharm(python3.6)(64位)VS2017(社区版)

    2022年8月26日
    8

发表回复

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

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