读书笔记-现代操作系统-6死锁-6.3鸵鸟算法6.4死锁检测和死锁恢复

6.3 鸵鸟算法

不考虑死锁问题。 因为实际工作中很可能有其他更为严重的问题。如果死锁的频率不高可不考虑死锁。

6.4 死锁检测和死锁恢复

6.4.1 每种类型一个资源的死锁检测

步骤:
1. 对图中的每一个节点N,将N作为起始点执行下面5个步骤。
2. 将L初始化为空表,并清除所有的有向边标记。
3. 将当前节点添加到L的尾部,并检测该节点是否在L中已出现两次,如果是。那么该图包含了一个环(已列在L中),算法结束。
4. 从给定的节点开始,检测是否存在没有标记的从该节点除非的弧,如果存在的话,做第5步,如果不存在,调到第6步
5. 随机选取一条没有标记的从该节点出发的弧,标记它,然后沿着这条弧找到新的当前节点,返回第3步。
6. 如果这一节点是起始点,那么表明该图不存在任何换,算法结束。否则意味着我们走进了死胡同,所有需要移走该节点,返回到前一个节点,即当前节点前面的一个节点,并将它作为新的当前节点,跳转到第3步。

思路上说:
依次将每个节点作为一颗树的根节点并进行深度优先搜索。如果再次碰到已经遇到过的节点,那么就算找到一个环。如果从任何给定的节点除非的弧都被穷举了,那么久回溯到前面的节点。如果回溯到根并且不能再深入下去,那么从当前节点除出发的子图就不包含任何环。如果所有节点都如此,那么整个图就是无环的。

这不是最优的解法

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

E是现有资源向量(existing resource vector),代码每种已存在资源的总数
A是可用资源向量(available resource vector),那么Ai表示当前可供使用的资源数(即没有被分配的资源)
C是当前分配矩阵(current allocation matrix),C的第i行代表Pi当前所持有的每一种类型资源的资源数
R是请求矩阵(request matrix),R的每一行代表P所需要的资源的数量

读书笔记-现代操作系统-6死锁-6.3鸵鸟算法6.4死锁检测和死锁恢复_第1张图片
死锁检测步骤如下:
1. 寻找一个没有标记的进程Pi,对于它而言R矩阵的第i行向量小于或等于A。
2. 如果找到了这样一个进程,那么将C矩阵的第i行向量加到A中,标记该进程,并转到第1步
3. 如果没有这样的进程,那么算法终止
算法结束时,所有没有标记过的进程都是死锁进程。

算法第一步是寻找可以运行完毕的进程,该进程的特点是它有资源请求且可被当前的可用资源满足。这一选中的进程随后就被运行完毕,在这段时间内它释放自己持有的所有资源并将他们返回到可用资源库中。
然后这一进程被标记为完成,在这段时间内它释放自己持有的资源并将他们返回到可用资源库中。
如果有些进程始终不能运行,那么它们就是死锁进程。虽然算法的运行过程是不确定的但是结果总是相同的。

通常来说检测死锁不会频繁进行。通常来说
每隔一段时间去检测一下,或者考虑CPU效率来检测,效率很低时进行检测。

6.4.3 从死锁中恢复

  1. 利用抢占恢复。
    在某些情况下,可能会临时将某个资源从它的当前所有者那里转移到另一个进程中。这种做法很可能需要人工干预,主要做法是否可行需取决于资源本身的特性。
  2. 利用滚回恢复
    他们就可以周期性的对进程进行检查点检查。
    进程的检查点检查就是讲进程的状态希尔一个文件以备以后重启。实际上是将该进程复位到一个更早的状态。那时它还没有取得所需的资源,接着就把这个资源分配给其他死锁进程。
  3. 通过杀死进程恢复
    最直接简单的方式就是杀死一个或若干个进程。
    一种方法是杀掉环中的一个进程。如果不行的话就继续杀死别的进程。
    有时候选择一个环外的进程也是可行的。
    尽可能报证杀死的进程可以从头再来而不带来副作用。另一方面更新数据库的进程第二次运行时并非总是安全的。这是需要注意的。

你可能感兴趣的:(现代操作系统,读书笔记)