一、系统模型
利用资源方式:
request(请求)
use(使用)
release(释放)
二、产生死锁的四个条件(特征)
·互斥:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源
·请求和保持:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但又对自己获得的其他资源保持不放
·不可抢占:资源只能由占用的进程释放
·循环等待:是指进程发生死锁后,必然存在一个进程–资源之间的环形链
结论:
图中不含有循环—>没有死锁
图中含有循环—>每一个资源只有一个实例就会死锁,否则不会死锁
三、处理方法:
确保系统永远不会进入死锁状态:
·预防死锁
·避免死锁
允许系统进入死锁,然后恢复
四、死锁避免算法
(1)每种类型的资源只有一个实例(资源分配图)
·当进程请求资源时,边转化为资源请求边
·当资源被分配给进程时,资源请求边转化为资源分配边
·当资源被进程释放后,资源分配边转化为边
(2)每种类型的资源有多个实例(银行家算法)
Available:大小为m的向量(Vector,一个封装了动态大小数组的顺序容器)。如果available[j]=k, 那么资源Rj有k个实例可用
Max:n×m矩阵。如果Max[i,j]=k,那么进程Pi最多可以请求k个Rj资源的实例
Allocation:n×m矩阵。如果Allocation[i,j]=k,那么进程Pi当前被分配了k个Rj资源的实例
Need:n×m矩阵。如果Need[i,j]=k,那么进程Pi还需要k个Rj资源的实例
安全算法:
·Work 和 Finish 分别是大小为 m 和 n 的向量。初始化:
Work = Available
Finish [i] = false for i = 0, 1, …, n- 1
·找到一个i,同时满足:
(a) Finish [i] = false
(b) Needi≤Work
如果没有这样的i存在, 去往第4步。
·Work = Work + Allocationi
Finish[i] = true
去往第2步
·如果 Finish[i] == true 对于所有的 i 都成立, 那么系统处于安全状态
五、检测死锁
允许系统进入死锁状态
·死锁检测算法
·恢复策略:抢占资源(选择一个受害者)
回滚:返回到安全的状态,重新启动改状态的进程
饥饿:考虑到回滚的成本因素,同一进程可能总是被选为受害者