死锁定义:
若系统中存在一组进程,且它们中每一个都无限等待被该组进程中所占用的且永远无法释放的资源,那么这种现象就被称为进程“死锁”
产生死锁的原因:
- 竞争资源
- 进程推进顺序不当
产生死锁的必要条件:
- 互斥条件:某个资源一段时间内只能被一个进程所占用
- 占有且等待条件:已经占用了某些资源,又申请其他资源,这时候就在等待了,但是又占有着资源。
- 不可剥夺条件:不可剥夺资源如打印机等
- 循环等待条件:占用资源被申请其他资源
处理死锁的基本方法:
预防死锁:
- 破坏占有且等待条件:这样就必须保证一个进程在申请资源不能占有其他资源
- 静态分配资源
- 要求进程在不占有资源的条件下才可以申请资源。(但是如果需要多个资源怎么办?我放弃了资源A申请资源B,但是我是都需要的。这不是无限循环吗?如同一边放水一边加水。)【应该是会在运行初始阶段就会设置好,一个阶段只能使用一个资源】
- 破坏不可剥夺条件:当一个进程占有资源A申请资源B的时候处于等待B的状态,这个时候其资源A就可被剥夺。
- 破坏循环条件:按序分配资源。
避免死锁:设置不安全状态
安全状态:是一个进程序列,即为每个进程分配一个序号,进程i可以使用空闲资源和序号小于i的进程所占有的资源
- 处于不安全状态,不一定会发生死锁,只是有可能发生
- 不一定只有一个安全序列
检测和解除死锁:发现死锁后再处理,前期不设防
资源分配图:
• 进程指向资源:表示进程请求某个资源
• 资源指向进程:表示分配给某个进程指定资源
死锁定理:
- 从资源分配图中找到一个既不堵塞也不独立的进程节点(有进有出),有则第二步,无则第三步
- 对于第一步找到的Pi,消去所有资源请求边和分配边,使其成为独立节点
- 然后重新返回第一步继续找点
- 资源分配图经过以下列简化后,如果只剩独立节点,则成该图是可完全简化的,否则称为不可完全简化的。一个系统某时刻有死锁发生的充分条件为 当且仅当该时刻的资源分配图是不可完全简化的。
检测死锁的时机:
死锁定理,每一次跑起来开销都很大,要选择合适的时机
- 不满足资源调度时
- 周期性执行
- CPU利用率执行
银行家算法:
参考:https://www.cnblogs.com/wkfvawl/p/11929508.html