21-死锁的解除及银行家算法

news2024/12/25 12:35:12

预防死锁

不允许死锁的发生

静态策略:预防思索

破坏互斥条件

如果能把互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态,比如SPOOLing技术,操作系统可以采用SPOOLing技术把独占设备在逻辑上改造为共享设备。
使用了SPOOLing技术后,在各进程看来,自己对打印机资源的使用请求立即被接受处理了,不需要再阻塞等待.
缺点
并不是所有的资源都可以改造成可共享的资源,并且为了系统安全,很多地方还必须要保护这种互斥性,因此,很多时候都无法破坏互斥条件。

破坏不可剥夺条件

方案一

当某个进程请求新的资源得不到满足时,它必须主动释放保持的所有资源,待以后需要时再申请

方案二

当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助。这种方式一般要考虑操作系统的优先级(比如:[[002-2-2-调度#剥夺调度方式 抢占式 |剥夺调度方式]])
缺点

  1. 实现起来复杂
  2. 释放已获得的资源可能会造成前一阶段的工作的失效,因此这种方法一般只适用于易保存和恢复的状态
  3. 反复地申请和释放资源意味着增加系统开销,降低系统吞吐量
  4. 若采用方法一,意味着只要暂时得不到某个资源,之前获得的那些资源都要放弃,如果一直这样,将导致进程饥饿

破坏请求和保持条件

静态分配

静态分配方法:即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行,一旦投入运行后,这些资源就一直归他所有,该进程不会再请求别的任何资源
缺点:有的资源可能使用很短的时间,因此如果整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率低.另外,该策略也有可能导致某些进程饥饿

破坏循环等待条件

可以采用顺序资源分配法,首先给系统中的资源编号,规定每个进程必须要按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。
一个进程只有已占用小编号的资源的时候,才能有资格申请更大编号的资源,按此规则,已持有大编号资源的进程不可能逆向的回来申请小编号资源,从而不会产生循环等待的现象。
缺点:

  1. 不方便增加新的设备,因此可能需要重新分配所有的编号
  2. 进程实际使用资源的顺序可能和编号递增顺序不一致,可能导致资源的浪费
  3. 必须按规定次序申请资源,用户编程麻烦

动态策略:避免死锁

安全序列请添加图片描述

所谓安全序列,就是如果系统按照这种顺序分配资源,则每个进程都能顺序完成,只要能找到一个安全序列,系统就是安全状态,当然,安全序列可能有多个。

不安全状态

不安全状态:如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们再分配资源之前总是要考虑到最坏的情况。
如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)。

银行家算法

银行家算法的核心思想:在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源的分配请求。如果会进入不安全状态,就暂时不答应这种请求,让该进程先阻塞等待。
银行家算法是Dijsktra为银行系统设置的,后来为了避免死锁。请添加图片描述
此时系统是否处于安全状态?—>尝试找到一个安全序列
请添加图片描述
每一轮检查都从编号较小的进程开始检查,实际做题时可以更快速的得到安全序列。

银行家代码实现

假设系统中有n个进程,m种资源,每个进程在运行前先声明对各种资源的最大需求数,则可用一个nxm的矩阵(可用二维数组实现)表示所有进程对各种资源的最大需求数,不妨设为最大需求矩阵Max,Max[i,j]=K表示进程Pi最多需要K个资源Rj。同理,系统可以用一个nxm的分配矩阵Allocation表示对所有进程的资源分配情况,Max-Allocation=Need矩阵,表示各进程最多还需要多少各类资源
另外还要用一个长度为m的一维数组Available表示当前系统中还有多少可用资源。
当进程Pi向系统申请资源,可用一个长度为m的一维数组Request,表示本次申请的各种资源量。
可用银行家算法预判本次分配是否会导致各种系统进入不安全状态。

① 如果request[j]<=Need[i,j]便会转向②,否则认为出错
② 如果request[j]<=Available[j]便转向③,否则表示尚无足够资源,Pi必须等待
③ 系统试探着把资源分配给Pi,并修改相应的数据(并非真的分配,修改数值只是为了做预判).
Available=Available-Request;
Allocation[i,j]=Allocation[i,j]+Request[j];
Need[i,j]=Need[i,j]-Request[j];
④ 操作系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全则正是分配,否则恢复相应数据,让进程阻塞等待。

银行家算法的步骤:

  1. 进程此次请求是否超过了之前声明的最大需求数
  2. 检查此时系统剩余的可用资源是否还能满足这次请求
  3. 试探着分配,更改各数据结构
  4. 用安全性算法检查此次分配是否会导致进入不安全状态
    安全性算法步骤:
    检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
    不断重复上述过程,看最重是否能让所有的进程都加入安全序列## 允许死锁的发生

死锁的检测

死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁
为了能对系统是否已发生了死锁进行检测,必须:

  1. 用某种数据结构来保存资源的请求和分配信息
  2. 提供一种算法,利用上述信息来检测系统是否进入死锁状态
    请添加图片描述
    如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时是不会阻塞的,可以顺利地执行下去。
    如果这个进程执行结束了把资源归还系统,就可能使某些正在等待资源的进程被激活,并顺利的执行下去。
    如果能够消除所有边,就称这个图是可完全简化,此时一定没有发生死锁。
    如果不能消除所有边,那么此时就是发生了死锁。最终还连着边的进程就是死锁检测进程。
    请添加图片描述

死锁的解除

死锁解除算法:当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解除出来。
一旦检测出死锁,就应该立即解除死锁。

资源剥夺法

挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他死锁进程,但是应方式被挂起的进程长时间得不到资源而饥饿。

撤销进程法

强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大,因为有些进程可能已经运行了很长时间,已经接近结束了,一旦终止就功亏一篑

进程回退法

让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

考虑方面

  1. 进程优先级
  2. 已执行多长时间
  3. 还要多久能完成
  4. 进程已经使用了多少资源
  5. 进程是交互式的还是批处理式的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年java面试常考知识点(12题)

一. 接⼝与抽象类区别 1、⼀个类声明可否既是abstract的,⼜是final的? 不能,这两个修式符⽭盾&#xff08;abstract就是要被继承&#xff09; 2、抽象类不⼀定包含抽象⽅法 3、有抽象⽅法,则⼀定是抽象类 4、抽象类不能被实例化&#xff0c;⼀般⽤作基类使⽤&#xff1b; a. 类…

数学建模比赛超全整理【数学建模有哪些比赛?】【全网最全数模整理】

文章目录一.全国大学生数学建模竞赛二.美国大学生数学建模竞赛三、中国研究生数学建模竞赛四、认证杯&#xff08;小美赛&#xff09;五、华数杯&#xff08;国内赛和国际赛&#xff09;六.MathorCup高校数学建模挑战赛七.全国大学生电工数学建模竞赛八.深圳杯九.数维杯大学生数…

用vue3+vant4开发的简单小众电商购物项目模板(纯前端)

简单录制如下 主要练习下界面和交互&#xff0c;顺带简单了解下 vue3 语法。 简单截图如下 首页 首页-猜你喜欢 分类 购物车 个人页面 部分文件代码 底部导航文件 <template><div class"nav" id"myNav"><divclass"nav-item-box"v…

Oracle VM VirtualBox  VMware下载使用教程

一、Oracle VM VirtualBox 使用教程官网&#xff08;https://www.virtualbox.org/wiki/Downloads&#xff09;下载安装包&#xff0c;此处选择下载的为windows版本点击安装包&#xff0c;进行安装新建虚拟机name&#xff1a;自定义虚拟机名称Folder&#xff1a;安装文件夹ISO I…

postgres源码解析48 Btree节点分裂点确认流程--1

由于Btree数据结构特性&#xff0c;当节点达到上溢条件时会发生分裂&#xff0c;进而保持Btree的原本特性 B树 详解及C语言简单实现&#xff0c;在之前的postgres 源码解析 45 btree分裂流程_bt_split已对分裂流程进行讲解&#xff0c;接下来将从源码角度学习postgres btree分裂…

揭密Realtek 致命漏洞:超过 1 亿次尝试破解物联网设备

国际知名白帽黑客、东方联盟创始人郭盛华警告说&#xff0c;自 2022 年 8 月开始&#xff0c;利用 Realtek Jungle SDK 中现已修补的关键远程代码执行漏洞进行攻击的攻击企图激增。 据郭盛华透露&#xff0c;截至 2022 年 12 月&#xff0c;正在进行的活动据称已记录了 1.34 亿…

前端sdk - 埋点

目录前端sdk 之小满np安装01 搭建环境01-项目目录01-2 依赖包01-3 rollup.config.js01-4 tsconfig.json 28行01-5 package.json01-6 src / core / index.ts01-7打包效果02 初始化 Tracher02-1 core / index.ts02-2 types/ index.ts03 重写history事件 监听history | hash 路由等…

【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战

文章目录前言I、微服务与Spring CloudII、Nacos 注册中心III、Spring Cloud Alibaba Nacos 实战1、新建父工程2、新建demo-a 服务3、新建 demo-b 服务4、实现服务调用&#xff1a;传统方式5、实现服务调用&#xff1a;NacosRibbon方式总结最后前言 Spring Cloud Alibaba微服务…

JS 设计模式(2)-- 复习

目录 策列模式 代理模式 观察者模式 发布订阅模式 模块模式 策列模式 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使他们可以相互替换&#xff0c;且算法的变化不会影响使用算法的用户&#xff0c;策列模式属于对象行为模式&#xff0c;它通过…

Java面试题(自用-持续更新)

本文目录如下&#xff1a;Java面试题一、基础知识JDK 和 JRE 有什么区别&#xff1f;String 属于基础的数据类型吗&#xff1f;基础类型有哪些?String str"xqz"与 String strnew String("xqz")一样吗&#xff1f;java 中操作字符串都有哪些类&#xff1f;…

王佩丰 Excel 基础24讲 | 学习笔记(全)

第一讲&#xff1a;认识Excel 1.简介 excel能做什么&#xff1f; 数据存储 → 数据处理 → 数据分析 → 数据呈现 excel界面 补充&#xff1a;Excel数据分析步骤 ①提出问题&#xff1a;明确自己需要通过数据分析解决什么问题 ②理解数据&#xff1a;理解数据各个字段的含义…

【手写 Promise 源码】第十五篇 - 了解 generator 生成器

一&#xff0c;前言 上一篇&#xff0c;实现了 promisify 和应用场景介绍&#xff0c;主要涉及以下几个点&#xff1a; promisify 简介和测试&#xff1b;promisify 功能的实现&#xff1a;promisify、promisifyAll&#xff1b; 目前&#xff0c;Promise 部分已基本完成&…

FPGA实现图像任意位置显示,串口协议控制显示位置,提供工程源码和技术支持

目录1、图像任意位置显示理论基础2、设计思路和架构3、OV5640图像采集4、图像DDR3三帧缓存5、图像任意位置输出显示6、串口协议控制显示位置7、vivado工程介绍8、上板调试验证9、福利&#xff1a;工程源码获取1、图像任意位置显示理论基础 图像任意位置显示指的是在显示屏上的…

Linux新手渣渣上路史

时至2022年&#xff0c;IT行业的迅速发展大家也有目共睹&#xff0c;IT行业在社会的发展中起着举足轻重的作用。其中一角Linux系统&#xff0c;从诞生到开源&#xff0c;再到现在受大众的欢迎&#xff0c;是一个很好的例子。Linux和windows类似&#xff0c;是一个操作系统&…

java 微服务高级之分布式事务 Seata框架 CAP定理 BASE理论 XA模式 AT模式 TCC模式 SAGA模式

分布式事务问题 1.1.本地事务 1.2.分布式事务 一旦有一个失败了&#xff0c;其他两个不知情失败的情况&#xff0c;还是执行并成功 在分布式系统下&#xff0c;一个业务跨越多个服务或数据源&#xff0c;每个服务都是一个分支事务&#xff0c;要保证所有分支事务最终状态一致…

【JavaEE】线程安全的集合类

引言 在Java标准库中&#xff0c;大部分集合类都是线程不安全的。Vector(比ArrayList多了同步化机制就变得线程安全了)&#xff1b;Stack(继承Vector)&#xff1b;Hashtable(只比Hashmap多了线程安全)&#xff1b;以Concurrent开头的集合类&#xff1a;ConcurrentHashMap、Con…

Echarts 用图形纹理来填充颜色(color - pattern)

第006个点击查看专栏目录在上一篇文章中已经讲过 ECharts线性渐变色示例演示&#xff08;2种渐变方式&#xff09;&#xff0c;这个示例的颜色使用纹理来做填充&#xff0c;纹理填充&#xff1a; pattern color:{ //纹理填充 image: patternImg, repeat: ‘repeat’ } 示例效果…

禾川HCQ ModBUS+485主从站调试

硬件&#xff0c;485转usb&#xff0c;如果主站是plc&#xff0c;不需要这个线&#xff0c;我现在主站是电脑&#xff0c;调试用。 HCQ0 禾川控制器。 软件 modbus tools 调试软件&#xff0c;自行下载吧&#xff0c;社区传不上去。 硬件连接时注意交叉连接&#xff0c;HCQ0 A端…

MATLAB 逻辑数组

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Java⽇志框架学习笔记

目录 1.⽇志概述 1.1 ⽇志是⽤来做什么的&#xff1f; 1.2 为什么要⽤到⽇志框架&#xff1f; 1.3 现有的⽇志框架有哪些&#xff1f; 1.4 ⽇志⻔⾯技术 2.logback 2.1 logback介绍 2.1.1 logback 模块 2.1.2 logback 组件 2.1.3 logback 配置 2.1.4 logback.xml 配…