一句话:"低优先级拿着钥匙不放,中优先级插队——最高优先级被两个低优先级拖住。"
优先级反转 = 高优先级任务被低优先级任务间接阻塞,反而让中优先级任务抢走了 CPU。危害本质 = 高优先级任务执行时间不可预测、错过 deadline,实时性崩塌。插队者优先级必须卡在"等待者 > 插队者 > 持有者"之间,否则不构成反转。
任务 H:高优先级,等信号量 S
任务 M:中优先级,纯 CPU 计算(不碰 S)
任务 L:低优先级,持有信号量 S
时序:
① L 拿到 S,正在用
② H 想要 S → 拿不到 → 阻塞(H 优先级最高也没用)
③ M 就绪 → 抢占 L(M 比 L 高)→ M 一直跑
④ L 一直没机会释放 S → H 只能干等
结果:最高优先级的 H,被 L 和 M 间接拖住,错过 deadline
| 二值信号量 Binary Semaphore | 互斥量 Mutex | |
|---|---|---|
| 优先级继承 | ❌ 无 | ✅ 有(默认) |
| 所有权 | ❌ 任何人可释放 | ✅ 只能由获取者释放 |
| 用途 | 事件通知/同步 | 保护共享资源(互斥) |
| 反转风险 | 有 | 继承机制缓解 |
优先级继承 vs 优先级天花板:
| 优先级继承 | 优先级天花板 | |
|---|---|---|
| 机制 | 把持锁者动态提升到当前等待者水平,释放后恢复 | 把持锁者静态提到所有会用这锁的任务的最高级 |
| 优点 | 灵活、不过度提升 | 简单可靠、无链式计算 |
| 缺点 | 实现复杂(链式继承)、运行时开销 | 过度提升,可能降低整体实时性 |
| 相邻概念 | 和本主题的关系 | 孤立理解会犯的错 |
|---|---|---|
| 信号量/互斥量 | 反转的载体:二值信号量会反转,互斥量自带继承 | 拿二值信号量当锁用 |
| 任务状态机 | 反转 = 高优先级任务在 Blocked 里被拖 | 以为高优先级永远不会等 |
| 抢占 | 反转破坏"最高优先级先跑"的抢占规则 | 以为抢占保证一切 |
| 实时性 | 反转让延迟不可预测 → 实时任务错过 deadline | 以为反转只是慢一点 |
2026-08-03
每主题一页,复习时只翻本目录。