当前位置: 首页 > article >正文

FreeRTOS: 优先级翻转的典型场景

        优先级翻转(Priority Inversion)是指在多任务操作系统中,尤其是实时系统中,一个高优先级任务因为等待一个低优先级任务持有的资源而被阻塞,导致高优先级任务不能及时得到执行的现象。这种现象可能会破坏系统的实时性,甚至引起系统不稳定或失效。

优先级翻转的典型场景

假设有三个任务:TA、TB 和 TC,它们的优先级分别为 TA > TC > TB(即 TA 是最高优先级任务,TB 是最低优先级任务)。当以下情况发生时,就会出现优先级翻转:

  1. TB 持有共享资源:假设 T3 正在使用某个需要互斥访问的共享资源(例如通过获取互斥信号量),此时它持有该资源。
  2. TA 需要相同的共享资源:接下来,高优先级任务 TA 开始运行,并尝试获取相同的共享资源。但由于资源已经被 TB 占用,TA 必须等待 TB 释放资源,因此 TA 被阻塞。
  3. TC 运行:在此期间,中等优先级的任务 TC 就绪并开始运行,因为它比被阻塞的 TA 优先级低但比 TB 高。这会导致 TB 不能立即运行以释放资源给 TA,反而继续让 TC 执行,即使 TA 的优先级更高。
  4. 结果:最终,高优先级任务 TA 的执行被延迟了,直到 TB 再次获得 CPU 并完成其对资源的操作,从而释放资源。这样的延迟可能违反了 TA 的实时性要求。

解决优先级翻转的方法

为了防止优先级翻转问题的发生,可以采用以下几种方法:

1. 优先级继承协议 (Priority Inheritance Protocol, PIP)

(补充知识点: 互斥信号量是包含优先级继承机制的二进制信号量。 二进制信号量能更好的实现同步(任务间或任务与中断之间),而互斥信号量有助于更好实现简单互斥(即相互排斥))

  • 原理:当高优先级任务因等待低优先级任务持有的资源而被阻塞时,临时提升低优先级任务的优先级到与高优先级任务相同的水平,使得低优先级任务能够尽快完成对资源的操作并释放资源,然后恢复其原始优先级
  • 优点:简单有效,能迅速解决问题,且不需要额外的资源开销。
  • 缺点:如果多个高优先级任务同时等待同一个低优先级任务持有的资源,可能导致复杂的优先级调整。

(注意:优先级继承协议并不能完全解决优先级翻转,只是在某些情况下将影响降至最低 

         不能在中断中使用互斥信号量, 原因如下:

                1、互斥信号量使用的优先级集成机制要求从任务中(而不是从中断中)获取和释放互斥信号量

                2、中断无法保持阻塞来等待一个被互斥信号量保护的资源。

适用场景
  • 大多数实时嵌入式系统:特别是那些对响应时间和资源使用效率有较高要求的系统,如汽车电子、工业控制等。
2. 优先级天花板协议 (Priority Ceiling Protocol, PCP)
  • 原理:每个资源都关联一个固定的“天花板”优先级,等于所有可能请求该资源的任务中的最高优先级。任何试图获取此资源的任务都会暂时将其优先级提升至该天花板值,直到它释放资源为止。
  • 优点:避免了多个任务间的复杂优先级调整,确保了最坏情况下也能满足实时性需求。
  • 缺点:可能会造成一些不必要的优先级提升,导致较低优先级的任务过早抢占较高优先级的任务。
适用场景
  • 严格实时系统:例如航空电子设备、医疗设备等领域,这些领域对系统的可靠性和可预测性有着极高的要求。
3. 避免长时间持有共享资源
  • 设计建议:尽量减少任务持有共享资源的时间长度,这样即使发生优先级翻转,影响也会较小。可以通过优化算法、分割大操作为小步骤等方式来实现这一点。

实际应用

        在大多数实际应用中,优先级继承协议 (PIP) 是首选方案,因为它提供了较好的平衡——既能有效防止优先级翻转,又不会显著增加系统的复杂性和资源消耗。它被广泛应用在各种实时嵌入式系统中,并且得到了许多操作系统的原生支持。然而,对于那些对实时性有极端苛刻要求的应用(如航空航天和医疗设备),则可能更倾向于采用优先级天花板协议 (PCP) 来确保最严格的实时保障。最后,无论选择哪种方法,都应该尽量遵循避免长时间持有共享资源的最佳实践,以进一步优化系统的稳定性和性能。

       


http://www.kler.cn/a/460293.html

相关文章:

  • 生态碳汇涡度相关监测与通量数据分析实践技术应用
  • Unity 对Sprite或者UI使用模板测试扣洞
  • 从企业级 RAG 到 AI Assistant,阿里云 Elasticsearch AI 搜索技术实践
  • filebeat采集应用程序日志和多行匹配
  • 某小程序sign签名参数逆向分析
  • VMware安装配置
  • 基于 Node.js 的 ORM(对象关系映射)工具——Sequelize介绍与使用,并举案例分析
  • 【游戏设计原理】40 - 游戏体裁
  • 46. Three.js案例-创建颜色不断变化的立方体模型
  • ESP-NETIF L2 TAP 接口-物联网嵌入式开发应用
  • MIT线性代数教材:Linear Algebra and Its Applications
  • 淺談Cocos2djs逆向
  • [算法] [leetcode-75] 颜色分类
  • 掌握机器学习与MySQL集成实战Ruby和JavaScript辅助Redis缓存策略
  • 双目视觉:reprojectImageTo3D函数
  • Scala Collection(集合)
  • 解锁手机矩阵的流量密码:云手机的奇幻之旅
  • 记一次音频无输出的解决方案
  • ES中查询中参数的解析
  • Paimon_01_241020
  • 前端超大缓存IndexDB、入门及实际使用
  • win10 重装系统中 或 电脑恢复重置中的 优化步骤
  • 寄存器总结
  • 开发小工具:ping地址
  • django StreamingHttpResponse fetchEventSource实现前后端流试返回数据并接收数据的完整详细过程
  • PHP框架+gatewayworker实现在线1对1聊天--mysql数据库(3)