📜  操作系统中的死锁检测算法

📅  最后修改于: 2021-09-28 09:51:41             🧑  作者: Mango

如果系统不采用死锁预防或死锁避免算法,则可能发生死锁情况。在这种情况下-

  • 应用算法来检查系统状态以确定是否发生了死锁。
  • 应用算法从死锁中恢复。有关更多信息,请参阅死锁恢复

死锁避免算法/银行家算法
该算法采用了多次变化的数据结构:

  • 可用的 –
    长度为 m 的向量表示每种类型的可用资源数量。
  • 分配——
    n*m 矩阵定义了当前分配给进程的每种类型的资源数量。列代表资源,行代表进程。
  • 要求 –
    一个 n*m 矩阵表示每个进程的当前请求。如果 request[i][j] 等于 k,则进程 P i正在请求 k 个资源类型 R j 的更多实例。

这个算法已经在这里讨论过

现在,银行家算法包括安全算法/死锁检测算法
判断系统是否处于安全状态的算法可以描述如下:

算法步骤:

  1. WorkFinish分别是长度为 m 和 n 的向量。初始化工作=可用。对于i=0, 1, …., n-1 ,如果请求i = 0,则Finish[i] = true;否则, Finish[i] = false。
  2. 找到一个索引 i 使得两者
    a) Finish[i] == false
    b)请求i <= 工作
    如果没有这样的i存在,请转到步骤 4。
  3. 工作=工作+分配i
    完成[i]=真
    转到步骤 2。
  4. 如果Finish[i]== false for some i, 0<=iFinish[i]==false进程 P i是死锁的。

例如,

分配,请求矩阵

  1. 在此,Work = [0, 0, 0] &
    完成 = [假,假,假,假,假]
  2. i=0被选择为 Finish[0] = false 和 [0, 0, 0]<=[0, 0, 0]。
  3. 工作 =[0, 0, 0]+[0, 1, 0] =>[0, 1, 0] &
    完成 = [真、假、假、假、假]。
  4. i=2被选择为 Finish[2] = false 和 [0, 0, 0]<=[0, 1, 0]。
  5. 工作 =[0, 1, 0]+[3, 0, 3] =>[3, 1, 3] &
    完成 = [真,假,真,假,假]。
  6. i=1被选择为 Finish[1] = false 和 [2, 0, 2]<=[3, 1, 3]。
  7. 工作 =[3, 1, 3]+[2, 0, 0] =>[5, 1, 3] &
    完成 = [真,真,真,假,假]。
  8. i=3被选择为 Finish[3] = false 和 [1, 0, 0]<=[5, 1, 3]。
  9. 工作 =[5, 1, 3]+[2, 1, 1] =>[7, 2, 4] &
    完成 = [真,真,真,真,假]。
  10. i=4被选择为 Finish[4] = false 和 [0, 0, 2]<=[7, 2, 4]。
  11. 工作 =[7, 2, 4]+[0, 0, 2] =>[7, 2, 6] &
    完成 = [真,真,真,真,真]。
  12. 由于 Finish 是一个全真向量,这意味着在这个例子中没有死锁。