优先级反转是实时系统中的经典问题:高优先级任务因等待低优先级任务持有的锁而被阻塞,而中优先级任务又抢占了低优先级任务,导致高优先级任务被间接拖延。1997 年火星探路者号的系统重启故障就是著名案例,常用解法是优先级继承和优先级天花板协议。

| 所属领域 | 实时调度 |
| 典型案例 | 1997 年火星探路者号故障 |
| 主要解法 | 优先级继承、优先级天花板 |
| 相关系统 | VxWorks、QNX、FreeRTOS |
| POSIX 属性 | PTHREAD_PRIO_INHERIT |
优先级反转(Priority Inversion)是抢占式多任务系统中的一种调度异常:高优先级任务需要的共享资源被低优先级任务持有,而低优先级任务又被若干中优先级任务抢占、迟迟无法运行,结果高优先级任务的等待时间由不相干的中优先级任务决定,优先级形同虚设。
设有高、中、低三个优先级的任务 H、M、L。L 先获得了某互斥锁,随后 H 就绪并试图获取同一把锁,只能阻塞等待 L 释放。此时若 M 就绪,由于 M 的优先级高于 L,调度器会让 M 运行,L 得不到 CPU,也就永远无法释放锁,H 被无限期搁置。这一问题在通用系统中往往只表现为性能抖动,但在硬实时系统中可能造成错过截止期限的严重后果。最著名的案例发生在 1997 年:美国国家航空航天局(NASA)的火星探路者号着陆后反复自动重启,喷气推进实验室工程师与风河公司(Wind River)排查后确认,是 VxWorks 系统上一处信息总线互斥锁引发的优先级反转导致看门狗超时,最终通过远程打开互斥锁的优先级继承选项解决。
优先级反转是实时操作系统设计与评审的必查项,VxWorks、QNX、FreeRTOS、RT-Thread 等系统的互斥量都提供优先级继承选项。在汽车电子、航空航天、工业控制等硬实时领域,相关协议的正确配置直接关系到系统安全;在通用 Linux 上,PREEMPT_RT 补丁也大量依赖优先级继承来保障实时性。
问:优先级反转和死锁是一回事吗?答:不是。死锁是多个任务互相持有对方所需资源导致全部卡死;优先级反转中系统仍在运行,只是高优先级任务被不合理地延误,资源最终仍会释放。
问:普通应用需要关心优先级反转吗?答:多数分时应用感知不明显,但音视频、游戏等对延迟敏感的程序若使用实时优先级线程加互斥锁,仍应启用优先级继承属性,否则可能出现卡顿毛刺。

| 所属领域 | 实时调度 |
| 典型案例 | 1997 年火星探路者号故障 |
| 主要解法 | 优先级继承、优先级天花板 |
| 相关系统 | VxWorks、QNX、FreeRTOS |
| POSIX 属性 | PTHREAD_PRIO_INHERIT |
登录 后参与讨论
暂无讨论,来发表第一条评论吧