结论:优先级反转指高优先级任务因等待低优先级任务持有的锁而被阻塞,期间中优先级任务抢占低优先级任务运行,导致高优先级任务实际上排在中优先级任务之后——优先级语义被颠倒。著名的火星探路者号故障就是优先级反转导致的系统复位。
展开:成因链:低优先级任务 L 持锁 → 高优先级任务 H 申请同一把锁被阻塞 → 中优先级任务 M 抢占 L → L 迟迟无法释放锁 → H 被无限期推迟。两种经典解法:1)优先级继承(priority inheritance):H 阻塞在锁上时,L 临时继承 H 的优先级,保证 L 尽快跑完临界区归还锁,之后恢复原优先级——Linux 的 rt_mutex、pthread 的 PTHREAD_PRIO_INHERIT 都实现了它;2)优先级天花板(priority ceiling):锁被赋予其所有潜在使用者中最高的优先级,持锁期间任务立即提升到此优先级,还能顺带防止死锁。易错点:优先级继承只适用于有明确所有者的互斥锁,信号量这类无主同步原语做不了;优先级继承解决"有界等待",临界区长时高优先级任务仍要等。
追问方向:探路者号事故细节(看门狗复位 + 总线任务优先级反转)、用户态 futex 如何支持 PI(FUTEX_LOCK_PI)。