文章目录
第二章 进程与线程(四)
2.4 死锁
2.4.1 死锁的概念
-
死锁的定义
死锁:多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进 -
死锁产生的原因
1)系统资源的竞争:只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的
2)进程推进顺序非法:请求和释放资源的顺序不当;信号量使用不当也会造成死锁
3)死锁产生的必要条件:
互斥:在一段时间内某资源仅为一个进程所占有
不剥夺:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走(只能是主动释放)
请求和保持:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有
循环等待:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求 -
死锁的处理策略
资源分配策略 各种可能模式 主要优点 主要缺点 死锁预防 保守,宁可资源闲置 一次请求所有资源,资源剥夺,资源按序分配 适用于做突发式处理的进程,不必进行剥夺 效率低,进程初始化时间延长;剥夺次数过多;不便灵活申请新资源 死锁避免 是“预防”和“检测”的折中(在运行时判断是否死锁) 寻找可能的安全允许顺序 不必进行剥夺 必须知道将来的资源需求;进程不能被长时间阻塞 死锁检测 宽松,只要允许就分配资源 定期检查死锁是否已经发生 不延长进程初始化时间,允许对死锁进行现场处理 通过剥夺解除死锁,造成损失
2.4.2 死锁预防
- 破坏互斥条件:有些资源必须互斥使用,无法破坏互斥条件
- 破坏不剥夺条件:增加系统开销,降低吞吐量
- 破坏请求和保持条件:采用预先静态分配方法。严重浪费系统资源,还可能导致饥饿现象
- 破坏循环等待条件:为了破坏循环等待条件,可采用顺序资源分配法。浪费系统资源,并造成编程不便
2.4.3 死锁避免
- 系统安全状态:能找到一个分配资源的序列能让所有进程都顺利完成
并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可以避免进入死锁状态。
- 银行家算法:采用预分配策略检查分配完成时系统是否处在安全状态!!!
2.4.4 死锁检测和解除
- 资源分配图:圆圈代表一个进程,框代表一类资源,进程到资源的有向边叫请求边,资源到进程的边叫分配边
- 死锁定理:S为死锁的条件是当且仅当S状态的资源分配图是不可完全简化的;若能消去图中所有的边,则称该图是可完全简化的。
- 死锁解除
1)资源剥夺法:挂起某些死锁进程并抢夺它的资源,以便让其他进程继续推进
2)撤销进程法:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源
3)进程回退法:让一个或多个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺