现代操作系统读书笔记--第6章 死锁

在很多应用中,需要一个进程排他性地访问若干种资源而不是一种,容易造成死锁。
死锁也有可能发生在机器之间。
加锁过程也会产生死锁。
所以,软硬件都有可能死锁。

6.1 资源
需要排他性使用的对象称为资源,可以是硬件设备或是一组信息,简单来说,资源就是随着时间推移,必须能够获得、使用以及释放地任何东西。

6.1.1 可抢占资源和不可抢占资源
可抢占资源:可以从拥有它的进程中抢占而不会产生任何副作用,如打印机和内存资源
不可抢占资源:在不引起相关地计算失败地情况下,无法把它从占有它的进程处抢占过来(如刻盘),和死锁有关
资源是否可抢占取决于上下文环境
使用一个资源要做的事:
(1)请求资源
(2)使用资源
(3)释放资源

6.1.2 资源获取
对于数据库系统中记录这类资源,由用户进程来管理使用,使用信号量(初始化为1)或者互斥信号量。down获取资源,up释放资源
现代操作系统读书笔记--第6章 死锁_第1张图片
编码上地风格细微差别就可能造成死锁
现代操作系统读书笔记--第6章 死锁_第2张图片

6.2 死锁简介
死锁地规范定义:如果一个进程集合中地每个进程都在等待只能由该进程集合中地其他进程才能引发的时间,那么,该进程集合就是死锁
最常见的死锁:资源死锁

6.2.1 资源死锁的条件
(1)互斥条件
(2)占有和等待条件
(3)不可抢占条件
(4)环路等待条件
通过破坏上述条件就可以预防死锁

6.2.2 死锁建模
方形代表资源,圆形代表进程
现代操作系统读书笔记--第6章 死锁_第3张图片
现代操作系统读书笔记--第6章 死锁_第4张图片
串行运行(不会有死锁,但是效率低,只有计算而无IO时比较高效)、轮换法(操作包括IO和计算)
资源分配图中出现环路证明有死锁,反之没有
处理死锁的策略:
(1) 忽略该问题
(2)检测死锁并恢复
(3)仔细对资源进行分配,动态地避免死锁。
(4)通过破坏引起死锁的四个必要条件之一,防止死锁的产生。

6.3 鸵鸟算法
假装没发生

6.4 死锁检测和死锁恢复
不试图阻止死锁的发生,而是允许死锁发生,当检测到死锁发生时采取措施进行恢复。
6.4.1 每种类型一个资源的死锁检测
每种资源类型只有一个资源
简单方法:资源分配图里面找环
现代操作系统读书笔记--第6章 死锁_第5张图片
检测是否有环的算法
现代操作系统读书笔记--第6章 死锁_第6张图片
6.4.2 每种类型多个资源的死锁检测
有多种相同的资源存在
基于现有资源向量、可用资源向量、当前分配矩阵、请求矩阵
现代操作系统读书笔记--第6章 死锁_第7张图片
何时检测死锁:1.每当有资源请求时去检测(占用昂贵的CPU时间) 2.每隔k分钟检测一次,或者当CPU的使用率降到某一阈值时去检测

6.4.3 从死锁中恢复
1.利用抢占恢复
临时将某个资源从它的当前所有者那里转移给另一个进程
2.利用回滚恢复
对进程进行检查点检查,以便死锁后回滚到拥有需要资源的进程。
3.通过杀死进程恢复
杀死环内的、杀死环外可以解除死锁的、杀死可以从头重新运行而且不会带来副作用的进程
更新数据库的进程在第二次运行时并非总是安全的。

6.5 死锁避免
保证在安全的条件下分配资源从而避免死锁
6.5.1 资源轨迹图
使轨迹不进入死锁区域
现代操作系统读书笔记--第6章 死锁_第8张图片
6.5.2 安全状态和不安全状态
如果没有死锁发生,并且即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每一个进程运行完毕,则称该状态是安全的。
现代操作系统读书笔记--第6章 死锁_第9张图片
不安全状态并不是死锁,安全状态和不安全状态的区别:从安全状态出发,系统能够保证进程都能完成,反之不能保证。

6.5.3 单个资源的银行家算法
判断请求的满足是否会导致进入不安全状态,如果是,则拒绝请求,如果满足请求后系统仍然是安全的,就予以分配
现代操作系统读书笔记--第6章 死锁_第10张图片
检查一个状态是否安全的算法
这里写图片描述

6.5.4多个资源的银行家算法
现代操作系统读书笔记--第6章 死锁_第11张图片
检查一个状态是否安全的算法
现代操作系统读书笔记--第6章 死锁_第12张图片

6.6 死锁预防
死锁避免从本质上来说是不可能的,因为它需要获知未来的请求,而这些请求是不可知的
6.6.1 破坏互斥条件
如果一个资源不被一个进程所独占,那么死锁肯定不会发生
脱机打印机,只有守护进程使用物理打印机,
避免分配那些不是绝对必需的资源,尽量做到尽可能少的进程可以真正请求资源。
6.6.2 破坏占有并等待条件
禁止已持有资源的进程再等待其他资源
6.6.3 破坏不可抢占条件
虚拟化,抢占
6.6.4破坏环路等待条件
1.保证每一个进程在任何时刻只能占有一个资源
2.资源编号
现代操作系统读书笔记--第6章 死锁_第13张图片

6.7 其他问题
6.7.1 两阶段加锁
第一阶段:进程试图对所有所需的记录进行加锁,一次锁一个记录
第二阶段:若第一阶段成功,完成更新然后释放锁

6.7.2 通信死锁
两个或以上进程利用发送信息来通信时发生通信死锁。
超时策略来避免通信死锁。
通信过程也可能发生资源死锁
现代操作系统读书笔记--第6章 死锁_第14张图片
6.7.3 活锁
比如行人互相让路导致堵塞
现代操作系统读书笔记--第6章 死锁_第15张图片
6.7.4 饥饿
有一些不是死锁的进程永远得不到服务
解决方案:处理最老的文件

6.8 有关死锁的研究
6.9 小结

你可能感兴趣的:(操作系统)