死锁预防之银行家算法

死锁预防之银行家算法

第一章 概述

Dijkstra提出了一种能够避免死锁的调度算法,称为银行家算法。

它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位的资金来为客户服务,而不是满足所有客户贷款需求的最大单位。

这里将客户比作进程,贷款比作设备,银行家比作系统。

客户们各自做自己的生意,在某些时刻需要贷款。在某一时刻,客户已获得的贷款和可用的最大数额贷款称为与资源分配相关的系统状态。一个状态被称为是安全的,其条件是存在一个状态序列能够使所有的客户均得到其所需的贷款。如果忽然所有的客户都申请,希望得到最大贷款额,而银行家无法满足其中任何一个的要求,则发生死锁。不安全状态并不一定导致死锁,因为客户未必需要其最大贷款额度,但银行家不敢抱这种侥幸心理。

银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。若是,则不满足该请求;否则便满足。

检查状态是否安全的方法是看他是否有足够的资源满足一个距最大需求最近的客户。如果可以,则这笔投资认为是能够收回的,然后接着检查下一个距最大需求最近的客户,如此反复下去。

如果所有投资最终都被收回,则该状态是安全的,最初的请求可以批准。

第二章 基本原理分析
一、死锁

(一)死锁概念:

指的是多个进程在运行过程中因为争夺资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,他们都将无法再向前推进的状态。
(二)死锁产生的原因:

竞争非可剥夺性资源

进程推进不当。

(三)产生死锁的必要条件

1、互斥条件 2、请求和保持条件 3、不可剥夺条件 4、环路等待。

(四)处理死锁的基本方法:

预防死锁:属于事前预防的策略,通过设置某些限制条件,去破坏产生死锁的四个必要条件或其中的几个条件。预防死锁比较容易实现,所以被广泛使用,但是由于施加的限制条件过于严格可能会导致系统资源利用率和系统吞吐量降低。

避免死锁:属于事前预防的策略,但它并不需要事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的产生。但实现有一定的难度。目前较完善的系统中常用此法来避免死锁。

检测死锁:这种方法不需要事前采取任何限制措施,也不用检查是否进入不安全状态,而是允许系统在运行的过程中发生死锁。但是通过系统所设置的检测机构,及时的检测出死锁的发生,并精确的测出与死锁有关的进程和资源,然后,采取适当的措施,从系统中将已发生的死锁清楚掉。

解除死锁:这是与检测死锁相配套的一套措施。当检测到系统已经产生死锁时,须将进程从死锁中解放出来。通常用到的实施方法是撤销或挂起一些进程,以便收回一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源和吞吐量,但在现实上难度也最大。

预防死锁和避免死锁的区别:预防死锁和避免死锁实质上都是通过施加某种相知条件的方法,来预防发生死锁。两者的主要区别:为了预防死锁所施加的限制条件较为严格,这往往会影响到进程的并发执行,而避免死锁所施加的限制条件则较为宽松,有利于进程的并发执行。

二、为什么引入银行家算法:

​ 预防死锁虽然可以预防死锁的产生,但是以牺牲进程的执行效率为代价,而死锁的避免由于施加的限制条件较弱,对进程的影响较小,有可能使用户获得满意的系统性能。在该方法中把系统状态分成安全状态和不安全状态,只要能使系统出于安全状态,便可避免死锁。因此,死锁的避免对防止系统进入不安全状态用重要意义。

​ 最具代表性的避免死锁算法是Dijkstra的银行家算法。银行家算法是通过自己特有的算法,在每次奉陪给进程系统资源前,先试探性的“假设”分配资源给进程Pi,再通过安全性算法检测此次分配是否会导致系统进入不安全状态,如果分配后系统依然安全则系统将资源正是分配给进程Pi;如果此次分配导致系统进入不安全状态,则暂不分配资源给进程Pi。

​ 通过这种机制,系统可以有效的避免死锁的产生,确保系统时时刻刻都处在安全状态。所以,要想深入了解避免死锁机制的,就必须掌握银行家算法的原理,及算法实现过程。

第三章 系统设计
一、使用数据结构的描述

(一)二维数组

表3.1:二维数组及其意义表

二维数组 意义
Max_Need_Dev[Max][Num_Dev] 所有进程所需要的设备的最大数目
Allocation_Dev [Max][Num_Dev] 所有进程已经分配到的设备的数目
Need_Dev [Max][Num_Dev] 所有进程还需要的设备的数目
current_Available_Dev[Max][Num_Dev] 记录分配完之后,此时系统的可用资源数目
current_recycle_Dev[Max][Num_Dev] 记录回收完之后,系统中各个设备的数目

(二)一维数组

表3.2:二维数组及其意义表

一维数组 意义
system_Dev[Num_Dev] 系统中所拥有的各类设备的数量
Available_Dev[Num_Dev] 所系统中剩余的资源数量
finish [Max] 存放所有进程是否已经运行完毕
quene[Max] 假设不会出现死锁,那么用于存放安全队列。 即记录每个进程的下表。
二、使用程序结构的描述

表3.3:程序结构及其意义

程序 功能
初始化init() 输入进程数量、资源种类、资源可利用量、进程资源已分配量、进程最大需求量
allocation() 用于进行银行家算法,进行安全性检查
比较conpare() 用于判断当前可用设备的数目是否可以满足所传入的进程的要求
回收recycle 若一个进程运行完毕,回收已经分配给它的设备
返回进程状态print() 显示当前资源分配详细情况
当前安全性检查flag 用于判断当前状态安全
主程序main() 逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行

三、银行家算法流程图
在这里插入图片描述

图3.1 银行家算法流程图

四、银行家算法流程

初始化:设置资源总量,每个进程所需要的最大资源量和已经分配的资源量。计算出此时系统中可用资源量和每个进程还需要的资源数。

接收请求:当一个进程请求一定数量的资源时,它必须向操作系统提交一个请求。如果该请求合理且确保分配后不会导致死锁,则操作系统将为该进程分配所需的资源。

分配资源:根据银行家算法的安全性原则来检查是否可以为该进程分配某类或者多类资源。如果分配后系统仍处于安全状态,则为该进程分配一个可用的资源并将其从系统中移除。

回收资源:当进程释放由它占用的资源时,操作系统将添加被释放的资源到可用资源池中,并重新计算可用资源量。

安全检查:通过模拟分配资源的过程来检查系统是否处于安全状态。如果系统处于安全状态,则可以继续为进程分配资源;否则,必须等待,直到系统处于安全状态。

进程完成:当进程完成运行并释放了其全部资源时,可以删除该进程。这些资源现在可以供其他进程使用。

第四章 系统功能实现

代码如下:

#include<stdio.h>

#include<stdlib.h>

#define Num_Dev 3   // 每个进程所需的设备的种类数量

#define Max 10      //可容纳的最多的进程数量

int Max_Need_Dev Max;    //所有进程所需要的设备的最大数目

int Allocation_Dev Max;      //所有进程已经分配到的设备的数目

int Need_Dev Max;        //所有进程还需要的设备的数目

int current_Available_DevMax;    //记录分配完之后,此时系统的可用资源数目(因为假如会产生安全队列,那么有多少个进程就会产生多少次这样的当前分配后的可用资源数目)

int current_recycle_DevMax;          //记录回收完之后,系统中各个设备的数目

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业上常见的智能测量设备

工业智能测量仪包括测径仪、测宽仪、测厚仪和直线度测量仪等&#xff0c;主要用于自动化生产线上的高精度尺寸测量。这些设备通常采用光电、激光、工业相机等技术进行非接触式测量&#xff0c;以确保高效率和准确性。测径仪用于测量圆形物体的直径&#xff0c;测宽仪用于测量板…

基于springboot+vue的供应商管理系统

一、系统架构 前端&#xff1a;vue2 | element-ui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 员工注册 02. 登录 03. 管理员-首页 04. 管理员-个人中心-修改密码 05. …

Windows电脑部署Jellyfin服务端并进行远程访问配置详细教程

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…

ECharts词云图(案例一)+配置项详解

ECharts词云图&#xff08;案例一&#xff09;配置项详解 ECharts 是一款由百度团队开发的基于 JavaScript 的开源可视化图表库&#xff0c;它提供了丰富的图表类型&#xff0c;包括常见的折线图、柱状图、饼图等&#xff0c;以及一些较为特殊的图表&#xff0c;如词云图。从版…

14.编写自动化测试(上)

标题 一、如何编写测试1.1 一些概念1.2 测试函数剖析1.3 使用assert!宏检查结果1.4 使用assert_eq!和assert_ne!宏来测试相等1&#xff09; assert_eq!2&#xff09; assert_ne! 1.5 使用 should_panic 检查 panic 二、将 Result<T, E> 用于测试 一、如何编写测试 1.1 一…

数据库原理(数据库设计)——(3)

一、数据库设计概述 1.数据库设计的基本任务和目标 基本任务 根据用户的信息需求、数据库操作需求&#xff0c;设计一个结构合理、使用方便、效率高的数据库。 设计目标 满足用户的应用要求&#xff1b;准确模拟现实世界&#xff1b;能背某个DBMS&#xff08;数据库管理系统…

重磅!草料模板库更新,新增签到报名和旅游模板

本次共更新5个签到报名场景模板&#xff0c;以及6个旅游场景模板。 所有模板内容均可自定义修改&#xff0c;并可免费使用。 签到报名场景 签到报名场景更新了 活动报名、大型活动会议报名、展会邀请函、专题讲座活动报名和技能培训邀约报名 5个模板&#xff0c;基于不同的会…

前端学习-day10

文章目录 01-体验平面转换02-平移效果03-绝对定位元素居中04-案例-双开门06-转换旋转中心点07-案例-时钟-转换原点08-平面转换-多重转换09-缩放效果10-案例-按钮缩放11-倾斜效果12-渐变-线性13-案例-产品展示14-渐变-径向15-综合案例-喜马拉雅 01-体验平面转换 <!DOCTYPE h…

选专业还是选学校:分数限制下的抉择

大家好&#xff0c;我是DX3906 在高考的分数公布后&#xff0c;许多考生和家长都会面临一个棘手的问题&#xff1a;在分数限制下&#xff0c;是选择一个好专业&#xff0c;还是选择一个好学校&#xff1f;这个问题没有标准答案&#xff0c;因为每个人的情况和目标都不尽相同。本…

元宇宙三维虚拟场景制作平台为数字化营销发展注入了新的活力

​在数字化浪潮的推动下&#xff0c;我们迎来了全新的3D元宇宙场景在线制作编辑器&#xff0c;为您带来前所未有的创作体验。这款轻量级实时创作工具&#xff0c;让您轻松构建丰富的3D元宇宙场景&#xff0c;实现全网全终端的展示。 3D元宇宙场景在线制作编辑器拥有海量的3D模…

微型丝杆的耐用性和延长使用寿命的关键因素!

无论是机械设备&#xff0c;还是精密传动元件&#xff0c;高精度微型丝杆是各种机械设备中不可或缺的重要组件。它的精度和耐用性直接影响着工作效率和产品品质&#xff0c;在工业技术不断进步的情况下&#xff0c;对微型丝杆的性能要求也越来越高&#xff0c;如何提升微型丝杆…

reverse-android-淘最热点so

资源 1. com.maihan.tredian 2021版 淘最热点 2. 该 app 没有加壳 ,也没混淆。 登录抓包 POST: https://api.taozuiredian.com/api/v1/auth/login/sms POST /api/v1/auth/login/sms HTTP/1.1 Content-Type: application/json Connection: close Charset: UTF-8 User-Agen…

C++中list容器常用接口

list的基本定义: 在C中&#xff0c;list被定义为一个双向链表容器。它是标准模板库&#xff08;STL&#xff09;中的一部分&#xff0c;位于<list>头文件中。 list是一个通用模板类&#xff0c;可以存储任何类型的数据&#xff0c;因此它是一个模板类。它实现了双向链表数…

Web应用安全测试-综合利用(一)

Web应用安全测试-综合利用&#xff08;一&#xff09; 文章目录 Web应用安全测试-综合利用&#xff08;一&#xff09;1.跨站脚本攻击&#xff08;XSS&#xff09;漏洞描述测试方法GET方式跨站脚本Post方式跨站脚本 风险分析风险等级修复方案总体修复方式对于java进行的web业务…

Pycharm怎么默认终端连接远程服务器

因为经常需要从宿舍到学校内通勤&#xff0c;期间所有连接都会中断&#xff0c;所以每次开SSH特别麻烦&#xff0c;每次终端自动切换到本地&#xff1a; 每次都得点一下Start SSH Session 想要默认终端连接远程服务器&#xff0c;需要点File->Setting->Tools->SSH T…

详细描述拍立淘接口的实现过程,包括接口设计、开发、测试、部署等关键步骤

拍立淘接口的实现过程可以详细分为以下几个步骤&#xff1a; 注册与权限获取&#xff1a; 注册成为阿里巴巴开放平台开发者&#xff0c;并创建应用。获取API的调用权限和密钥&#xff08;如AppKey和AppSecret&#xff09;&#xff0c;这些密钥将用于后续的身份验证和请求签名。…

SmartEDA体验记:探索电路设计新纪元,乐趣无限!

在科技日新月异的今天&#xff0c;电路设计早已不再是专业人士的专属领域。随着智能化工具的不断发展&#xff0c;普通人也能轻松体验到电路设计的乐趣。今天&#xff0c;就让我带大家走进SmartEDA的世界&#xff0c;一起感受前所未有的电路设计之旅。 SmartEDA&#xff0c;作为…

Ubuntu如何添加用户环境变量

一&#xff0c;简介 在工作中&#xff0c;需要将某个环境变量添加到用户环境变量中&#xff0c;方便使用。 要将 SOF_WORKSPACE~/work/sof 添加到用户的环境变量中&#xff0c;需要将该设置添加到用户的 shell 配置文件中&#xff0c;例如 ~/.bashrc&#xff08;对于 Bash 用…

IEPL专线和IPLC专线有什么区别?

IEPL和IPLC是两种广泛用于国际通信的专线服务&#xff0c;IEPL是一种以太网专线服务&#xff0c;IPLC是一种传统的专线服务&#xff0c;它们在某些方面有相似之处&#xff0c;但也存在一些关键的区别。下面是IEPL和IPLC的主要区别: 1.技术和定义: IEPL: 技术: IEPL是一种以太…

推广结算统计,Xinstall助您轻松掌握每一分投入与回报!

在移动互联网时代&#xff0c;App的推广与运营离不开精准的数据支持和高效的结算系统。然而&#xff0c;面对众多的推广渠道和复杂的结算流程&#xff0c;如何确保每一分投入都能得到合理的回报&#xff0c;成为了众多企业和开发者关注的焦点。今天&#xff0c;我们就来聊聊如何…