优先级反转及解决办法

上次去华为面试,被问及优先级反转及解决办法,虽然以前有所了解,但好长时间没用了,回答时竟然具体卡壳,真是汗颜。所以今天有必要再次理顺一下优先级反转的相关知识。 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了。那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优先级依次是A>B>C; 首先:C处于运行状态,获得CPU正在执行,同时占有了某种资源; 其次:A进入就绪状态,因为优先级比C高,所以获得CPU,A转为运行状态;C进入就绪状态; 第三:执行过程中需要使用资源,而这个资源又被等待中的C占有的,于是A进入阻塞状态,C回到运行状态; 第四:此时B进入就绪状态,因为优先级比C高,B获得CPU,进入运行状态;C又回到就绪状态; 第五:如果这时又出现B2,B3等任务,他们的优先级比C高,但比A低,那么就会出现高优先级任务的A不能执行,反而低优先级的B,B2,B3等任务可以执行的奇怪现象,而这就是优先反转。 (2)如何解决优先级反转 高优先级任务A不能执行的原因是C霸占了资源,而C如果不能获得CPU,不释放资源,那A也只好一直等在那,所以解决优先级反转的原则肯定就是让C尽快执行,尽早把资源释放了。基于这个原则产生了两个方法: 2.1 优先级继承 当发现高优先级的任务因为低优先级任务占用资源而阻塞时,就将低优先级任务的优先级提升到等待它所占有的资源的最高优先级任务的优先级。 2.2 优先级天花板 优先级天花板是指将申请某资源的任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级.(这个优先级称为该资源的优先级天花板) 2.3 两者的区别 优先级继承:只有一个任务访问资源时一切照旧,没有区别,只有当高优先级任务因为资源被低优先级占有而被阻塞时,才会提高占有资源任务的优先级;而优先级天花板,不论是否发生阻塞,都提升,即谁先拿到资源,就将这个任务提升到该资源的天花板优先级。

http://blog.youkuaiyun.com/hochy2008/article/details/5787928

### FreeRTOS 中优先级翻转问题及解决方案 #### 优先级翻转的概念 优先级翻转是指在实时操作系统中,由于资源共享机制的设计不当,导致高优先级任务被低优先级任务间接阻塞的现象。这种现象可能破坏系统的实时性和响应能力。具体来说,在多个任务竞争同一资源的情况下,如果一个高优先级任务需要等待某个低优先级任务完成对该资源的操作,则会发生优先级翻转。 为了缓解这一问题,FreeRTOS 提供了两种主要的解决策略:**优先级继承**和**优先级天花板**[^1]。 --- #### 优先级继承 (Priority Inheritance) 优先级继承是一种动态调整任务优先级的方法。当一个高优先级任务因无法获得由低优先级任务持有的互斥锁而进入阻塞状态时,FreeRTOS 的互斥锁会自动将持有锁的低优先级任务的优先级提升至与高优先级任务相同级别。这样可以减少高优先级任务的阻塞时间,并尽快恢复其执行流。一旦低优先级任务释放互斥锁,它的原始优先级会被立即恢复[^2]。 以下是优先级继承的工作流程: 1. 高优先级任务试图获取已被低优先级任务占用的互斥锁。 2. 如果互斥锁不可用,高优先级任务进入阻塞队列。 3. 此时,低优先级任务的优先级被临时提升到等于或高于高优先级任务的水平。 4. 低优先级任务继续运行并最终释放互斥锁。 5. 高优先级任务重新获取互斥锁并恢复正常操作。 6. 低优先级任务恢复原来的优先级。 此机制能够有效降低优先级翻转的影响,但可能会引入额外的上下文切换开销。 --- #### 优先级天花板 (Priority Ceiling) 另一种防止优先级翻转的技术是优先级天花板。在这种方法下,每当有任务请求访问某一共享资源时,无论是否存在冲突,该任务的优先级都会被强制提升到预先定义的一个固定值——即该资源对应的“优先级天花板”。这种方式无需检测是否有实际的优先级反转发生即可提前预防潜在问题[^3]。 相比优先级继承,优先级天花板的优点在于其实现更为简单直观;缺点则是可能导致某些情况下不必要的频繁提权行为,从而增加调度负担。 --- #### 实际应用中的选择建议 开发者应根据应用场景特点来决定采用哪种方式处理优先级翻转: - **对于复杂度较高且难以预测交互关系的系统**,推荐使用优先级继承方案,因为它仅会在必要时刻才触发优先级变更动作; - 而针对那些结构较为稳定、各组件间依赖清晰的小型嵌入式项目而言,设置固定的优先级天花板可能是更高效的选择。 无论是哪一种途径都需要合理规划各个任务之间的相对重要程度以及它们所涉及的关键数据区段范围,这样才能充分发挥各自的优势同时规避可能出现的新隐患。 --- ```c // 示例代码展示如何创建带优先级继承特性的互斥量 #include "FreeRTOS.h" #include "semphr.h" SemaphoreHandle_t xMutex; void vTaskFunction( void *pvParameters ) { // 创建具备优先级继承功能的互斥信号量 xMutex = xSemaphoreCreateMutex(); if( xMutex != NULL ) { while(1) { // 尝试获取互斥量 if( xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE ) { // 执行临界区内代码... // 释放互斥量 xSemaphoreGive(xMutex); } } } vTaskDelete(NULL); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值