银行家算法C语言代码

news2024/11/25 18:32:39
/*the code simulate blank algorithm to void deadlock*/
/*author:RongGong*/

#include<stdio.h>
#define MAX_RES_PROC 100

//定义银行家算法的数据结构
int M; // 资源的个数
int N; // 进程的个数
int Available[MAX_RES_PROC] = {0}; //可利用资源向量
int MaxNeed[MAX_RES_PROC][MAX_RES_PROC] = {0}; //最大需求矩阵
int Allocation[MAX_RES_PROC][MAX_RES_PROC] = {0}; //分配矩阵
int Need[MAX_RES_PROC][MAX_RES_PROC] = {0}; //需求矩阵

char ResName[MAX_RES_PROC] = {0}; //用于存放资源的名称
int Request[MAX_RES_PROC] = {0}; //用于存放进程请求资源的向量
int Work[MAX_RES_PROC]={0};//记录系统中当前各类可用资源的数目
int Security[MAX_RES_PROC]={0};//保存进程在安全情况下的执行顺序
void init(){
  printf("银行家算法初始化......\n");
  printf("请输入系统中可用资源种类的数量(1-100):");
  scanf("%d",&M);
  while(M < 1 || M > 100){
    printf("输入的可用资源种类数量范围为:1-100,请重新输入:");
    scanf("%d",&M);
  }
  printf("\n");
  int i,j;
  for(i = 0; i < M; i++){
    printf("请输入第 %d 个资源的名称:", (i+1));
    scanf("%s",&ResName[i]);
    printf("请输入初始可用资源 %c 的数量:",ResName[i]);
    scanf("%d",&Available[i]);
  }
  printf("\n");
  printf("请输入系统中进程的数量(1-100):");
  scanf("%d",&N);
  while(N < 1 || N > 100){
    printf("输入的进程数量为(1-100),请重新输入:");
    scanf("%d", &N);
  }
  printf("\n");
  printf("请输入进程的最大需求矩阵Max:\n");
  for(i = 0; i < N; i++){
    for(j = 0; j < M; j++){
      scanf("%d",&MaxNeed[i][j]);
    }
  }
printf("请输入进程的已分配矩阵Allocation:\n");
  int temp[100]={0}; //为了算新的Available
  for(i = 0; i < N;i++){
    for(j = 0; j < M ;j++){
      scanf("%d",&Allocation[i][j]);
      //第i个进程需要j类资源的数量:最大需求量-已经分配的
      Need[i][j]=MaxNeed[i][j]-Allocation[i][j];
      temp[j]+=Allocation[i][j]; //统计已经分配的资源量
    }
  }
  //更新可用资源数目Available
  for( j = 0; j < M ;j++){
    Available[j]=Available[j]-temp[j];
  }
}

void safeCheck(){
//printf("该方法执行安全性算法\n");
  int Finish[MAX_RES_PROC] = {0};//Finish:系统是否有足够的资源分配给进程,使之完成运行
  int i,j,k,m=0;//数组索引
  for(j = 0; j < M; j++){
    Work[j] = Available[j];
  }
  int count;//用于统计有多少种资源满足条件
  for(i = 0; i < N; i++){
    count = 0;
    for(j = 0; j < M; j++){
      if(Finish[i] == 0 && Need[i][j] <= Work[j]){
        //执行步骤3
        count ++ ;
        if(count == M){
          for(k = 0; k < M; k++){
            Work[k] = Work[k] + Allocation[i][k];
          }
          Finish[i]=1;//记录i号进程为可执行
          Security[m]=i;//记录第m个执行的是i号进程
          m++;
          i = -1;
        }

      }
    }
  }
 for(i = 0; i < N;i++){
    if(Finish[i]==0){printf("系统中不存在一个安全序列。\n");return;}
  }
  printf("系统存在一个安全序列:");
  for(i = 0;i < N;i++){
    printf("P%d",Security[i]);
    if(i < N-1){printf("-->");}
  }
  printf("\n");

}

int blankAlgorithm(){
  printf("请输入希望分配资源进程的编号:\n");
  int Id,j;
  int flag = 1;
  scanf("%d",&Id);
  while(Id < 0 || Id > N-1){
    printf("进程不存在!请重新输入\n请输入希望分配资源的进程的编号:");
  }
  printf("\n");
  printf("请输入请求资源数(%d个):\n",M);
  for(j = 0;j < M;j++){
    scanf("%d",&Request[j]);
  }
  printf("开始为进程P%d分配资源:\n",Id);
  for(j = 0; j < M; j++){
    if(Request[j] > Need[Id][j]){
      printf("进程请求资源数大于所需资源数,无法分配!\n");
      flag = 0;
      break;
    }else if(Request[j] > Available[j]){
      printf("进程请求资源数大于可用资源数,无法分配!\n");
      flag = 0;
      break;
    }else{
      Available[j] = Available[j] - Request[j];
      Allocation[Id][j] = Allocation[Id][j] + Request[j];
      Need[Id][j] = Need[Id][j] - Request[j];
    }
  }
return flag;
}
int main(){
  init();
  if(blankAlgorithm()){
    safeCheck();
  }else{
    printf("未进行资源分配\n");
  }
return 0;
}

运行结果:
在这里插入图片描述
参考资料:https://blog.csdn.net/weixin_43362002/article/details/106153822

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者&#xff1a;Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的&#xff0c;Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速&#xff0c;从简单的关键字到繁重的 KNN 向量&#xff0c;以及摄取管道繁重的摄取工作负载。 摄取涉及…

Grafana_数据可视化工具

目录 一、简介 二、安装部署 1、下载 2、安装 3、启用 三、使用简介 1、添加数据源 2、创建DashBoard 3、查看dashboard 4、选择查看的时间段 5、阈值颜色控制 源码等资料获取方法 一、简介 Grafana是一个跨平台开源的纯html/js编写的度量分析和可视化工具&#x…

Hydra(九头蛇)密码破解工具的详细使用教程

简介 Hydra是⼀款开源的暴⼒密码pojie⼯具&#xff0c;⽀持多种协议密码的破译。 可以对多种服务的账号和密码进行爆破&#xff0c;包括 数据库、SSH、FTP 等服务&#xff0c;在 Kali Linux 中自带 Hydra。有了这个工具就可以很方便的对密码进行破解。 其简单的使用参数如下&a…

【Java从入门到大牛】面向对象进阶上篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年7月16日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43…

Python应用实例(二)数据可视化(二)

数据可视化&#xff08;二&#xff09; 1.随机漫步1.1 创建RandomWalk类1.2 选择方向1.3 绘制随机漫步图1.4 模拟多次随机漫步1.5 设置随机漫步图的样式 1.随机漫步 使用Python来生成随机漫步数据&#xff0c;再使用Matplotlib以引人瞩目的方式将这些数据呈现出来。随机漫步是…

服务器感染了.halo勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全威胁也日益猖獗&#xff0c;勒索病毒作为其中的一种&#xff0c;给个人和企业带来了巨大的威胁。.halo勒索病毒作为最近出现的一种恶意软件&#xff0c;以其高度复杂的加密算法和迅速的传播方式而备受关注。它通过…

【群智能算法改进】一种改进的猎人猎物优化算法 IHPO算法[1]【Matlab代码#49】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始HPO算法2. 改进后的IHPO算法2.1 Cubic映射初始化2.2 透镜成像折射反向学习2.3 强制切换策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始HPO算法 此算法…

Vue3工程化项目搭建

Vue3工程化项目搭建 源码&#xff1a;vue3-quick-start 预览&#xff1a;vue3-quick-start 一、何为工程化 工程化概述 前端工程化大致可以分为模块化、组件化、规范化和自动化。 规范化 项目目录结构语法提示编码风格规范联调规范文件命名规范代码样式规范git flow 模块…

JS语法学习实战- 流程控制

JS语法学习实战- 流程控制 1. if - else2. switch3. for循环4. while循环5. 更多 JS语法学习实战系列合集 1. if - else if (条件1){条件1成立之后执行的代码 }else if(条件2){条件2成立之后执行的代码 }else{条件不成立之后执行的代码 }2. switch var daynew Date().getDay…

babel兼容低版本游览器

文章目录 1. webpack项目的搭建2. babel 命令行使用3. babel的预设与编译器流程4. babel项目中配置4.1 babel-loader与插件的使用4.2 babel-preset使用 5. 游览器兼容性使用5.1 browserslist工具与编写规则5.2 browserslist配置5.3 优化babel的配置文件 6. polyfill6.1 useBuil…

会声会影 Corel VideoStudio Ultimate 2023 v26.0.0.136 旗舰版百度网盘免费下载

会声会影 Corel VideoStudio Ultimate 2023 v26.0.0.136 旗舰版是一款易于使用&#xff0c;初学者也可以轻使用的&#xff0c;可自定义的 3D 标题、新的面部效果、动画 AR 贴纸、GIF 和摄像机移动过渡&#xff0c;让您轻松、直观地制作最佳视频。探索高级编辑工具&#xff0c;如…

JavaWeb——垃圾回收

目录 一、垃圾回收定义 二、垃圾回收处理内存区域 三、垃圾标记 1、引用计数 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、缺陷 2、可达性分析 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、缺点 四、垃圾回收过程 1、标记清除 &…

SAP MM 创建双单位采购信息记录

SAP创建不同基本单位的信息记录 1、前台维护MM01 2、ME11维护信息记录 3、通过BAPIBDC实现&#xff1a;ME_INFORECORD_MAINTAIN_MULTIMEK1录屏 因为单独使用ME_INFORECORD_MAINTAIN_MULTI创建信息记录无法创建双单位&#xff0c;创建第一个单位时可以&#xff0c;第二个就会报…

企业邮箱的成本与收费:了解真相,合理选择

企业邮箱的成本对于希望迁移到云端的企业来说可能是一个问题。但这并不一定是必须的。企业邮箱对于今天的企业来说是必不可少的&#xff0c;因为它们提供必要的工具和服务来帮助您与客户、合作伙伴和商业社区保持联系。企业邮箱的收费贵不贵&#xff1f;成本高么&#xff1f; 对…

【Linux】进程间通信 -- 信号量

概念引入为什么要信号量&#xff1f;信号量操作接口1.申请信号量semget2.控制信号量semctl3.处理信号量semop IPC资源的组织方式 概念引入 信号量是什么&#xff1f; 本质是一个计数器&#xff0c;通常用来表示公共资源中&#xff0c;资源数量多少的问题 公共资源&#xff1a…

BUUCTF-JustEscape

目录 信息搜集 bypass 黑名单机制 绕过沙盒执行系统命令 总结 这是一道 Node.js 沙盒逃逸的题目&#xff0c;在此记录一些技巧。 信息搜集 进入题目环境&#xff1a; 直接给出了一个可执行任意代码的入口 /run.php?code<code>&#xff0c;直接复制第二个 demo 的路…

常见安装工具以及命令(工作常用)

dockermongodbnginxredis 1.docker 启动2.docker 安装 MongoDB3.启动nginx4.redis配置&#xff0b;安装4.1 Redis的启动和停止4.2 后台启动方式 1.docker 启动 安装docker # 1.安装gcc和g yum -y install gcc yum -y install gcc-c # 2. 安装需要的软件包 yum install -y yum…

DNS详细解析

文章目录 DNS是什么以及作用下载DNS服务named.conf DNS查询DNS缓存机制解析过程递归查询和迭代查询 DNS服务器的类型DNS域名DNS服务器的类型搭建dns服务器缓存域名服务器主域名服务器从域名服务器排错反向解析 CDN介绍 DNS转发介绍配置 DNS劫持 DNS 是什么以及作用 DNS&#…

WEB:Web_php_include(多解)

背景知识 文件包含 file://协议 php://协议 data://协议 了解strstr函数 题目 <?php show_source(__FILE__); echo $_GET[hello]; /*可以构造payload*/ $page$_GET[page]; while (strstr($page, "php://")) { /*strstr()函数*/$pagestr_replace("php://&q…

JavaSwing+MySQL的购物系统项目

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88052733?spm1001.2014.3001.5503 JDK1.8 MySQL5.7 功能&#xff1a;管理员与用户两个角色&#xff0c;管理员可以对商品进行增删改查处理&#xff0c;用户可以浏览查找商品&#xff0c;注…