3.6 预防死锁
L19
学习目标
死锁有四个必要条件;预防、避免(银行家)、检测与解除是四条路。MCU 固件里更常见的是两个任务互相等锁——用设计避免,而不是上完整检测器。
- 四条件:互斥、占有且等待、不可抢占、循环等待。破坏任一条件即可预防。
- 银行家算法用安全序列避免进入不安全状态,实现代价高,适合动画理解。
- 固件实例:任务 A 持 UART 锁等 GPIO,任务 B 持 GPIO 锁等 UART。超时放弃是工程折中。
原理 · 深入理解
3.6 预防死锁
本节概览:先建立「预防死锁」的框架,再依次展开下列小节。
- 破坏“请求和保持”条件
- 破坏“不可抢占”条件
- 破坏“循环等待”条件
3.6.1 破坏“请求和保持”条件
第一种协议:所有进程在开始运行前一次性申请整个运行过程所需的全部资源。
破坏“请求和保持”条件的核心:进程请求资源时不能持有不可抢占资源。
缺点
资源严重浪费,恶化资源利用率;进程常发生饥饿。
第二种协议:允许进程只获得运行初期所需资源后便开始运行,运行过程中逐步释放已用毕资源再请求新资源。
优点:进程更快完成任务,提高设备利用率,减少饥饿机率。
3.6.2 破坏“不可抢占”条件
破坏“不可抢占”条件:进程已保持某些不可抢占资源但新请求不能满足时,必须释放已保持的所有资源,待以后需要时重新申请。这意味着已占有资源被暂时释放(被抢占)。
3.6.3 破坏“循环等待”条件
破坏“循环等待”条件:对系统所有资源类型进行线性排序并赋予不同序号,进程按序号递增顺序申请资源。
优点
资源利用率和系统吞吐量都有较明显改善。
缺点
资源序号必须相对稳定,限制新设备增加;实际使用顺序与规定序号可能不符,造成资源浪费。
做 · 交互动画
- 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
预防死锁
用控件单步操作;日志区记下每一步发生了什么。
总结与提升
- 能默写死锁四条件,并举一个固件中的例子。
- 能用自己的话复述学习目标,并指出概念与板上实验的对应。
延伸思考
- 超时放弃算不算「解除死锁」?
- 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?