首页 > 其他分享 >RTOS 优先级倒置

RTOS 优先级倒置

时间:2023-06-05 10:45:04浏览次数:49  
标签:优先级 RTOS 互斥 任务 mutex 线程 倒置

问题背景

在多任务实时操作系统(Real Time Multitask Operating System,简称multi-task RTOS)中,为实现多线程同时运行,OS需要实现一种多个任务之间的切换,即任务调度算法(或策略)。RTOS中,常见调度算法是优先级调度:每个任务(线程)分配一个优先级,按任务紧急状况来划分,一般优先级数值越小,优先级越高,先被OS调度执行。

而多任务ROTS中,经常出现多个任务同时访问同一资源的情况。为避免多个任务同时访问同一资源(如串口、网络等),引入同步原语中等互斥体(mutex,也可翻译成互斥量)。被互斥体保护的代码段,称为“临界区”(critical section)。当一个任务进入临界区前,必须获取(acquire)与此区域相关联的互斥体所有权。如果已经有一个任务获取进入临界区的互斥体,其他任务就不能再进入该临界区,而必须等待持有互斥体的任务释放(release)互斥体的所有权。

关于互斥体概念和用法,详见Linux 自旋锁,互斥量(互斥锁),读写锁

优先级倒置概念

引入互斥体后,也带来了其他问题,即优先级倒置(Priority Inversion),也称优先级反转

为方便解释,现假设有3个任务:A,B,C(优先级数值3,2,1,),优先级顺序:A < B < C,其中A和C需要访问共享资源。

如果低优先级任务A已占用mutex,且正访问共享资源时,被中等优先级任务B抢占,此时B运行,A就绪;如果高优先级任务C除了需要共享资源外、其他条件都满足,但依然无法运行。看起来任务C被更低优先级的任务B阻塞了。这样,系统的实时性无法得到保证。
—— 这就是优先级倒置问题。

产生原因

为什么会产生优先级倒置问题?
可抢占式的优先级调度策略 + 不同优先级线程对共享资源访问的同步机制。高优先级线程C和低优先级A要访问共享资源,中等优先级B不访问共享资源。当A访问共享资源时(已经获得mutex),C等到(A释放mutex),但A被B抢占了,导致B运行。最终结果是,B运行,A、C等待。也就是说,高优先级C被阻塞,中等优先级B运行。

解决办法

有3种:
1)将代码进行适当组织安排,如确保mutex不被处于不同优先级线程共享,避免优先级倒置发生;
2)优先级置顶协议(Priority Ceiling Protocol):获得mutex的线程运行时的优先级,比其他获取该mutex的线程的优先级都要高。即每个mutex都被分配一个优先级,该优先级通常与所有可以拥有该互斥体的线程中等最高优先级相对应。当优先级较低的线程占用mutex后,就被提升到mutex的优先级。相当于临时提升线程优先级到最高的mutex优先级。
3)优先级继承协议(Priority Inheritance Protocol):将占有mutex的线程优先级提升到所有正在等待该mutex的线程优先级的最高值。

参考

优先级倒置(Priority inversion) | CSDN

标签:优先级,RTOS,互斥,任务,mutex,线程,倒置
From: https://www.cnblogs.com/fortunely/p/17457230.html

相关文章

  • FreeRtos的移植,以及一些嵌入式学习心得。
    不得不先提心得。这不是第一次移植FreeRtos,至少是五六七八九次了,当然也不是最后一次。但是每一次移植其实都差不多,并没有什么得心应手的感觉。原因就是学的东西太多,学的太杂。我不得不承认,就算我天资聪慧,异于常人,记这么多知识是不可能的。人力有穷时。尊重这个客观现实,但不放......
  • Linux系统下提升进程优先级的办法
    与别人共用工作站或者集群进行大型运算,比较愁人,老是与别人分享资源,太蛋疼,所以找了个小妙招,可以试用一下。 Linux系统进程的优先级取值:-20到19,数越大优先级越低。 可以通过top命令来查看,NI那一列。 改变进程的优先级的方法有两种: www.2cto.com 1,top命令。输入r,然后......
  • C++ 中的运算符优先级
     运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。例如x=7+3*2,在这里,x被赋值为13,而不是20,因为运算符*具有比+更高的优先级,所以首先计算乘法3*2,然后再加......
  • 用POSIX线程库创建带优先级的线程
    #include<iostream>#include<pthread.h>void*threadFunction(void*arg){//线程函数逻辑//...returnnullptr;}intmain(){pthread_tthread;pthread_attr_tattr;//初始化线程属性pthread_attr_init(&attr);//......
  • Java并发(七)----线程sleep、yield、线程优先级
    1、sleep与yieldsleep调用sleep会让当前线程从Running进入TimedWaiting状态(阻塞)其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException睡眠结束后的线程未必会立刻得到执行建议用TimeUnit的sleep代替Thread......
  • Priority(优先级)
    Priority(优先级)是一个表示日志消息重要程度或级别的枚举类型。在不同的日志系统或应用程序中,该枚举类型的名称、值和含义可能会有所不同。下面是一个常见的优先级枚举示例:publicenumPriority{DEBUG,//调试信息INFO,//信息性消息NOTICE,//一般......
  • 优先级队列的实现详解( Java 实现)
    前言优先级队列是在队列的基础上,每个元素都带有一个优先级,可以实现按照优先级高低进行存储和访问。Java提供了许多实现优先级队列的方法,例如使用堆来实现。在本篇博客中,我将介绍Java实现优先级队列实现的具体方法,以及如何使用它来解决实际问题。一、优先级队列的概念优先级队列......
  • 【无人机任务分配】基于合同网协议(CNP算法)实现多无人机具有时间窗口和优先级约束任务
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • MacOs前后台调度优先级观察
    场景构造用swiftui写6个一摸一样的helloworld程序,间隔1s刷新展示一个不断递增的数字。分别将6个应用至于前台焦点(App_Foreground)、前台非焦点完全可见(App_Complete_Visiable)、半遮挡(App_Partially_Visiable)、被完全遮挡(App_Unvisiable)、最小化(App_Minimize)、隐藏(App_Hide)。如......
  • FreeRTOS 信号量
    二值信号量  二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承。  和队列一样,信号量API函数允许设置一个阻塞时间,阻塞时间是当任务获取信号量的时候由于信号量无效从而导致......