OS复习笔记ch6-2

2024-05-26 16:52
文章标签 笔记 复习 os ch6

本文主要是介绍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

这篇关于OS复习笔记ch6-2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005043

相关文章

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi