多个进程由于互相等待对方持有的资源而造成的谁都无法执行的情况叫死锁。
成因
- 资源互斥使用
- 占有一些资源不释放,再去申请其它资源
- 各自占有的资源和互相申请的资源形成环路等待
总结出4个必要条件:
- 互斥使用(Mutual exclusion)
- 不可抢占(No preemption)
- 请求和保持(Hold and wait)
- 循环等待(Circular wait)
处理方法
死锁预防
破坏死锁出现的条件:
- 在进程执行前,一次性申请所有需要的资源,不会占有的资源再去申请其它资源
- 需要预知未来,编程困难
- 许多资源分配后很长时间后才使用,资源利用率低
- 对资源类型进行排序,资源申请必须按序进行,不会出现环路等待
- 造成资源浪费
死锁避免
检测每个资源请求,判断此次请求是否会引起死锁,如果造成死锁就拒绝。
如果系统中所有进程存在一个可完成的执行序列P1,……Pn,则称系统处于安全状态,其中执行序列P1,……Pn称为安全序列
举个🌰:
其中一个安全序列为 P1,P3,P2,P4,P0
银行家算法:
时间复杂度T(n) = O(mn^2),其中m是资源个数,n个进程个数
死锁检测和恢复
检测到死锁出现时,让一些进程回滚,让出资源。
每次申请都执行银行家算法效率过低,可以发现问题再处理。
- 定时检测可发现资源利用率低时检测
- 根据哪些因素(优先级、占用资源数量等)选择哪些进程回滚是个问题
- 如何实现回滚、如何处理已修改的文件也很难处理
死锁忽略
处理代价最小