死锁问题
一组阻塞的进程持有一种资源等待获取另一个进程所占有的一个资源。
可重复使用的资源
- 在一个时间只能一个进程使用且不能被删除
- 进程获得资源,后来释放由其他进程重用
- 处理器, I / 0 通道,主和副存储器.设备和数据结构,如文件,数据库和信号量
- 如果每个进程拥有一个资源并请求其它资源.死锁可能发生
使用资源
- 创建和销毁
- 在 I / O 缓冲区的中断,信号.消息.信息
- 如果接收消息阻塞可能会发生死锁
- 可能少见的组合事件会引起死锁
资源分配图有环路,不一定产生死锁,死锁一定有环
死锁必要条件
- 互斥:在一个时间只能有一个进程使用资源。
- 持有并等待:进程保持至少一个资源正在等待获取其他进程持有的额外资源。
- 无抢占:一个资源只能被进程自愿释放,进程已经完成了它的任务之后。
- 循环等待:存在等待进程集合{ l , 0 , PI . … , l , N } . 1 , 0 正在等待 l , l 所占用的资源. Pl 正在等待 P2 占用的资源, … , P 卜 1 在等待 PN 所占用资源, PN 正在等待 P0 所占用、的资源。
死锁处理办法
- 死锁预防
- 死锁避免
- 死锁检测
- 死锁恢复
死锁预防
四个必要条件的限制
需要系统具有一些额外的先验信息提供:
- 最简单和最有效的模式是要求每个进程声明它可能需要的每个类型资源的最大数目。
- 资源的分配状态是通过限定提供与分配的资源数量,和进程的最大需求。
- 死锁避免算法动态检查的资源分配状态,以确保永远不会有一个环形等待状态。
死锁避免
- 安全序列
- 银行家算法
死锁的检测与恢复
死锁检测与恢复是指系统设有专门的机构,当死锁发生时,该机构能够检测到死锁发生的位置和原因,并能通过外力破坏死锁发生的必要条件,从而使得并发进程从死锁状态中恢复出来。
死锁恢复
一旦在死锁检测时发现了死锁,就要消除死锁,使系统从死锁状态中恢复过来。
(1)最简单,最常用的方法就是进行系统的重新启动,不过这种方法代价很大,它意味着在这之前所有的进程已经完成的计算工作都将付之东流,包括参与死锁的那些进程,以及未参与死锁的进程。
(2)撤消进程,剥夺资源。终止参与死锁的进程,收回它们占有的资源,从而解除死锁。这时又分两种情况:一次性撤消参与死锁的全部进程,剥夺全部资源;或者逐步撤消参与死锁的进程,逐步收回死锁进程占有的资源。一般来说,选择逐步撤消的进程时要按照一定的原则进行,目的是撤消那些代价最小的进程,比如按进程的优先级确定进程的代价;考虑进程运行时的代价和与此进程相关的外部作业的代价等因素。