1. 资源
可抢占资源/不可抢占资源
2. 死锁
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的。
3. 死锁发生的四个必要条件
1) 互斥条件:每个资源要么已经分配给了一个进程,要么就是可用的
2) 占有和等待条件:已经得到了某个资源的进程可以再请求新的资源
3) 不可抢占条件:已经分配的资源不能被抢占,只能由占有它的进程显式释放
4) 环路等待条件:系统中有两个或两个以上进程形成环路,环路中每个进程都在等待下一个进程所占有的资源
4. 死锁建模
□表示资源类型,O表示进程
5. 四种处理死锁的策略
1) 忽略该问题(鸵鸟算法)
2) 检测死锁并恢复
3) 仔细对资源进行分配,动态地避免死锁
4) 通过破坏引起死锁的四个必要条件之一,防止死锁发生
6. 死锁的检测
1) 每种类型一个资源的死锁检测
建模检测是否有环
2) 每种类型多个资源的死锁检测
当前分配矩阵C,请求矩阵R
步骤:
(1) 寻找一个没有标记的进程Pi,对它而言R矩阵的第i行向量小于等于A。
(2) 如果找到了这样一个进程,那么将C矩阵的第i行向量加到A中,标记该进程,并转到第一步。
(3) 如果没找到,算法终止。
如果算法结束,存在没有标记的进程,则为死锁进程。
7. 死锁的恢复
1) 利用抢占恢复
2) 利用回滚恢复(检查点检查)
3) 通过杀死进程恢复
8. 死锁避免
1) 资源轨迹图
2) 从安全状态出发,系统就能够保证所有进程都能完成,而从不安全状态出发,就没有的保证
3) 银行家算法
9. 银行家算法
检查一个状态是否安全的算法
(矩阵:已分配资源,仍需要资源)
(向量:E现有资源,P已分配资源,A可用资源)
1) 查找仍需要资源矩阵中是否有一行,其没有被满足的资源数小于等于A,如果不存在这样的行,那么系统将会死锁
2) 假若找到这样一行,那么可以假设它获得所需资源并运行结束,将该进程标记为终止,并将其资源加到向量A上。
3) 重复以上两步,如果最后所有进程都标记为终止,其初始状态是安全的,如果所有进程的资源需求得不到满足,则发生了死锁。
10. 死锁的预防
1) 破坏互斥条件(使用假脱机技术)
2) 破坏占有和等待条件(在开始就请求全部资源)
3) 破坏不可抢占条件(抢占资源)
4) 破坏环路等待条件(对资源按序编号)
11. 两阶段加锁
第一阶段:试图对所有所需记录加锁,如某个进程已被加锁,释放该进程的所有加锁记录,重新开始第一阶段。
第二阶段:第一阶段加锁成功后,完成更新然后释放锁。
该算法只适用于程序员可以安排程序停下和重新开始而不会产生错误的情况(如数据库系统)。
12. 通信死锁
在一系列进程中,每个进程因为等待另外一个进程引发的事件而产生阻塞,可采用超时机制解决。
13. 活锁
没有阻塞但也没有进展。
14. 饥饿
进程无限制地推后,得不到执行,可采用先来先服务资源分配策略避免。