计算机操作系统实验:银行家算法模拟
目录
- 前言
- 实验目的
- 实验内容
- 实验原理
- 实验过程
- 代码如下
- 代码详解
- 算法过程
- 运行结果
- 总结
前言
本文是计算机操作系统实验的一部分,主要介绍了银行家算法的原理和实现。银行家算法是一种用于解决多个进程对多种资源的竞争和分配的算法,它可以避免死锁和资源浪费的情况。银行家算法的思想是模拟银行家对贷款申请的处理过程,即在保证系统安全性的前提下,尽可能满足每个进程的资源需求。本文将通过C语言编程,实现一个简单的银行家算法模拟程序,并展示其运行结果和分析。
实验目的
(1)理解利用银行家算法避免死锁的问题;
(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。
(3)理解和掌握安全序列、安全性算法
实验内容
(1)编程实现银行家算法
(2)编程实现安全性算法
基本要求:
(1)能够根据给定的资源分配情况,及某进程提出的资源请求,通过算法得出是否能够进行分配。
(2)如能分配,需得出相应的安全序列。
实验原理
银行家算法是一种死锁避免算法,它通过模拟所有资源的预定最大可能数量的分配来测试安全性,然后在决定是否分配之前进行“s-state”检查以测试所有其他未决活动的可能死锁条件应该允许继续²。
银行家算法之所以得名,是因为该算法可用于银行系统,以确保银行不会耗尽资源,因为银行永远不会以无法再满足要求的方式分配资金所有客户的需求²。
以下是该算法的工作原理¹:
- 系统跟踪可用资源总量和分配给每个进程的资源。
2.当一个进程请求一些资源时,系统检查它是否可以分配它们而不会导致死锁。 - 如果可以安全地授予请求(即不会造成死锁),系统会分配资源并更新其记录。
- 如果不能安全地授予请求(即会导致死锁),系统将拒绝该请求。
实验过程
代码如下
#include<stdio.h>
int main()
{int p, r, i, j, k;printf("Enter number of processes: ");scanf("%d", &p);printf("Enter number of resources: ");scanf("%d", &r);int alloc[p][r], max[p][r], avail[r], need[p][r], finish[p];for(i=0;i<p;i++)finish[i]=0;printf("Enter allocation matrix:\n");for(i=0;i<p;i++)for(j=0;j<r;j++)scanf("%d", &alloc[i][j]);printf("Enter max matrix:\n");for(i=0;i<p;i++)for(j=0;j<r;j++)scanf("%d", &max[i][j]);printf("Enter available matrix:\n");for(i=0;i<r;i++)scanf("%d", &avail[i]);for(i=0;i<p;i++)for(j=0;j<r;j++)need[i][j]=max[i][j]-alloc[i][j];int count=0;while(count!=p){int flag=0;for(i=0;i<p;i++){if(finish[i]==0){int c=0;for(j=0;j<r;j++)if(need[i][j]<=avail[j])c++;if(c==r){finish[i]=1;flag=1;count++;for(j=0;j<r;j++)avail[j]+=alloc[i][j];}}}if(flag==0)break;}if(count==p)printf("\nSafe sequence exists.\n");elseprintf("\nSafe sequence does not exist.\n");
}
代码详解
该算法是操作系统中使用的死锁避免算法。银行家算法用于通过在将资源分配给进程之前检查系统是否处于安全状态来避免死锁。该算法通过跟踪每个进程的资源使用情况并识别可能导致死锁的冲突来工作。您提供的代码从用户那里获取进程数、资源、分配矩阵、最大矩阵和可用矩阵的输入。然后它计算需求矩阵并检查是否存在安全序列。如果存在安全序列,它会打印“存在安全序列”。否则它会打印“安全序列不存在。”
下面是代码的详细解释:
- 代码首先从用户那里获取进程和资源数量的输入。
- 然后它接受分配矩阵的输入,该矩阵表示分配给每个进程的资源数量。
- 然后它接受最大矩阵的输入,该矩阵表示每个进程可以请求的最大资源数。
- 然后它接受可用矩阵的输入,该矩阵表示每种资源类型的可用资源数量。
- 然后计算需求矩阵,该矩阵表示每个流程所需的资源数量。
- 它初始化一个名为 finish 的数组,该数组跟踪进程是否已完成执行。
- 然后它进入一个 while 循环,该循环一直运行到所有进程都完成执行。
- 在 while 循环内,它通过检查其需求是否小于或等于可用资源来检查是否存在可以安全执行的进程。
- 如果存在这样的进程,它会执行该进程并释放分配给它的资源。
- 如果不存在这样的过程,它会跳出 while 循环。
- 最后,它检查是否所有进程都已完成执行。如果是,它会打印“存在安全序列”。否则它会打印“安全序列不存在。”
算法过程
该算法首先从用户那里获取进程和资源数量的输入。
然后它为分配矩阵获取输入,该矩阵表示分配给每个进程的资源数量。
然后它接受最大矩阵的输入,该矩阵表示每个进程可以请求的最大资源数。
然后它为可用矩阵获取输入,该矩阵表示每种资源类型的可用资源数量。
然后它计算需求矩阵,该矩阵表示每个进程所需的资源数量。
它初始化一个名为 finish 的数组,该数组跟踪进程是否已完成执行。
然后它进入一个 while 循环,该循环一直运行到所有进程都完成执行。
在 while 循环内,它通过检查其需求是否小于或等于可用资源来检查是否存在可以安全执行的进程。
如果存在这样的进程,它会执行该进程并释放分配给它的资源。
如果不存在这样的过程,它就会跳出 while 循环。
最后,它检查是否所有进程都已执行完毕。如果是,它会打印“存在安全序列”。否则它会打印“安全序列不存在。”
运行结果

总结
本文是对计算机操作系统实验中银行家算法模拟的总结。银行家算法是一种用于避免死锁和资源浪费的动态分配算法,它模拟了银行家在贷款时的策略。银行家算法的基本思想是,当一个进程请求资源时,系统先判断该请求是否会导致系统进入不安全状态,如果是,则拒绝该请求;如果不是,则分配资源,并检查系统是否还有足够的资源满足其他进程的最大需求,如果有,则继续运行;如果没有,则撤销刚才的分配,并让该进程等待。
在实验中,我们使用C语言编写了一个银行家算法模拟程序,该程序可以接收用户输入的进程数、资源种类、每种资源的总数、每个进程已分配的资源数、每个进程还需要的资源数等信息,并根据银行家算法判断系统是否处于安全状态,以及是否可以满足某个进程的资源请求。我们通过多组测试数据验证了程序的正确性和鲁棒性,并对程序的运行结果进行了分析和总结。
通过这次实验,我们加深了对计算机操作系统中资源管理和死锁避免的理解,掌握了银行家算法的原理和实现方法,提高了编程和调试的能力,也体会到了动态分配算法在实际应用中的重要性和优势。
相关文章:
计算机操作系统实验:银行家算法模拟
目录 前言实验目的实验内容实验原理实验过程代码如下代码详解算法过程运行结果 总结 前言 本文是计算机操作系统实验的一部分,主要介绍了银行家算法的原理和实现。银行家算法是一种用于解决多个进程对多种资源的竞争和分配的算法,它可以避免死锁和资源浪…...
机器学习:多项式拟合分析中国温度变化与温室气体排放量的时序数据
文章目录 1、前言2、定义及公式3、案例代码1、数据解析2、绘制散点图3、多项式回归、拟合4、注意事项 1、前言 当分析数据时,如果我们找的不是直线或者超平面,而是一条曲线,那么就可以用多项式回归来分析和预测。 2、定义及公式 多项…...
一个 24 通道 100Msps 逻辑分析仪
这是一个创建非常便宜的逻辑分析仪的项目,但其功能可与昂贵的商业分析仪相媲美。该分析仪可以以每秒 1 亿个样本的最高速度对多达 24 个通道进行采样,并且可以通过单个通道中的极性变化或多达 16 个通道形成的模式来触发。 该项目不仅包含硬件࿰…...
使用Process Explorer和Dependency Walker排查C++程序中dll库动态加载失败问题
目录 1、exe主程序启动时的库加载流程说明 2、加载dll库两种方式 2.1、dll库的隐式引用...
网工Python:如何使用Netmiko的SCP函数进行文件传输?
在网络设备管理中,传输配置文件、镜像文件等是经常需要进行的操作。Netmiko是一个Python库,可用于与各种网络设备进行交互,提供了一些用于传输文件的函数,其中包括SCP(Secure Copy Protocol)函数。本文将介…...
题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和--不能完全通过,最好情况通过67.
原题链接: 题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和 https://www.dotcpp.com/oj/problem3166.html 致歉 害,首先深感抱歉,这道题还是没有找到很好的解决办法。目前最好情况就是67分。 这道题先这样跳过吧,当然以后还…...
ChatGPT- OpenAI 的 模型(Model) 介绍
ChatGPT的火爆程度大家都知道了,该章节我们来了解一下 ChatGPT 一个关键概念 - 模型(Model)。主要是为大家介绍一下在 OpenAI 中,究竟有哪些模型可以使用。 在后续的章节,我们会分单独的小章节逐一的为大家介绍各个不同模型的调用以及接口参…...
X 态及基于 VCS 的 X-Propagation 检测
🔥点击查看精选 IC 技能树系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#…...
数据库之事务隔离级别详解
事务隔离级别详解 一、事务的四大特性(ACID)1. 原子性(atomicity):2. 一致性(consistency):3. 隔离性(isolation):4. 持久性(durability): 二、事务的四种隔离级别1. 读未提交(Read uncommitted)࿱…...
守护进程、僵尸进程、孤儿进程
守护进程、僵尸进程、孤儿进程 守护进程(Daemon Process) 定义 守护进程又称Daemon进程(精灵进程),是Linux中的后台服务进程。 它的生命周期较长,通常独立于控制终端并且周期性地执行某种任务或者等待处…...
软件设计师笔记
软件设计师笔记 计算机组成与体系结构 数据的表示、计算机结构、Flynn分类法、CISC与RISC、流水线技术、存储系统、总线系统、可靠性、校验码 1. 数据的表示 (一)进制转换 R进制转十进制使用按权展开法: 十进制转R进制使用短除法 二进制…...
4_用dockerfile制作镜像
Docker 镜像原理 思考: Docker 镜像本质是什么? Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G? Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MBÿ…...
肝一肝设计模式【四】-- 建造者模式
系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 文章目录 系列文章目录前言一、什么是建造者模式二、举个栗子三、静态内部类写法四、开源框…...
从设计到产品
从设计到产品 最近上的一些课的笔记,从 0 开始设计项目的角度去看产品。 设计系统 设计系统(design system) 不是 系统设计(system design),前者更偏向于 UI/UX 设计部分,后者更偏向于实现部分。 个人觉得,前端开发与 UI/UX 设…...
《疯狂Python讲义》值传递的细节
函数的参数包含着整个程序的规范性,之前还是没有那么去注意重要的细节,读完书中函数值传递篇章,还是有所收获的。 参数有两种形式,一种是形参一种是实参,形参可以理解为实参的载体,函数当中的关键词也是描…...
【7. ROS 中的 IMU 惯性测量单元消息包】
欢迎大家阅读2345VOR的博客【6. 激光雷达接入ROS】🥳🥳🥳 2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号👻👻👻,座右铭:脚踏实地,仰望星空&#…...
pcie m.2固态硬盘装机后无法识别到启动盘
1、第一种情况《系统版本过低》 原因: 使用m.2固态硬盘的电脑,最好安装iwn8.1以上的系统,因为win7系统及其win xp系统 没有自带NVME驱动。 搞定办法: 比较简单的方式就是直接开运行快启动u盘启动盘制作工具将系统升级到win10系…...
Java Web应用开发 ——第四章:JavaBean技术测验
一.单项选择题(共13题,55.9分) 1 在 JSP 中调用 JavaBean 时不会用到的标记是:( ) A、 < jsp:javabean> B、 < jsp:useBean> C、 < jsp:setProperty> D、 < jsp:getProperty> 正确答案&a…...
CTF权威指南 笔记 -第二章二进制文件- 2.4 -动态链接
目录 静态文件的缺点 动态链接 位置无关代码 延迟绑定 _dl_runtime_reslove 函数定义 深入审视 静态文件的缺点 随着可执行文件的增加 静态链接带来的浪费空间问题就会愈发严重 如果大部分可执行文件都需要glibc 那么在链接的时候就需要把 libc.a链接进去 如果一个libc…...
C++:计算机操作系统:多线程:高并发中的线程
高并发中的线程 一切要从CPU说起PC 程序计数器从CPU到操作系统从进程到线程 从这篇开始,我将会开启高性能,高并发系列,本篇是给系列的开篇,主要关注 多线程以及线程池。 一切要从CPU说起 你可能会有疑问,讲多线程为何…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
[特殊字符] Spring Boot底层原理深度解析与高级面试题精析
一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配,通过简化传统Spring应用的初始化和配置流程,显著提升开发效率。其底层原理可拆解为以下核心机制: 自动装配(Auto-Configuration) 核…...
Java高级 |【实验八】springboot 使用Websocket
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...
