计算机操作系统实验:银行家算法模拟
目录
- 前言
- 实验目的
- 实验内容
- 实验原理
- 实验过程
- 代码如下
- 代码详解
- 算法过程
- 运行结果
- 总结
前言
本文是计算机操作系统实验的一部分,主要介绍了银行家算法的原理和实现。银行家算法是一种用于解决多个进程对多种资源的竞争和分配的算法,它可以避免死锁和资源浪费的情况。银行家算法的思想是模拟银行家对贷款申请的处理过程,即在保证系统安全性的前提下,尽可能满足每个进程的资源需求。本文将通过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说起 你可能会有疑问,讲多线程为何…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

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、一个结构体实现多…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...