如果系统既没有使用死锁防护, 也没有使用避免死锁算法则可能发生死锁情况。在这种情况下-
- 应用算法检查系统状态以确定是否已发生死锁。
- 应用算法从死锁中恢复。有关更多信息, 死锁恢复
该算法采用了几种时变数据结构:
- 可用-长度为m的向量表示每种类型的可用资源数。
- 分配-n * m矩阵定义当前分配给进程的每种类型的资源数。列代表资源, 资源代表过程。
- 请求-n * m矩阵表示每个进程的当前请求。如果request [i] [j]等于k, 则处理P一世正在请求k个资源类型R的更多实例?.
判断系统是否处于安全状态的算法描述如下:
算法步骤:
- 设Work和Finish分别为长度为m和n的向量。初始化Work=Available。其中i= 0,1,...,n-1,如果Request(i) = 0,那么Finish[i] = true; 否则,Finish[i]= false。
- 找到一个索引i,满足:
a)Finish [i] ==false
b)Request(i)< =Work
如果这种索引i不存在, 请转到步骤4。 - Work= Work+ Allocation(i)
Finish[i]= true
转到步骤2。 - 如果Finish[i]== false对于某些i, 0< =i< n,则系统处于死锁状态。而且,如果Finish[i]==false进程Pi死锁。
文章图片
- 在此, Work = [0, 0, 0] & Finish = [false, false, false, false, false]
- i=0被选择为Finish[0] = false和[0,0,0]< =[0,0,0]。
- Work =[0, 0, 0]+[0, 1, 0] => [0, 1, 0] & Finish = [true, false, false, false, false].
- i=2被选择为Finish[2] = false和[0,0,0]< =[0,1,0]。
- Work =[0,1,0]+[3,0,3] => [3,1,3] & Finish = [true, false, true, false, false]。
- i = 1选择Finish [1] = false且[2, 0, 2] < = [3, 1, 3]。
- Work= [3, 1, 3] + [2, 0, 0] =>
[5, 1, 3]&
Finish= [true, true, true, false, false]。 - i = 3被选择为Finish [3] = false和[1, 0, 0] < = [5, 1, 3]。
- Work= [5, 1, 3] + [2, 1, 1] =>
[7, 2, 4]&
Finish= [true, true, true, true, false]。 - i = 4选择Finish [4] = false且[0, 0, 2] < = [7, 2, 4]。
- Work= [7, 2, 4] + [0, 0, 2] =>
[7, 2, 6]&
Finish= [true, true, true, true, true]。 - 因为Finish是一个全为真的向量,所以在这个例子中没有死锁。
推荐阅读
- jQuery如何使用dequeue()(代码示例)
- PHP如何使用date_parse()函数(代码示例)
- 斐波那契堆介绍和实现原理分析|S1
- 算法(使用步数1、2或3计算到达第n个楼梯的所有方式)
- 高级数据结构(如何实现斐波那契堆–插入和联合操作())
- 算法(如何查找矩阵中每一列的最大元素())
- 算法设计(如何打印字符串中每个单词的最后一个字符())
- 如何在Windows中为Python安装OpenCV()
- JavaScript性能问题和优化指南