OS复习笔记ch6-2

死锁的解决

  1. 死锁的预防(打疫苗)
  2. 死锁的避免(戴口罩)
  3. 死锁的检测(做核酸)

死锁的预防

前面我们提到了死锁的四个必要条件

  • 防止前三个必要条件,就是间接预防
  • 防止最后一个必要条件–循环等待,就是直接预防

接下来我们讨论一下这四个条件如何预防

  1. 互斥访问:系统属性不可修改,必须支持
  2. 保持和请求:要求一次性请求所需的全部资源
    • 进程得到资源前要阻塞很长时间
    • 降低了系统利用率和并发程度
    • 有可能无法预先知道所需资源
  3. 不可剥夺:修改为可剥夺
    1. OS可以实现,适用于资源的使用状态可以保存并恢复
    2. 处理器和内存的资源可剥夺(上下文、页面置换算法)
  4. 循环等待:
    1. 需要定义一个资源类型的线性序,资源在申请的时候必须按照这个序
    2. 效率不高,减缓了进程的推进,以及不必要地拒绝资源访问

死锁的避免

系统需要动态作出决定:如果当前资源分配请求满足,是否会导致死锁。

  • 需要未来的进程资源请求
  • 动态判定当下情况有没有可能发生死锁

两种方式:

  1. 拒绝进程启动:如果进程资源请求可能导致死锁则不启动进程

  2. 拒绝资源访问:如果本次分配可能导致死锁,则拒绝进程的增量资源请求

拒绝进程启动

系统中有n个进程,m种资源

image.png

  • R是资源总数矩阵
  • V是可用的资源矩阵
  • claim是最大需求矩阵
  • allocation是已经分配的资源矩阵

保守策略
image.png

e.g.
image.png
假设银行有账面200万,有三个客户来贷款,总量分别是100、80、60万。按照保守策略,银行对第一个用户和第二个用户贷款申请可以批准一次付清,但是第三个用户就不能批准了,相当于拒绝了第三个用户的贷款申请(类比进程启动)。

拒绝资源分配

著名的银行家算法

假设按照上述案例,银行分批贷款,第一次分配完后账面只剩下10万,此时第二轮分期只能给user2,否则user1和3满足不了,后期也收不回本金。所以,银行只能一直拒绝两者的催款直到user2还款。(类比系统资源,OS会根据当前状况动态决定资源分配,是否需要拒绝进程的资源申请)。

这里就要找到安全序列,该序列可以依次满足不同用户的最大需求。

来看OS如何进行资源分配
image.png

R = V + A(资源总数 = 可用资源+已经分配的资源)

这里遍历矩阵C - A每行和V对比,找到某个在有限时间内可以执行完将资源归还给系统的进程。经过多次分配,直到所有进程运行完毕,然后得到安全分配序列。
如上图,能符合011的就只有P2进程可以满足,也就是说OS接下来只能一次满足P2进程的资源申请要求,此时安全队列中加入P2。P2执行结束之后释放自己的所有资源,此时可用资源就变成了673。

image.png

同理,我们按照之前的分配策略,可以发现对于这四个进程的唯一安全分配序列是P2→P1→P3→P4.

举一个不安全示例
当进程1在第一次剩余资源分配的时候请求资源R3,如果OS分配出去,会导致进程2也不能满足最大需求,这个时候就找不到安全分配序列,很容易发生死锁,所以之前就要拒绝进程1的资源分配请求。

教科书上给了伪代码,感兴趣的小伙伴可以看一下
image.png

image.png

避免死锁有一些优势,但是缺点也很明显。
优势

  • 不需要如死锁检测一样抢占、回滚进程
  • 同死锁预防相比,资源分配限制少
    缺点
  • 需要提前声明最大资源请求
  • 设计进程独立且无同步需求
  • 分配资源数目固定
  • 当拥有资源时进程不退出

一般通用的OS很难满足上述需求,所以只能是理论上分析。但是对于一些嵌入式系统,由于代码和硬件固化,或许可以按照银行家算法去设计避免死锁。

死锁的检测

检测频率

检测的频率如何控制呢?
如果每次资源请求的时候都检查是否有死锁,系统开销就会很大

两个思路

  • 进程阻塞时间过长则检测
  • 资源利用率下降则检测

这里可以使用拓扑排序找资源分配回路(需提前简化,以防伪回路)
这个涉及图论中的邻接矩阵的表示,利用的也是前面的V、A,还有一个请求矩阵Q
所有进程都要先打上“未死锁”标签,然后检查进程序列的标签中是否有“死锁”

具体执行过程见PPT,这里不做重点
image.png
image.png

image.png
让我们来分析一些各个进程的情况:
首先,p4肯定没问题,因为它的的分配矩阵行全为0,第一步就被标记了。p3在p4的基础上没问题,因为执行第三步的时候发现p3满足条件1,于是第四步p3被标记。
而p1、p2死锁,因为返回到步骤三发现此时已经找不到符合条件的进程了,检测终止,此时两个进程未标记符合死锁条件。

当然,也可以用上一节学的进程请求/资源分配图来看,更直观一些。

恢复策略
  • 中止所有死锁进程
  • 死锁进程回退到某个预定义的检查点,重新启动所有进程(下一次可能还会发生死锁)
  • 依次中止死锁进程,可以逐步解决
  • 剥夺进程死锁的资源

而上述选择中止的死锁进程准则

  • 到目前为止,使用处理器时间最少(有效执行时间最短)
  • 到目前为止,产生输出最少(比如写数据最少)
  • 估计剩余的执行时间最长(第九章调度策略)
  • 到目前为止,分配资源最少的(拥有的资源最少)
  • 考虑进程的优先级最低的进程

亦可以采用复合准则加权统一各个原则

综合死锁策略

举例

  • 将各种资源归入若干不同的资源类
  • 每一类资源使用线性序申请预防
  • 对同一资源类中的资源,采用适当的方法

例如数据库管理系统

  • Swappable space: 对换用的磁盘块(空间足够),一次性分配所需所有资源来预防或死锁避免
  • Process resources: 可分配资源(磁带机、文件),避免或基于资源排序的预防
  • Main memory: 页或段,基于剥夺的预防
  • Internal resources: 如 I/O channels,基于资源排序的预防(早期的磁带机等)

总结

image.png

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

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

相关文章

【NumPy】关于numpy.median()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

9.Redis之list类型

list相当于链表、数据表 1.list类型基本介绍 列表中的元素是有序的"有序"的含义,要根据上下文区分~~有的时候,谈到有序,指的是"升序","降序”有的时候,谈到的有序,指的是, 顺序很关键~~如果把元素位置颠倒,顺序调换.此时得到的新的 List 和之前的 Li…

Linux(六)

Linux(六) 自定义头文件自定义头文件中写什么如何引入头文件条件编译条件编译作用 gcc工作原理Make 工作管理器什么是Make什么是Makefile/makefileMakefile假目标Makefile中的变量自定义变量预定义变量自动变量 Makefile中变量展开方式递归展开方式简单展…

【C++】二分查找算法

1.题目 2.算法思路 暴力解法:可以将数组遍历一遍,就可以找到。时间复杂度为O(n)。不算太差,可以接受。 但是有更优秀的解法: 就是二分查找算法。 算法的特点:我们所查找的“数组”具有二段性。这里的二段性不一定有…

Vue 安装vue

1、官网安装下载安装nodejs 2、安装完成后,通过命令查看版本,可以查看到版本 node -v npm -v 3、安装Vue CLi npm install -g vue/cli 4、创建项目,vue create test 如果遇到报错: ERROR Error: spawn yarn ENOENT Error: spawn yarn ENOENT at ChildP…

人工智能+跨癌种分析,能否解决医学数据样本量小的问题?【医学AI|顶刊速递|05-26】

小罗碎碎念 先说明,目前小罗只是硕士,以下个人观点很有可能不准确,欢迎批评指正!!小罗虚心听取有益建议!! 众所周知,医学数据相比于其他领域的数据来说,属于小样本数据。…

【仿RabbitMQ消息队列项目day4】GTest测试框架使用

一.什么是GTest? GTest是一个跨平台的 C单元测试框架,由google公司发布。gtest是为了在不同平台上为编写C单 元测试而生成的。 二.使用 TEST(test_case_name, test_name):主要用来创建⼀个简单测试, 它定义了一个测试函数, 在这个…

【NumPy】关于numpy.sum()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

安卓自定义控件(视图、改造控件、通知Notification、界面绘制)

视图的构建过程 此节介绍一个视图的构建过程,包括:如何编写视图的构造方法,4个构造方法之间有什么区别;如何测量实体的实际尺寸,包含文本、图像、线性视图的测量方法;如何利用画笔绘制视图的界面&#xff…

Ubuntu22.04设置程序崩溃产生Core文件

Ubuntu22.04设置程序崩溃产生Core文件 文章目录 Ubuntu22.04设置程序崩溃产生Core文件摘要Ubuntu 生成Core文件配置1. 检查 core 文件大小限制2. 设置 core 文件大小限制3. 配置 core 文件命名和存储路径4. 重启系统或重新加载配置5. 测试配置 关键字: Ubuntu、 C…

跨平台之用VisualStudio开发APK嵌入OpenCV(一)

序 本篇是杂谈以及准备工作(此处应无掌声) 暂时不管iOS(因为开发hello world都要年费) 软件: Visual Studio 2019(含Android SDK和NDK编译器等) OpenCV 这是一个女仆级的系列文章&#xf…

代码随想录|Day56|动态规划 part16|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 class Solution: def minDistance(self, word1: str, word2: str) -> int: dp [[0] * (len(word2) 1) for _ in range(len(word1) 1)] for i in range(len(word1) 1): dp[i][0] i for j in range(len(word2) 1): dp[0][j] j for i in rang…

OpenStack平台Nova管理

1. 规划节点 使用OpenStack平台节点规划 IP主机名节点192.168.100.10controller控制节点192.168.100.20compute计算节点 2. 基础准备 部署的OpenStack平台 1. Nova运维命令 (1)Nova管理安全组规划 安全组(security group)是…

网上比较受认可的赚钱软件有哪些?众多兼职选择中总有一个适合你

在这个互联网高速发展的时代,网上赚钱似乎成了一种潮流。但是,你是否还在靠运气寻找赚钱的机会?是否还在为找不到靠谱的兼职平台而苦恼? 今天,就为你揭秘那些真正靠谱的网上赚钱平台,让你的赚钱之路不再迷…

1107 老鼠爱大米

solution 记录每组的最大值&#xff0c;并比较组间的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

Docker compose 的方式一键部署夜莺

官方安装文档&#xff1a;https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v7/install/docker-compose/ 介绍&#xff1a;夜莺监控是一款开源云原生观测分析工具&#xff0c;采用 All-in-One 的设计理念&#xff0c;集数据采集、可视化、监控告警、数据分析…

python列表元素的增减之道:删除篇

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、前言 二、删除元素的基本方法 1. 使用remove()方法 2. 使用pop()方法 3. 使用del语句…

ICML 2024 | 北大、字节提出新型双层位置编码方案,有效改善长度外推效果

在这项工作中&#xff0c;我们利用语言序列的内在分段特性&#xff0c;设计了一种新的位置编码方法来达到更好的长度外推效果&#xff0c;称为双层位置编码&#xff08;BiPE&#xff09;。对于每个位置&#xff0c;我们的 BiPE 融合了段内编码和段间编码。段内编码通过绝对位置…

从用法到源码再到应用场景:全方位了解CompletableFuture及其线程池

文章目录 文章导图什么是CompletableFutureCompletableFuture用法总结API总结 为什么使用CompletableFuture场景总结 CompletableFuture默认线程池解析&#xff1a;ForkJoinPool or ThreadPerTaskExecutor&#xff1f;ForkJoinPool 线程池ThreadPerTaskExecutor线程池Completab…

AI教母李飞飞:现在的AI根本没有主观感觉能力

通用人工智能 (AGI) 是用来描述至少在人类展示&#xff08;或可以展示&#xff09;智能的所有方面都与人类一样聪明的人工智能代理的术语。这就是我们过去所说的人工智能&#xff0c;直到我们开始创建无可否认“智能”的程序和设备&#xff0c;但这些程序和设备只在有限的领域—…