当前位置: 首页 > news >正文

计算机操作系统实验:银行家算法模拟

目录

  • 前言
  • 实验目的
  • 实验内容
  • 实验原理
  • 实验过程
      • 代码如下
      • 代码详解
      • 算法过程
      • 运行结果
  • 总结

前言

本文是计算机操作系统实验的一部分,主要介绍了银行家算法的原理和实现。银行家算法是一种用于解决多个进程对多种资源的竞争和分配的算法,它可以避免死锁和资源浪费的情况。银行家算法的思想是模拟银行家对贷款申请的处理过程,即在保证系统安全性的前提下,尽可能满足每个进程的资源需求。本文将通过C语言编程,实现一个简单的银行家算法模拟程序,并展示其运行结果和分析。

实验目的

(1)理解利用银行家算法避免死锁的问题;
(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。
(3)理解和掌握安全序列、安全性算法

实验内容

(1)编程实现银行家算法
(2)编程实现安全性算法
基本要求:
(1)能够根据给定的资源分配情况,及某进程提出的资源请求,通过算法得出是否能够进行分配。
(2)如能分配,需得出相应的安全序列。

实验原理

银行家算法是一种死锁避免算法,它通过模拟所有资源的预定最大可能数量的分配来测试安全性,然后在决定是否分配之前进行“s-state”检查以测试所有其他未决活动的可能死锁条件应该允许继续²。

银行家算法之所以得名,是因为该算法可用于银行系统,以确保银行不会耗尽资源,因为银行永远不会以无法再满足要求的方式分配资金所有客户的需求²。

以下是该算法的工作原理¹:

  1. 系统跟踪可用资源总量和分配给每个进程的资源。
    2.当一个进程请求一些资源时,系统检查它是否可以分配它们而不会导致死锁。
  2. 如果可以安全地授予请求(即不会造成死锁),系统会分配资源并更新其记录。
  3. 如果不能安全地授予请求(即会导致死锁),系统将拒绝该请求。

实验过程

代码如下

#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语言编写了一个银行家算法模拟程序,该程序可以接收用户输入的进程数、资源种类、每种资源的总数、每个进程已分配的资源数、每个进程还需要的资源数等信息,并根据银行家算法判断系统是否处于安全状态,以及是否可以满足某个进程的资源请求。我们通过多组测试数据验证了程序的正确性和鲁棒性,并对程序的运行结果进行了分析和总结。

通过这次实验,我们加深了对计算机操作系统中资源管理和死锁避免的理解,掌握了银行家算法的原理和实现方法,提高了编程和调试的能力,也体会到了动态分配算法在实际应用中的重要性和优势。

相关文章:

计算机操作系统实验:银行家算法模拟

目录 前言实验目的实验内容实验原理实验过程代码如下代码详解算法过程运行结果 总结 前言 本文是计算机操作系统实验的一部分&#xff0c;主要介绍了银行家算法的原理和实现。银行家算法是一种用于解决多个进程对多种资源的竞争和分配的算法&#xff0c;它可以避免死锁和资源浪…...

机器学习:多项式拟合分析中国温度变化与温室气体排放量的时序数据

文章目录 1、前言2、定义及公式3、案例代码1、数据解析2、绘制散点图3、多项式回归、拟合4、注意事项 1、前言 ​ 当分析数据时&#xff0c;如果我们找的不是直线或者超平面&#xff0c;而是一条曲线&#xff0c;那么就可以用多项式回归来分析和预测。 2、定义及公式 ​ 多项…...

一个 24 通道 100Msps 逻辑分析仪

这是一个创建非常便宜的逻辑分析仪的项目&#xff0c;但其功能可与昂贵的商业分析仪相媲美。该分析仪可以以每秒 1 亿个样本的最高速度对多达 24 个通道进行采样&#xff0c;并且可以通过单个通道中的极性变化或多达 16 个通道形成的模式来触发。 该项目不仅包含硬件&#xff0…...

使用Process Explorer和Dependency Walker排查C++程序中dll库动态加载失败问题

目录 1、exe主程序启动时的库加载流程说明 2、加载dll库两种方式 2.1、dll库的隐式引用...

网工Python:如何使用Netmiko的SCP函数进行文件传输?

在网络设备管理中&#xff0c;传输配置文件、镜像文件等是经常需要进行的操作。Netmiko是一个Python库&#xff0c;可用于与各种网络设备进行交互&#xff0c;提供了一些用于传输文件的函数&#xff0c;其中包括SCP&#xff08;Secure Copy Protocol&#xff09;函数。本文将介…...

题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和--不能完全通过,最好情况通过67.

原题链接&#xff1a; 题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和 https://www.dotcpp.com/oj/problem3166.html 致歉 害&#xff0c;首先深感抱歉&#xff0c;这道题还是没有找到很好的解决办法。目前最好情况就是67分。 这道题先这样跳过吧&#xff0c;当然以后还…...

ChatGPT- OpenAI 的 模型(Model) 介绍

ChatGPT的火爆程度大家都知道了&#xff0c;该章节我们来了解一下 ChatGPT 一个关键概念 - 模型(Model)。主要是为大家介绍一下在 OpenAI 中&#xff0c;究竟有哪些模型可以使用。 在后续的章节&#xff0c;我们会分单独的小章节逐一的为大家介绍各个不同模型的调用以及接口参…...

X 态及基于 VCS 的 X-Propagation 检测

&#x1f525;点击查看精选 IC 技能树系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#…...

数据库之事务隔离级别详解

事务隔离级别详解 一、事务的四大特性&#xff08;ACID&#xff09;1. 原子性(atomicity)&#xff1a;2. 一致性(consistency)&#xff1a;3. 隔离性(isolation)&#xff1a;4. 持久性(durability)&#xff1a; 二、事务的四种隔离级别1. 读未提交(Read uncommitted)&#xff1…...

守护进程、僵尸进程、孤儿进程

守护进程、僵尸进程、孤儿进程 守护进程&#xff08;Daemon Process&#xff09; 定义 守护进程又称Daemon进程&#xff08;精灵进程&#xff09;&#xff0c;是Linux中的后台服务进程。 它的生命周期较长&#xff0c;通常独立于控制终端并且周期性地执行某种任务或者等待处…...

软件设计师笔记

软件设计师笔记 计算机组成与体系结构 数据的表示、计算机结构、Flynn分类法、CISC与RISC、流水线技术、存储系统、总线系统、可靠性、校验码 1. 数据的表示 &#xff08;一&#xff09;进制转换 R进制转十进制使用按权展开法&#xff1a; 十进制转R进制使用短除法 二进制…...

4_用dockerfile制作镜像

Docker 镜像原理 思考&#xff1a; Docker 镜像本质是什么&#xff1f; Docker 中一个centos镜像为什么只有200MB&#xff0c;而一个centos操作系统的iso文件要几个个G&#xff1f; Docker 中一个tomcat镜像为什么有500MB&#xff0c;而一个tomcat安装包只有70多MB&#xff…...

肝一肝设计模式【四】-- 建造者模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 文章目录 系列文章目录前言一、什么是建造者模式二、举个栗子三、静态内部类写法四、开源框…...

从设计到产品

从设计到产品 最近上的一些课的笔记&#xff0c;从 0 开始设计项目的角度去看产品。 设计系统 设计系统(design system) 不是 系统设计(system design)&#xff0c;前者更偏向于 UI/UX 设计部分&#xff0c;后者更偏向于实现部分。 个人觉得&#xff0c;前端开发与 UI/UX 设…...

《疯狂Python讲义》值传递的细节

函数的参数包含着整个程序的规范性&#xff0c;之前还是没有那么去注意重要的细节&#xff0c;读完书中函数值传递篇章&#xff0c;还是有所收获的。 参数有两种形式&#xff0c;一种是形参一种是实参&#xff0c;形参可以理解为实参的载体&#xff0c;函数当中的关键词也是描…...

【7. ROS 中的 IMU 惯性测量单元消息包】

欢迎大家阅读2345VOR的博客【6. 激光雷达接入ROS】&#x1f973;&#x1f973;&#x1f973; 2345VOR鹏鹏主页&#xff1a; 已获得CSDN《嵌入式领域优质创作者》称号&#x1f47b;&#x1f47b;&#x1f47b;&#xff0c;座右铭&#xff1a;脚踏实地&#xff0c;仰望星空&#…...

pcie m.2固态硬盘装机后无法识别到启动盘

1、第一种情况《系统版本过低》 原因&#xff1a; 使用m.2固态硬盘的电脑&#xff0c;最好安装iwn8.1以上的系统&#xff0c;因为win7系统及其win xp系统 没有自带NVME驱动。 搞定办法&#xff1a; 比较简单的方式就是直接开运行快启动u盘启动盘制作工具将系统升级到win10系…...

Java Web应用开发 ——第四章:JavaBean技术测验

一.单项选择题&#xff08;共13题,55.9分&#xff09; 1 在 JSP 中调用 JavaBean 时不会用到的标记是&#xff1a;&#xff08; &#xff09; 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到操作系统从进程到线程 从这篇开始&#xff0c;我将会开启高性能&#xff0c;高并发系列&#xff0c;本篇是给系列的开篇&#xff0c;主要关注 多线程以及线程池。 一切要从CPU说起 你可能会有疑问&#xff0c;讲多线程为何…...

IPED云存储API密钥轮换:定期更新访问凭证的安全策略

IPED云存储API密钥轮换&#xff1a;定期更新访问凭证的安全策略 【免费下载链接】IPED IPED Digital Forensic Tool. It is an open source software that can be used to process and analyze digital evidence, often seized at crime scenes by law enforcement or in a cor…...

kubectl-ai:革命性Kubernetes插件,让OpenAI GPT为你自动生成部署清单

kubectl-ai&#xff1a;革命性Kubernetes插件&#xff0c;让OpenAI GPT为你自动生成部署清单 【免费下载链接】kubectl-ai ✨ Kubectl plugin for OpenAI GPT 项目地址: https://gitcode.com/gh_mirrors/ku/kubectl-ai kubectl-ai是一款革命性的Kubernetes插件&#xff…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...