什么是优先级反转及解决方法

本文解析了优先级反转现象,通过线程示例说明高优先级任务被低优先级阻塞的问题,并介绍了两种解决方案:优先级继承与优先级天花板,帮助理解如何避免调度延迟,提高实时性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是优先级反转

优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即:

高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。-- 从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。

具体来说:当高优先级任务正等待信号量(此信号量被一个低优先级任务拥有着)的时候,一个介于两个任务优先之间的中等优先级任务开始执行——这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法执行类似死锁的情形发生。

一个具体的例子:假定一个进程中有三个线程Thread1(高)、Thread2(中)和Thread3(低),考虑下图的执行情况。

优先级反转实例图示
优先级反转实例图示
  • T0时刻,Thread3运行,并获得同步资源SYNCH1;
  • T1时刻,Thread2开始运行,由于优先级高于Thread3,Thread3被抢占(未释放同步资源SYNCH1),Thread2被调度执行;
  • T2时刻,Thread1抢占Thread2;
  • T3时刻,Thread1需要同步资源SYNCH1,但SYNCH1被更低优先级的Thread3所拥有,Thread1被挂起等待该资源
  • 而此时线程Thread2和Thread3都处于可运行状态,Thread2的优先级大于Thread3的优先级,Thread2被调度执行。最终的结果是高优先级的Thread1迟迟无法得到调度,而中优先级的Thread2却能抢到CPU资源。

上述现象中,优先级最高的Thread1要得到调度,不仅需要等Thread3释放同步资源(这个很正常),而且还需要等待另外一个毫不相关的中优先级线程Thread2执行完成(这个就不合理了),会导致调度的实时性就很差了。

以下为两种解决方案,相关C语言代码模拟 问题实现及解决 点击此处查看

解决方法1:优先级继承

优先级继承就是为了解决优先级反转问题而提出的一种优化机制。其大致原理是让低优先级线程在获得同步资源的时候(如果有高优先级的线程也需要使用该同步资源时),临时提升其优先级。以前其能更快的执行并释放同步资源。释放同步资源后再恢复其原来的优先级。

带有优先级继承调度过程

与上图相比,到了T3时刻,Thread1需要Thread3占用的同步资源SYNCH1,操作系统检测到这种情况后,就把 Thread3的优先级提高到Thread1的优先级。此时处于可运行状态的线程Thread2和Thread3中,Thread3的优先级大于Thread2的优先级,Thread3被调度执行。

Thread3执行到T4时刻,释放了同步资源SYNCH1,操作系统恢复了Thread3的优先级,Thread1获得了同步资源SYNCH1,重新进入可执行队列。处于可运行状态的线程Thread1和Thread2中,Thread1的优先级大于Thread2的优先级,所以Thread1被调度执行。

通过优先级继承机制,可以有效解决优先级反转问题,使优先级最高的Thread1获得执行的时机提前。

解决方法2:优先级天花板

优先级天花板是当线程申请某共享资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板。

这种方法简单易行,不必进行复杂的判断,不管线程是否阻塞了高优先级线程的运行,只要线程访问共享资源都会提升线程的优先级。

### RTOS 中优先级反转问题及其解决方案 #### 优先级反转概述 优先级反转是在实时操作系统(RTOS)中遇到的一个典型挑战,尤其在应用优先级调度算法的情况下。此现象发生于多个任务共享同一资源之时,低优先级的任务持有该资源并阻止了更高优先级任务的正常运行[^1]。 #### 影响系统性能的表现形式 此类情况不仅造成高优先级任务不必要的等待,还会显著延长系统的响应周期,极端情况下可能引发系统不稳定或丧失其应有的实时特性,从而削弱整个系统的效能表现[^3]。 #### 常见解决策略 ##### 优先级继承 一种有效的方法是实施所谓的“优先级继承”。具体而言,在FreeRTOS这样的环境中,当较高优先级别的进程因较低者占有互斥锁而受阻时,后者会被赋予前者相同的优先等级直至完成对该资源的操作为止。这种方法确保即使原本处于劣势地位的过程也能迅速推进,进而解除对更紧迫工作的阻碍[^2]。 ```c // 创建具有优先级继承特性的互斥锁实例 SemaphoreHandle_t xMutex; xMutex = xSemaphoreCreateMutex(); if (xMutex != NULL) { // 尝试获取互斥锁前后的操作... } ``` ##### 优先级天花板协议 另一种预防措施称为“优先级天花板”,即预先设定好每一个公共资源所能允许的最大访问权限级别。任何试图利用特定资源的对象都需按照不低于这一上限的标准来运作,以此防止潜在冲突的发生。 ##### 时间片轮转调度调整 对于某些场景下可能出现的问题,还可以考虑引入时间片的概念——给予重要程度较高的活动更多机会去执行它们所需的工作负载,借此缓解由于长时间排队所造成的延误状况。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值