如果系统不采用死锁预防或死锁避免算法,则可能发生死锁情况。在这种情况下-
- 应用算法来检查系统状态以确定是否发生了死锁。
- 应用算法从死锁中恢复。有关更多信息,请参阅死锁恢复
死锁避免算法/银行家算法:
该算法采用了多次变化的数据结构:
- 可用的 –
长度为 m 的向量表示每种类型的可用资源数量。 - 分配——
n*m 矩阵定义了当前分配给进程的每种类型的资源数量。列代表资源,行代表进程。 - 要求 –
一个 n*m 矩阵表示每个进程的当前请求。如果 request[i][j] 等于 k,则进程 P i正在请求 k 个资源类型 R j 的更多实例。
这个算法已经在这里讨论过
现在,银行家算法包括安全算法/死锁检测算法
判断系统是否处于安全状态的算法可以描述如下:
算法步骤:
- 令Work和Finish分别是长度为 m 和 n 的向量。初始化工作=可用。对于i=0, 1, …., n-1 ,如果请求i = 0,则Finish[i] = true;否则, Finish[i] = false。
- 找到一个索引 i 使得两者
a) Finish[i] == false
b)请求i <= 工作
如果没有这样的i存在,请转到步骤 4。 - 工作=工作+分配i
完成[i]=真
转到步骤 2。 - 如果Finish[i]== false for some i, 0<=i
Finish[i]==false进程 P i是死锁的。
例如,
- 在此,Work = [0, 0, 0] &
完成 = [假,假,假,假,假] - i=0被选择为 Finish[0] = false 和 [0, 0, 0]<=[0, 0, 0]。
- 工作 =[0, 0, 0]+[0, 1, 0] =>[0, 1, 0] &
完成 = [真、假、假、假、假]。 - i=2被选择为 Finish[2] = false 和 [0, 0, 0]<=[0, 1, 0]。
- 工作 =[0, 1, 0]+[3, 0, 3] =>[3, 1, 3] &
完成 = [真,假,真,假,假]。 - i=1被选择为 Finish[1] = false 和 [2, 0, 2]<=[3, 1, 3]。
- 工作 =[3, 1, 3]+[2, 0, 0] =>[5, 1, 3] &
完成 = [真,真,真,假,假]。 - i=3被选择为 Finish[3] = false 和 [1, 0, 0]<=[5, 1, 3]。
- 工作 =[5, 1, 3]+[2, 1, 1] =>[7, 2, 4] &
完成 = [真,真,真,真,假]。 - i=4被选择为 Finish[4] = false 和 [0, 0, 2]<=[7, 2, 4]。
- 工作 =[7, 2, 4]+[0, 0, 2] =>[7, 2, 6] &
完成 = [真,真,真,真,真]。 - 由于 Finish 是一个全真向量,这意味着在这个例子中没有死锁。