## 优先级反转 ## 判别规则(核心,唯一要记的) - **识别反转三要素:① 高优先级任务等一个资源 ② 资源被低优先级任务持有 ③ 中优先级任务(优先级在两者之间)插队抢占持有者。三者齐 → 优先级反转** - **解决:共享资源用互斥量(优先级继承)或用优先级天花板;别拿二值信号量当锁用** 一句话:**"低优先级拿着钥匙不放,中优先级插队——最高优先级被两个低优先级拖住。"** ## 抽象描述(一句话本质) 优先级反转 = 高优先级任务被**低优先级任务**间接阻塞,反而让**中优先级任务**抢走了 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 --- _每主题一页,复习时只翻本目录。_