MOS_Chapter5_DeadLock

死锁

什么是死锁deadlock?

包含多种类型, 总之就是系统无法继续运行, 维持在某个状态

6.1 资源

大部分死锁都与资源resource有关, 因此什么是资源?

一组被排他性使用的对象(不可抢占), 比如硬件设备/数据库信息

6.1.1 可抢占和不可抢占资源

资源可以按权限进行分类

可抢占preemptable resource, 不可抢占资源nonpreemptable resource

什么是可抢占资源

从拥有它的进程中抢占而没有其他后果

什么是不可抢占资源

不引起目标进程失败情况下, 抢占该进程的资源

怎么判断资源是否可抢占

取决于上下文环境, 看是否支持

使用资源的实践顺序分为哪些步骤?

请求,使用,释放

什么是进程的休眠状态

请求资源失败

6.1.2 资源获取

信号量操作down(&) 占用资源 up(&)释放资源

6.2 死锁

死锁规范定义

进程集合中, 每个进程都在等待只能由其他进程才能引发的事件, 该进程集合是死锁的

资源死锁 resource deadlock

6.2.1 死锁的4个条件

大部分死锁由资源的占用引起的

资源死锁的四个必要条件,(一定是同时满足)

互斥 占有和等待 不可抢占条件 环路等待

死锁的互斥条件

要么可用要么已分配不可用

死锁的占有和等待条件

有了还能再请求新的资源

死锁的不可抢占条件

不能强制抢占, 只能主动释放

死锁的环路等待条件

一定有两个进程以上组成的资源环路

6.2.2 死锁建模

资源分配图

image-20211102114506633

6.2.3 死锁处理四种策略

忽略死锁 检测与恢复死锁 动态资源分配避免死锁 破坏必要条件防止死锁

6.3 鸵鸟算法

硬件, 编译器,操作系统等故障崩溃来忽略死锁

6.4 死锁检测和恢复

不阻止死锁而是发生后去检测并恢复

6.4.1 每种类型的资源只有一个的检测

其中一种方法的主要思想, 利用有向环路图的检测算法

具体执行步骤

对每个结点都进行以下搜索

  1. 初始化L并清除有向边标记
  2. 添加当前结点到L中, 若有2次则有环
  3. 对于给定结点出发, 若有未标记的弧跳到4 若没有则5
  4. 若当前结点任一出边弧可达新结点, 则标记弧并返回2
  5. 若结点是起始结点, 说明无环否则移走该结点返回上一结点跳到2

6.4.2 每种类型的资源有多个的检测

基于向量的比较:可用资源向量 请求矩阵 分配矩阵

image-20211102133311807

其实就是

将当前资源向量A加到C中某一行与R中该行(进程)比较如果大于则 释放所有资源, 并继续满足其他行

6.4.3 从死锁中恢复

抢占恢复

将进程的某一资源强行拿走, 之后再送回, 主要取决于资源的类型是否容易回收

回滚恢复

周期地进行检查点检查-checkpointed(将进程状态写入文件以备之后重启,检测到死锁时, 释放当前资源, 进程复位到某个时间点)

杀死恢复

  1. 破坏.杀死环中的进程 可能有副作用, 尽量杀死可用重新运行且没有副作用的比如编译, 而数据库再次运行可能对记录进行累加

  2. 释放环外进程的资源, 让环中进程获得

6.5 死锁避免

5.5.1 资源轨迹图

大概知道有这个东西就好了

6.5.2安全与不安全状态

主要用来描述进程调度前当前状态下是否会死锁,

不安全不代表一定是死锁, 可能下一秒有进程释放足够资源使用

不安全与安全状态的区别

安全状态系统能保证所有进程都能完成, 从不安全状态出发却不能保证

6.5.3 单个资源银行家算法banker's algorithm

请求贷款, 算法判断满足请求后是否导致进入安全还是不安全状态

image-20211102135010669

6.5.4 多个资源银行家算法

E: 现有资源

P:已分配资源

A:可用资源

image-20211102135058122

检测一个状态是否安全的算法

  1. 右边每一行与A比较 如果都大于向量A则死锁
  2. 如果找到这一行 终止该行(进程) 并将已分配资源加到A中跳到1 直至所有进程可以完成

6.6 死锁预防

6.6.1 破坏互斥条件

啥事互斥条件? 要么被进程用 要么空闲, 不存在第三种状态

假脱机技术spooling printer 允许若干进程同时输出 核心利用守护进程

什么是守护进程?

唯一真正使用物理打印机的进程, 且仅会利用打印机, 其他不行 因此不会死锁

6.6.2 破坏占有并等待

方法1开始前请求所有资源, 所有资源可用才可用进行占用

问题:1.进程运行时才知道需要多少资源, 2. 资源利用率不高

方法2 当一个进程请求资源时, 先释放自己占有的资源 再获取全部资源

6.6.3 破坏不可抢占条件

某些资源即可强制占用

6.6.4 破坏环路等待

方法1 每个进程任意时刻只能占用一个资源 请求其他资源时必须先释放

方法2 资源统一编号 按照编号升序/降序优先级请求资源

6.6.5 总结

条件 处理
互斥 假脱机
占有和等待 开始请求全部资源
不可抢占 抢占资源
环路等待 资源编号

6.7 其他

6.7.1 两阶段加锁

为什么需要两阶段加锁?

一些特殊应用, 比如数据库 锁住一些记录后又要更新记录

什么是两阶段加锁two-phase locking

第一阶段: 进程对所有需要的记录加锁, 一个锁一个记录

第二阶段: 如果第一阶段加锁成功, 则更新后释放锁

如果第一阶段某进程所需记录已加锁, 该进程释放所有自己加的锁, 重新第一阶段

否则进入第二阶段

6.7.2 通信死锁(与资源死锁区别开)

资源死锁是竞争性同步的问题, 如果进程执行过程中与竞争的进程没有资源上交叉使用就会顺利执行, 因为交叉会导致资源状态不一致

通信死锁是协同同步的异常情况 如果进程是各自独立执行的, 则服务/任务无法完成

通信锁举例

两个及以上的进程发送消息通信, A->B A阻塞至B回复, 如果A请求信息丢失 A就一直等待回复, B啥也没干一直等待请求

不是所有通信系统发送的死锁都是通信锁, 也有可能是资源锁(比如对数据报读写)

6.7.3 活锁

如果说死锁是互相占有 那么活锁就是互相礼让

举例

一条桥

双发互相占为独有过桥, 都过不了

双方都让对方过桥, 仍然过不了

活锁livelock: 两个进程获取其他资源时失败了, 同时 释放当前持有资源, 此状态会一直重复, 即进程在活动但推进不了

6.7.4 饥饿

进程因为某种调度策略防止死锁但自己永远无法进行

Exercise

2.学生们在机房的个人计算机上将自己要打印的文件发送给服务器,服务器会将这些文件暂存在它的硬盘上。如果服务器磁盘空间有限,那么,在什么情况下会产生死锁?这样的死锁应该怎样避免?

spooling 服务器中文件存满了, 继续发送文件给服务器 但服务器无法接收 , 通过打印解决

3.在前一题中,哪些资源是可抢占的,哪些资源是不可抢占的?

打印机不可抢占,因为无法控制spooling 文件传输

但spooling 磁盘可以抢占, 提前发送并存储进行资源抢占

4.在图6-1中,资源释放的顺序与获得的顺序相反,以其他的顺序释放资源能否得到同样的结果?

image-20211102144856021

没有什么不同

5.一个资源死锁的发生有四个必要条件(互斥使用资源、占有和等待资源、不可抢占资源和环路等待资源)。举一个例子说明它们对于一个资源死锁的发生不是充分条件。何时这些条件对一个资源死锁的发生是充分条件?

问题大意就是

满足一个条件不一定死锁:

死锁发生全部满足:

8.有没有可能一个资源死锁涉及一个类型的多个单位和另一个类型的一个单位?如果有可能请给出一个例子。

A占有S的S1 S2 S3 需要R的R1 B占有R的R1 需要S的S1

13.鸵鸟算法中提到了填充进程表表项或者其他系统表的可能。能否给出一种能够使系统管理员从这种状况下恢复系统的方法?

一般会出现对资源死锁的系统应用提示 决策杀掉哪个进程 或者让系统重启

14.考虑系统的如下状态,有四个进程P1、P2、 P3和P4,以及五种类型的资源RS1、RS2、 RS3,RS4和RS5。

image-20211102145126173

使用死锁检测算法(基于向量的比较)来说明该系统中存在一个死锁。并识别在死锁中的进程。

C:当前分配矩阵 R请求矩阵 E现有资源向量 A可用资源向量

R-C

1 0 -1 1 -1
0 0 0 1 1
0 2 0 3 0
-2 1 1 1 0

起始就是一个个去试看能不能解开

  • A满足第二行 01021+01010 = 02031
  • 满足第三行 02031+00001 = 02032
  • 1 4行 分别无法满足 1 ,3列

15.解释系统是如何从前面向题的死锁中恢复的,使用:(a)抢占;(b)回滚;(c)终止进程。

  • 抢占

02032 抢占(1,3)的1 02132 满足4 然后满足 1

  • 回滚

将p1回滚到获得RS3之前检查点, 因此释放了RS3

  • 终止进程

kill p1释放资源即可

20.一个系统是否可能处于既非死锁也不安全的状态?如果可以,举出例子;如果不可以,请证明所有状态只能处于死锁或安全两种状态之

可以: 不安全与死锁是两个概念 不安全代表着可能死锁 满足死锁的条件 但下一秒资源释放后就可能不会死锁了

22.某一系统有两个进程和三个相同的资源。每个进程最多需要两个资源。这种情况下有没有可能发生死锁?为什么?

不可能, 考虑最坏的情况 两个进程需要4个相同的资源 总有一个进程满足后释放

23.重新考虑上一题,假设现在共有P个进程,每个进程最多需要m个资源,并且有r个资源可用。
什么样的条件可以保证死锁不会发生?

r = p x (m-1)+1

26.一个系统有4个进程和5个可分配资源,当前分配和最大需求如下. 若保持该状态是安全状态,x的最小值是多少?

image-20211102145343961

这里最大需求是3

假设x=3 安全状态 可用资源加到分配资源上 与最大需求进行比较

答案: x=2

27.一个消除环路等待的方法是用规则约定一个进程在任意时刻只能得到一个资源。举例说明在很多情况下这个限制是不可接受的。

如果进程需要的资源数过多, 等待时间可能过长

31.一种预防死锁的方法是去除占有和等待条件。
在本书中,假设在请求一个新的资源以前,进程必须释放所有它已经占有的资源(假设这是可能的)。然而,这种做法会引入这样的危险性:竞争的进程得到了新的资源但却丢失了原有的资源。请给出这一方法的改进。

如果请求的新资源满足, 那就保留 否则释放

  1. 解释死锁、活锁和饥饿的区别。

死锁: 死锁出现在一个进程集合被阻塞等待来自其他集合进程的事件

活锁: 进程集合处于活锁状态不代编进程不再运行, 而是持续检查条件, 但无法同时满足

饥饿: 进程因为优先级始终无法得到运行 通常可以自己终止(更高优先级/没有先进程到达)

35.假设两个进程发出查找命令来改变访问磁盘的机制并启用读命令。每个进程在执行读命令之前被中断,并且发现另外一个进程已经移动了磁盘。它们都重新发出查找命令,但是又同时被对方中断。这个序列不断地重复。这是一个资源死锁还是活锁?你推荐用什么方法来解决这个异常?

活锁, 因此进程在不断检查运行条件, 而不是不再继续运行, 使用超时法, 如果超过时间 释放资源后 无法完成 就随机睡眠,目的是打断该进程集合的同步状态

37.一个程序在合作和竞争机制的顺序上存在着错误,导致消费者进程在阻塞空缓冲区之前就锁定了互斥量(互斥信号量)。生产者进程在能够将数据放在空缓冲区上以及唤醒消费者进程之前被阻塞在互斥量上。因此,生产者进程和消费者进程都被一直阻塞,生产者进程等待互斥量被解锁,消费者进程等待生产者进程发出的信号。这是一个资源死锁还是通信死锁?请提出一种方法来解决进程之间的控制问题。

不是资源死锁, 尽管因为共享互斥量 使用竞争机制, 资源预分配 资源死锁的方式都无效. 线性排列资源也无效. 因为互斥执行在进入临界区之前最后一步, 离开临界区后的第一步. 环状的状态需要其他进程来解锁.

是一个通信锁, 如果可以抢占消费者的互斥量 则使用超时来打断死锁 . 使用监视器进行互斥也可以

posted @ 2021-11-29 00:01  LeoSharh  阅读(149)  评论(0编辑  收藏  举报