死锁
一组进程中的每个进程均等待此组进程其他所占有的、因而无法得到的资源,这种现象称为死锁
死锁类型
竞争资源引起的死锁
进程间通信引起的死锁
其他条件引发的死锁
死锁产生的必要条件
资源独占条件
一个资源同时只能分配给一个进程
不可剥夺条件
进程保持的资源只能主动释放,不可强行剥夺
请求与保持条件
保持某些资源不放的同时,申请别的资源
循环等待条件
存在一种进程资源的循环等待链
循环等待未必死锁,死锁一定循环等待
死锁的处理策略
死锁预防(静态)
破坏互斥条件
将临界资源改造为可共享使用的资源(如SPOOLing技术)
缺点:可行性不高,很多时候无法破坏互斥条件
破坏不剥夺条件
1.申请资源的不到满足时,立即释放拥有的所有资源
2.申请资源被占用时,由os协助剥夺
缺点:实现复杂;剥夺资源可能使部分工作失效,反复申请开销大,可能导致饥饿.
破坏请求和保持条件
运行前分配好所需资源,之后一直保持.
缺点:资源利用率低,可能导致饥饿
破坏循环等待条件
给资源编号,必须按照编号顺序申请资源
缺点:不方便增加新设备,会导致资源浪费,用户编程麻烦
避免死锁(动态)
避免系统进入不安全状态
死锁的检测和解除
死锁的检测
资源分配图
两种节点
进程结点
资源结点
两种边
请求边(进程结点->资源结点)
分配边(资源结点->进程终点)
死锁检测算法
依次消除不阻塞的连接边,直到无边可消
死锁的解除
资源剥夺法
撤销进程法
进程回退法
饥饿
当等待时间给进程的推进和响应带来明显影响时,会发生进程饥饿,简称饥饿
活锁
忙式等待下发生的饥饿称之为活锁
死锁与饥饿例子
哲学家就餐问题
过河问题