银行家算法01–安全性检查 (操作系统)

输入N个进程(N<=100),以及M类资源(M<=100),初始化各种资源的总数,T0时刻资源的分配情况。判断T0时刻是否安全。例如: 假定系统中有5个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10、5、7,在T0时刻的资源分配图如下:

输入格式:

第一行输入进程数量N,第二行输入资源类数M,第三行输入M类资源个类资源的总数,以下N行分别输入每个进程的名字,该进程对M类资源的最大需求以及已分配资源。

输出格式:

输出T0时刻系统的状态。若安全,输出“找到安全序列,处于安全状态。”否则,输出“找不到安全序列,处于不安全状态。”

输入样例:

在这里给出一组输入。例如:

5
3
10 5 7
P0 7 5 3 0 1 0
P1 3 2 2 2 0 0
P2 9 0 2 3 0 2
P3 2 2 2 2 1 1
P4 4 3 2 0 0 2

输出样例:

在这里给出相应的输出。例如:

name max allocation need available
P0 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2
P1 3 2 2 | 2 0 0 | 1 2 2 |
P2 9 0 2 | 3 0 2 | 6 0 0 |
P3 2 2 2 | 2 1 1 | 0 1 1 |
P4 4 3 2 | 0 0 2 | 4 3 0 |
找到安全序列,处于安全状态。
#include<stdio.h>typedef struct process{char name[2];int max[4],allocation[4],need[4];bool flag;
}p;void countNeed(p pro[],int available[],int proNumber,int sourNumber);
bool checkSafe(p pro[],int available[],int proNumber,int sourNumber);
void printAll(p pro[],int available[],int proNumber,int sourNumber);int main(){int proNumber,sourNumber,i,j;bool flag;scanf("%d",&proNumber);scanf("%d",&sourNumber);int available[sourNumber];p pro[proNumber];//初始化资源总数for(i=0;i<sourNumber;i++){scanf("%d",&available[i]);}//初始化进程的资源使用情况for(i=0;i<proNumber;i++){scanf("%s",&pro[i].name);pro[i].flag = false;for(j=0;j<sourNumber;j++){scanf("%d",&pro[i].max[j]);}for(j=0;j<sourNumber;j++){scanf("%d",&pro[i].allocation[j]);}}countNeed(pro,available,proNumber,sourNumber);printAll(pro,available,proNumber,sourNumber);flag = checkSafe(pro,available,proNumber,sourNumber);if(flag == true) printf("找到安全序列,处于安全状态。");else printf("找不到安全序列,处于不安全状态。");return 0;
}void countNeed(p pro[],int available[],int proNumber,int sourNumber){int i,j;for(i=0;i<proNumber;i++){for(j=0;j<sourNumber;j++){pro[i].need[j] = pro[i].max[j] - pro[i].allocation[j];available[j] -= pro[i].allocation[j];}}
}bool checkSafe(p pro[],int available[],int proNumber,int sourNumber){int i,j,sum=0,sum1=0,count=0;while(sum<proNumber){for(i=0;i<proNumber;i++){sum1 = 0;if(pro[i].flag == false){for(j=0;j<sourNumber;j++){if(pro[i].need[j]<=available[j]) sum1++;}if(sum1 == sourNumber) {for(j=0;j<sourNumber;j++){available[j] += pro[i].allocation[j];}pro[i].flag = true;sum++;}}}count+=6;if(count == 54) break;}if(sum == proNumber) return true;else return false;}void printAll(p pro[],int available[],int proNumber,int sourNumber){printf("name max allocation need available\n");int i,j;for(i=0;i<proNumber;i++){printf("%s ",pro[i].name);for(j=0;j<sourNumber;j++){printf("%d ",pro[i].max[j]);}printf("| ");for(j=0;j<sourNumber;j++){printf("%d ",pro[i].allocation[j]);}printf("| ");for(j=0;j<sourNumber;j++){printf("%d ",pro[i].need[j]);}if(i == 0){printf("| ");for(j=0;j<sourNumber;j++){if(j == sourNumber-1)printf("%d",available[j]);else printf("%d ",available[j]);}}else printf("|");printf("\n");}
}

银行家算法01--安全性检查 (操作系统)相关推荐

  1. 银行家算法中安全性检查子算法的实现

    实验内容: 编程实现银行家算法中的安全性检查子算法,要求: (1) 本程序要能描述 n 个并发进程共享 m 类资源,在某一时刻的资源分配状态: n.m 自定,但都不能小于 3: (2) 本程序功能: ...

  2. 银行家算法之Python实现[操作系统实验]

    银行家算法 银行家算法是著名的死锁避免算法,其思想是:把操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款.操作系统按照银行家制定的规则为进 ...

  3. 操作系统——银行家算法的模拟实现

    一.实验目的 (1)理解银行家算法. (2)掌握进程安全性检查的方法与资源分配的方法. 二.实验内容与基本要求 编制模拟银行家算法的程序,并给出一个例子验证所编写的程序的正确性. 要求例子中包含分配安 ...

  4. 10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法

    文章目录 1 死锁 1.1 死锁定义 1.2 死锁.饥饿.死循环的区别 1.3 死锁产生的必要条件 1.4 什么时候会发生死锁 1.5 死锁的处理策略 1.6 死锁的概念小结 2 死锁预防 2.1 破 ...

  5. 【计算机操作系统】银行家算法的模拟实现

    文章目录 前言 1 实验相关知识理论 1.1 死锁的概念 1.2 产生死锁的原因 1.3 避免死锁的方法 1.4 解除死锁的方法 2 实验设计思路 3 实验设计涉及到的数据结构 4 程序算法设计 4. ...

  6. [操作系统] 银行家算法

    文章目录 安全序列 通俗理解模型 初始借完钱 分析借钱的安全序列 银行家算法 核心思想 资源表示 安全性算法分析系统状态 银行家算法实现 思路分析 银行家算法步骤 安全性算法步骤 升华思维 安全序列 ...

  7. 操作系统 进程调度-银行家算法实验报告

    实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...

  8. 皮卡丘忠实粉丝之Web实现操作系统实验(进程调度+存储管理+死锁避免银行家算法)

    **皮卡皮卡丘~~~~~~** 目录 进程调度 目的和要求 内容与步骤 运行结果 问题及心得 C语言实现代码 存储管理 目的和要求 内容与步骤 运行结果 问题及心得 C语言实现代码 死锁避免银行家算法 ...

  9. 计算机操作系统——银行家算法

    1.实验目的: 银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法.本实验通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁.产生死锁的必要条件.安全状态等重要概念,并掌握 ...

  10. 操作系统——银行家算法(c语言)

    一.银行家算法 1.资源请求reqresource()函数: 设 Requesti是进程Pi的请求向量,如果Requesti[j]=K,则表示进程Pi需要K个Ri类型的资源.当Pi发出资源请求后,系统 ...

最新文章

  1. scala函数式编程(二) scala基础语法介绍
  2. redis设置主从复制-slave Replication--解决报错:(error) READONLY You can't write against a read only slave.
  3. jquery1.6中的.prop()和.attr()异同
  4. Android layout_gravity
  5. linux下php安装redis,Linux下php安装redis和phpredis库
  6. 您的浏览器没有获得Java Virtual Machine(JVM)支持。可能由于没有安装JVM或者已安装但是没有启用。请安装JVM1.5或者以上版本,如果已安装则启用它。...
  7. 计算机硬软件故障实训报告,计算机维护维修实训报告.docx
  8. javascript 图表_我如何使用JavaScript数据透视表和图表库分析开发人员趋势
  9. cocos2d-x初探学习笔记(1)--HelloWorld .
  10. linux中根据进程的PID值来查找执行文件的及其路径
  11. python 柱状图上显示字体_Python爬取百部电影数据,我发现了这个惊人真相!
  12. mysql数据库逻辑备份与恢复_Mysqldump逻辑备份与恢复
  13. 【GNN框架系列】DGL第二讲:使用Deep Graph Library实现GNN进行链接预测
  14. 大二 数据结构 期末复习题(仅供参考)
  15. mousewheel事件
  16. 如何激活Windows Server 2008 R2
  17. 45个实用的前端开发工具汇总
  18. html压缩工具html-minifier -- nodejs常用模块(4)
  19. 感谢中本聪!也感谢扎克伯格!
  20. 关于Provision.apk

热门文章

  1. 蔡军生先生第二人生的源码分析(2)第二人生的基本功能
  2. SPECTRUM发布6种新型AWG任意波形发生器
  3. 10个常用的数据分析商业模型之波特五种竞争力模型(一)
  4. cadence SPB17.4 - orcad - 层次原理图
  5. 读书笔记-人际网络的中心
  6. 用matlab画阻尼振动包络线,matlab阻尼振动模拟.doc
  7. QQ快速登录协议分析以及风险反思
  8. Mysql中查找附近人的查询语句
  9. Vue面试中,经常会被问到的面试题
  10. Win11打开控制面板的方法