-
每种类型的资源__只有一个__时的死锁检测
(1) 画出所有进程、所有资源的__资源分配图
(2) 检测资源分配图(有向图)中是否出现环路
(3) 有向图检测环路算法有很多种
-
每种类型的资源__有多个__时的死锁检测
(1)
设有n个进程, m种资源E(1*m) = (E1,E2,..., Em)代表每种资源的个数 A(1*m) = (A1,A2,..., Am)代表每种资源可分配部分的个数 C(n*m), Cij代表进程i拥有的j资源的个数 R(n*m), Rij代表进程i还需要的j资源的个数
(2) 向量A ≤ 向量B <–> Ai ≤ Bi (i = 1, 2, …, m)
(3) 死锁检测算法
1° 初始时,所有进程都是__未标记__状态
2° 寻找一个未标记的进程i,满足R矩阵的第i行 Ri ≤ A
3° 如果找不到,则__出现死锁__; 如果能找到,则标记该进程,且将C矩阵的第i行 Ci 加到 A向量上
4° 回到2°,直到所有循环次数达到进程总数
5° 只要剩余了未标记进程,就说明有死锁
-
检测死锁的__时机__
(1) 方法一: 发生资源请求时检测
(2) 方法二: 每隔一段时间检测
-
从死锁中__恢复__
(1) 利用抢占恢复
如果条件允许,可以临时将某个资源从它的占有者转移到另一个进程
(2) 利用回滚恢复
周期性的进行__检查点__检查, 记录进程状态、资源状态等信息; 死锁发生时,恢复到上一个检查点的状态
(3) 通过杀死进程恢复
先 ps -ef(aux也行) 找进程(可以添加|grep java帮助查找),然后kill 这个进程的PID号