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

FreeRTOS优先级翻转

优先级翻转

优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行

优先级翻转在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未知的严重后果。

在使用二值信号量的时候,经常会遇到优先级翻转的问题。

举例说明

优先级翻转示意图,如上图所示,定义:任务H为优先级最高的任务,任务L为优先级中最低的任务,任务M为优先级在任务H和任务L之间的任务。

也就是说任务优先级:任务H>任务M>任务L

(1)任务H和任务M为阻塞状态,等待某一事件发生,此时任务L正在运行

(2)此时任务L要访问共享资源,因此需要获取信号量

(3)任务L成功获取信号量,并且此时信号量已无资源,任务L开始访问共享资源

(4)此时任务H就绪,抢占任务L运行

(5)任务H开始运行

(6)此时任务H要访问共享资源,因此需要获取信号量,但信号量已无资源(注:这里信号量为二值信号量),因此任务H阻塞等待信号量资源

(7)任务L继续运行

(8)此时任务M就绪,抢占任务L运行

(9)任务M正在运行

(10)任务M运行完毕,继续阻塞

(11)任务L继续运行

(12)此时任务L对共享资源的访问操作完成,释放信号量,虽有任务H因成功获取信号量,解除阻塞并抢占任务L运行

(13)任务H得以运行

从上面的优先级翻转的示例中,可以看出,任务H为优先级最高的任务,因此任务H执行的操作需要有较高的实时性,但是由于优先级翻转的问题,导致了任务H需要等到任务L释放信号量才能够运行,并且,任务L还会被其他介于任务H与任务L任务优先级之间的任务M抢占,因此任务H还需等待任务M运行完毕,这显然不符合任务H需要的高实时性的要求。

个人总结

任务优先级翻转在实时操作系统中是不允许出现的,使用互斥量的优先级继承可以解决优先级翻转的问题,但是这里只是能够降低优先级翻转带来的影响,而不能完全消除优先级翻转带来的问题,通俗的说,虽然低优先级任务优先级提高了,但是还是要等优先级低的任务执行释放操作,高优先级任务才可以得以运行,这里只是解决了介于低优先级和高优先级之间中优先级任务带来的问题。比如没有引入互斥量,高优先级需要等待L+M任务运行的时间,引入之后只有任务L运行的时间。

一句话:优先级翻转可以减轻,但不能完全消除。

http://www.lryc.cn/news/21051.html

相关文章:

  • 服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】
  • golang项目----家庭收支记账软件
  • 中国LNG市场投资机会研究
  • Elasticsearch:索引数据是如何完成的
  • 处理器管理
  • 跟着我从零开始入门FPGA(一周入门系列)第五
  • 【第42天】Arrays.sort 与 Collections.sort 应用 | 整形数组与集合的排序
  • LeetCode第334场周赛
  • 基于深度学习的三维重建网络PatchMatchNet(三):PatchMatchNet配置及代码主要运行流程
  • 【一天一门编程语言】设计一门编程语言,给出基础语法代码示例,SDK设计。
  • ubuntu 下 python 安装 venv
  • HTML#1快速入门
  • 【MySQL】事务隔离级别是怎么实现的?
  • JSP网上书店系统用myeclipse定制开发mysql数据库B/S模式java编程计算机网页
  • 配置 Haproxy 负载均衡群集
  • 计算机网络笔记 | 第一章:计算机网络概述(1.1-1.4小节知识点整理)
  • Flutter3引用原生播放器-Android篇
  • SerenityOS 操作系统类 Unix 操作系统
  • Bean作用域和生命周期
  • STM32笔记
  • 【论文阅读】基于LevelDB的分布式数据库研究
  • JavaScript高级 Iterator Generator
  • 数字IC手撕代码--乐鑫科技(次小值与次小值出现的次数)
  • JavaScript DOM和BOM
  • JUC并发编程(二)
  • Python控制CANoe使能TestCase
  • sql的执行顺序
  • java 8 中的实用技巧
  • 自学大数据的第一天
  • redis秒杀