26.优先级反转.md 5.0 KB

优先级反转

判别规则(核心,唯一要记的)

  • 识别反转三要素:① 高优先级任务等一个资源 ② 资源被低优先级任务持有 ③ 中优先级任务(优先级在两者之间)插队抢占持有者。三者齐 → 优先级反转
  • 解决:共享资源用互斥量(优先级继承)或用优先级天花板;别拿二值信号量当锁用

一句话:"低优先级拿着钥匙不放,中优先级插队——最高优先级被两个低优先级拖住。"

抽象描述(一句话本质)

优先级反转 = 高优先级任务被低优先级任务间接阻塞,反而让中优先级任务抢走了 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

正反例(建立直觉)

  • 正例1(反转):A(8) 等互斥量,B(2) 持互斥量,C(4) 就绪长跑 → 8>4>2 → 反转
  • 正例2(无反转):A(8) 等互斥量,B(2) 持互斥量,C(1) 就绪 → C(1) 比持有者 B(2) 还低,抢不了 → 无反转
  • 反例:只满足"高等待 + 低持有",插队者优先级不在两者之间 → 不构成反转

易混对比

二值信号量 Binary Semaphore 互斥量 Mutex
优先级继承 ❌ 无 ✅ 有(默认)
所有权 ❌ 任何人可释放 ✅ 只能由获取者释放
用途 事件通知/同步 保护共享资源(互斥)
反转风险 继承机制缓解

优先级继承 vs 优先级天花板

优先级继承 优先级天花板
机制 把持锁者动态提升到当前等待者水平,释放后恢复 把持锁者静态提到所有会用这锁的任务的最高级
优点 灵活、不过度提升 简单可靠、无链式计算
缺点 实现复杂(链式继承)、运行时开销 过度提升,可能降低整体实时性

变体验证(3 题,全过=学会)

  1. A(8) 等互斥量,B(2) 持互斥量,C(4) 就绪长跑 → 有反转(8>4>2)
  2. 陷阱题:A(8) 等互斥量,B(2) 持互斥量,C(1) 就绪 → 没有反转(C 比持有者还低,抢不了)
  3. 换互斥量为什么能解决 → 优先级继承:把持有者 B 临时提升到等待者 A 的水平 → 中优先级 C 抢不了 B → B 快速释放 → A 拿到后 B 恢复原优先级

口述要点(面试怎么讲)

  • 结论先行:三要素(高等待 + 低持有 + 中插队)判别;互斥量解决
  • 优先级继承:把持有者(低优先级)临时提升到等待者(高优先级)水平,释放后恢复 → 中优先级抢不了持有者。灵活但实现复杂(链式继承)
  • 优先级天花板:持锁者静态提到所有会用这锁的任务的最高级 → 简单可靠但过度提升
  • FreeRTOS 选型:保护共享资源 → 互斥量(带继承 + 所有权);通知事件/同步 → 二值信号量。反转场景必须互斥量
  • 危害本质:反转不必然饿死任务,但使高优先级任务延迟不可预测、错过 deadline——实时性破坏的本质是"执行时间不确定"
  • 易错点:插队者优先级不在两者之间不算反转;拿二值信号量当锁用

关系网络

相邻概念 和本主题的关系 孤立理解会犯的错
信号量/互斥量 反转的载体:二值信号量会反转,互斥量自带继承 拿二值信号量当锁用
任务状态机 反转 = 高优先级任务在 Blocked 里被拖 以为高优先级永远不会等
抢占 反转破坏"最高优先级先跑"的抢占规则 以为抢占保证一切
实时性 反转让延迟不可预测 → 实时任务错过 deadline 以为反转只是慢一点

学习日期

2026-08-03


每主题一页,复习时只翻本目录。