1. 资源
需要排他性使用的对象称为资源(resource)如: 打印机、扫描仪等等
2.可抢占可不可抢占
此处讨论不可抢占资源。
1)请求资源。
2)使用资源。
3)释放资源
假设资源请求失败就进入休眠状态(死锁的前提)
3.死锁定义
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件, 那么, 该进程集合就是死锁的。
换言之, 这个死锁进程集合中的每一个进程都在等待另一个死锁的进程已经占有的资源。
4.资源死锁的条件
1)互斥条件。 每个资源要么已经分配给了一个进程, 要么就是可用的。
2)占有和等待条件。 已经得到了某个资源的进程可以再请求新的资源。
3)不可抢占条件。 已经分配给一个进程的资源不能强制性地被抢占, 它只能被占有它的进程显式地释放。
4)环路等待条件。 死锁发生时, 系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。
需要同时满足以上4个条件才有可能发生死锁,同时,避免死锁的思路中可以考虑破坏以上其中一个条件。
5.死锁建模
资源分配图:
用有向图的方式表示资源的请求和分配情况、作为一种分析工具,可以有效分析死锁(成环即发生死锁)。或者避免产生死锁。
6.处理死锁
有四种处理死锁的策略:
1)忽略该问题。 也许如果你忽略它, 它也会忽略你。
2)检测死锁并恢复。 让死锁发生, 检测它们是否发生, 一旦发生死锁, 采取行动解决问题。
3)仔细对资源进行分配, 动态地避免死锁。
4)通过破坏引起死锁的四个必要条件之一, 防止死锁的产生。
6.1 鸵鸟算法
在工程当面对死锁放任不管
6.2 死锁检测和恢复
利用上面的资源分配图,结合数据结构里的有向图,将每个节点作为树的根节点,进行深度优先搜索,将走过的路径记录成表。通过表项可以确定图是否成环(产生死锁)。
6.3 多资源死锁检测(利用分配矩阵、资源矩阵、可用资源向量来检测)
矩阵的每一行代表一个进程,每一列代表某种特定的资源。
7.从死锁中恢复
1)利用抢占恢复
2)利用回滚恢复
3)通过杀死进程恢复
8. 死锁避免
8.1 资源轨迹图
I1 到I8表示特定时刻,中间时间段表示对资源占用的时间。虚线是程序运行时对资源的请求曲线。通过绕过阴影区可以避免产生死锁。
8.2 安全和不安全状态
如果没有死锁发生, 并且即使所有进程突然请求对资源的最大需求, 也仍然存在某种调度次序能够使得每一个进程运行完毕, 则称该状态是安全的。
有个前提就是需要知道“最大需求”。
每个阶段总有一个进程可以得到所需资源,完成之后将自身资源重新放入空闲池中。
8.3 银行家算法
跟前面死锁检测中的矩阵检测一样。前提是需要知道资源的最大需求量。但在实际程序运行中不能提前知道资源的最大需求量,因此此算法不能实际应用。
9.死锁预防
破坏死锁发生的4个条件。
10.其他方面
1)两阶段加锁
第一阶段试图对所需记录加锁,然后释放掉。第二阶段再加锁。相当于第一阶段是一个试探,如果有其中一样资源不可用则重新开始。然而这在很多领域是不可接受的。
2)通信死锁
类似于TCP收发, 一种普遍的情形是进程A向进程B发送请求信息, 然后阻塞直至B回复。 假设请求信息丢失, A将阻塞以等待回复, 而B会阻塞等待一个向其发送命令的请求, 因此发生死锁。
3)活锁
进程得不到资源并不进入睡眠状态或者挂起,只是消耗完CPU时间。没有进展也没有阻塞,就是活锁。
4)饥饿
类似于最小文件优先算法中,系统一直有小文件进入,使得大文件一直处于等待状态,得不到处理。陷入饥饿