外观
优先级继承为什么能缓解优先级反转
约 1182 字大约 4 分钟
2026-11-10
在上一篇文章中,我们了解了什么是优先级反转,以及它带来了哪些问题。
那么,RTOS是怎么应对这个问题的呢?在RT-Thread等RTOS中,最常用的一种方法,就是优先级继承。
优先级继承的基本思路
先来回顾下什么是优先级反转。
优先级反转指的是:高优先级任务H因为等待低优先级任务L持有的锁,而被中优先级任务M间接阻塞的现象。这使得高优先级任务的等待时间变得不可控。 
优先级继承的思路比较直观:既然L持有锁的时候会阻塞H,那就在L持有锁的这段时间里,把L的优先级临时提升到和H一样高。
这样一来,就会使得M无法抢占L,L可以尽快执行完临界区的代码并释放锁。等L释放锁之后,再把它的优先级恢复到原来的值;此时,H获得锁并开始运行。
下面给出了采用优先级继承之后,这几个任务的时序图: 
这些任务之间相互配合的主要流程如下:
- L获取锁,H阻塞:H尝试获取被L持有的互斥锁,进入阻塞状态。
- 内核提升L的优先级:内核将L的优先级临时提升到H的优先级,此时M无法抢占L。
- L继续执行并释放锁:L以提升后的优先级运行,尽快执行完临界区,释放互斥锁。
- L恢复原优先级并唤醒H:L释放锁后,内核将L的优先级恢复原值,同时唤醒H,H获得锁并开始运行。
- M开始运行:当H释放CPU之后,M开始运行。
可以看到:M无法在L持有锁期间抢占L,H被阻塞的时间被限制在了L执行临界区的时间内,这段时间是可控且可预测的。
优先级继承的局限性
不过,优先级继承并不能完全消除优先级反转,只能在一定程度上缓解,将反转的时间限制在临界区的执行时间内。
具体来说,该机制仍有局限,比如:
- 临界区过长时效果有限:如果临界区本身很长,高优先级任务仍然需要等待较长时间。
- 链式阻塞:如果多个资源存在嵌套依赖,就可能形成复杂的阻塞链。比如,低优先级任务C依次占用资源X和Y,高优先级任务A等待X、中优先级任务B等待Y,优先级继承只能解决单层资源冲突,无法覆盖所有情况。
- 嵌套互斥锁的局限性:如果任务需要嵌套获取多个互斥锁,优先级继承的规则可能失效。比如,低优先级任务先获取锁A再获取锁B,两个高优先级任务分别等待A和B,此时持有者的优先级可能无法同时满足两个等待任务的需求。
总结
综上所述,优先级继承的核心是:让持有锁的低优先级任务,临时变成高优先级任务。
在优先级提升到和高优先级任务一样后,中优先级任务就无法抢占它,它就能尽快执行完临界区并释放锁。
通过这种方式,高优先级任务被阻塞的时间被限制在临界区的执行时间内,这段时间是确定且可控的。正是因为这种原因,优先级继承才能够缓解优先级反转。
如果你希望系统地学习RTOS底层原理,可以了解我的《RTOS开发与实战》课程。
课程不是简单地讲解FreeRTOS API的使用,而是带你从零开始编写一个RTOS内核,逐步实现任务管理、任务调度、上下文切换、同步与通信等核心机制,并通过一个远程温湿度监控设备项目,将操作系统原理应用到实际嵌入式开发中。
适合希望深入理解RTOS工作原理、提升嵌入式底层开发能力的同学。
