优先级反转问题及常见解决方案
- 格式:docx
- 大小:65.56 KB
- 文档页数:2
优先级反转问题以及解决方式优先级反转的问题是每一个实时操作系统所必须考虑到的问题,也是嵌入式软件面试所常提问的问题。
下面会详细阐述优先级反转产生的根源,以及解决方式。
首先来谈谈优先级反转问题的出现的方式。
下图是演示优先级反转出现的问题。
假设有3个任务task1 优先级最高,task2优先级其次,task3优先级最低。
假设task1 ,task2 分别阻塞在内核对象上比如queue等,然后轮到task3去运行,首先task3 获得了一个semaphore锁,然后运行了一段时间后,中断唤醒了task1,出中断的时候马上跑task1, 因为task1 的优先级高,然后task1也尝试去获得semaphore锁,但是task3 已经得到了这个锁,所以task1 只能睡眠,轮到task3 继续跑,这个时候中断唤醒了task2,出中断的时候轮到task2去跑,因为task2的优先级比task1要高。
task2 运行完了然后给task3 跑,task3 跑完了才轮到task1去跑。
以上的现象就是一个完整的优先级反转的问题出现的现象,整个逻辑貌似都是完全没有任何问题的,唯一的问题就是task2跑完了再去跑task1,也就是说task2插了一脚。
task2 的优先级比起task1 要低的,这样的话task1 要同时承受task2 和task3 跑完才能继续跑。
承受task3 跑完是没有任何争议的,因为临界区的原因,task1只能等task3跑完,但是task1等待task2 跑完确是不应该的,因为这两个任务之间毫无关系。
解决优先级反转的方式有两种,第一种是优先级置顶的方法,第二种是优先级继承的方法,详细请参考以下mutex章节。
Mutex工作原理以及应用mutex 的出现是为了解决优先级反转的问题,由于优先级反转对实时性影响太大,所以mutex 的稳定性直接影响了实时性。
纵观目前多种实时操作系统mutex 的设计原理是多多少少有一点问题的,很多rtos没有实现mutex优先级逐步还原的问题,导致了实时性以及其它的一些逻辑错误等等。
在这里先假高已经创建了三个不同优先级的任务,任务0的优先级为5,任务1的优先级为6,任务2的优先级为7;在main()函数里创建一个二值信号量;mutex=OSSemCreate(1);函数OSSemCreate()的参数值的范围为:0~65535;下面例子已经在程序里安排好时序了。
每个任务里都有足够长的延时。
任务0与任务2一起使用这个二值信号量;任务1只执行打印输出语句;当任务2在使用这个二值信号量时,任务1与任务0都处于就绪态,任务2的程序执行到延时挂起时,任务0就会被系统调度执行。
执行到申请信号量的函数OSSemPend()时,由于该二值信号量正被任务2使用,所以任务0没有申请到该资源,因而任务0被阻塞,然后被系统挂起,系统再次进行任务调度,此时任务1的优先级最高,所以任务1就会进入运行态。
当任务1被挂起时,就算任务0已经处于就绪态,但仍然要等任务2释放这个二值信号量才到运行。
这样就出现了,当一个共享资源被低优先级占用时,高优先级就得等这个低优先级的任务释放这个共享资源时才能进入运行态。
所以在上面出现了,任务1与任务2的优先级都比任务0的优先的情况。
这就是优先级反转问题。
下面补充一些资料--摘自uC_OS-II内核实验指导书:1、OSSemCreate ();该函数建立并初始化一个信号量,信号量的作用如下:允许一个任务和其他任务或者中断同步取得设备的使用权标志事件的发生函数原型:OSSemCreate(INT16U value);参数说明:value是所建立的信号量的初始值,可以取0到65535之间的任意值。
返回值:OSSemCreate()函数返回指向分配给所建立的信号量的控制块的指针。
如果没有可用的控制块,OSSemCreate()函数返回空指针。
2、OSSemPend()该函数用于任务试图取得设备的使用权、任务需要和其他任务或中断同步、任务需要等待特定事件的发生场合。
如果任务调用OSSemPend()函数时,信号量的值大于零,OSSemPend()函数递减该值并返回该值。
优先级反转简介优先级反转是一种软件开发中常用的策略,在多任务处理和调度中起到了重要的作用。
它被广泛应用于实时操作系统、嵌入式系统、并行计算,以及其他需要有效管理资源和优化响应时间的领域。
本文将介绍优先级反转的概念、原理、应用以及可能的优缺点。
什么是优先级反转?优先级反转是一种任务调度的优化策略,它能够解决由于任务优先级导致的资源占用和响应时间问题。
在传统的优先级调度中,较高优先级的任务会抢占较低优先级任务的系统资源,这可能导致低优先级任务等待较长时间并丧失了及时完成的能力。
而优先级反转则通过动态调整任务的优先级来解决这个问题。
具体来说,当一个低优先级任务需要访问被高优先级任务占用的共享资源时,传统的优先级调度方式会保持低优先级,导致低优先级任务一直在等待。
而优先级反转则在这种情况下,将低优先级任务的优先级提升到高优先级任务之间的优先级,从而保证低优先级任务能够及时获得所需的资源。
原理与实现优先级反转的实现需要满足以下几个条件:1.任务具有不同的优先级。
2.存在共享资源,且资源可能被多个任务访问。
3.优先级反转的触发条件满足,即低优先级任务需要访问高优先级任务占用的资源。
基于上述条件,下面是一种常见的优先级反转实现方式:1.定义任务的优先级,较高的优先级对应着紧急任务,而较低的优先级对应着一般任务。
2.当一个低优先级任务需要访问由高优先级任务占用的共享资源时,它会发出请求。
3.操作系统内核会检测到请求,并将低优先级任务的优先级提升到与高优先级任务之间的优先级。
4.一旦低优先级任务完成了对共享资源的使用,它的优先级会恢复到原来的值。
这种实现方式能够避免低优先级任务长时间等待的问题,从而提高了系统的响应时间和整体效率。
实际应用优先级反转在实际应用中被广泛使用。
以下是一些常见的应用场景:1.实时操作系统:在实时操作系统中,任务的响应时间非常重要。
通过采用优先级反转策略,可以确保高优先级任务能够及时地获得所需的资源,从而满足实时性要求。
优先级反转的问题场景和解决方法优先级反转,这可真是个让人头疼的问题啊!想象一下,在一个复杂的系统中,低优先级的任务竟然阻碍了高优先级任务的执行,这简直就是乱套了呀!要解决优先级反转问题,一般可以采取优先级继承的方法。
具体来说,就是当一个低优先级任务阻塞了一个高优先级任务时,将低优先级任务的优先级临时提升到高优先级任务的级别。
这就好像在道路上,一辆慢悠悠的车挡住了着急赶路的车,那干脆就让慢悠悠的车也加速跑起来。
步骤其实并不复杂,首先要能识别到这种情况的发生,然后及时进行优先级的调整。
但这里面也有一些注意事项哦,比如要确保调整的准确性,不能乱提升优先级,不然整个系统的秩序不也乱套了嘛!同时,还要考虑到这种调整对其他任务的影响,不能引发新的问题呀。
在这个过程中,安全性和稳定性可太重要啦!如果调整不当,可能会导致系统崩溃或者出现不可预料的错误。
就好比走钢丝,必须小心翼翼地保持平衡,稍有不慎就会掉下去。
所以在实施过程中,要进行充分的测试和验证,确保不会出现意外情况。
那么优先级反转的解决方法都有哪些应用场景和优势呢?这可多了去啦!在实时系统中,比如航空航天、工业控制等领域,它能确保关键任务及时得到执行,避免出现严重后果。
优势也是显而易见的呀,它能提高系统的整体性能和可靠性,让系统运行得更加顺畅。
比如说在一个医疗设备中,如果因为优先级反转导致重要的数据采集或治疗操作被延迟,那后果简直不堪设想啊!曾经就有一个例子,在一个医院的监护系统中,由于优先级反转问题,导致对病人关键数据的采集延迟了几秒钟,虽然最后没有造成严重后果,但也让人惊出一身冷汗呀!这就充分说明了在实际应用中,解决优先级反转问题是多么重要。
总之,优先级反转问题不容小觑,我们必须要重视起来,采取有效的解决方法,确保系统的安全、稳定和高效运行呀!。
freertos优先级反转处理方法
FreeRTOS的优先级反转问题是指当一个低优先级的任务阻塞
一个高优先级的任务,从而导致高优先级任务无法运行的问题。
为了解决这个问题,FreeRTOS提供了两种解决方案:
1. 优先级继承(Priority Inheritance)
在优先级继承解决方案中,当一个低优先级任务获取了一个高优先级任务需要使用的资源时,会将其优先级提升到高优先级任务的优先级,直到释放该资源。
这样可以保证高优先级任务不会因为低优先级任务的阻塞而出现优先级反转的问题。
2. 优先级屏蔽(Priority Ceiling)
在优先级屏蔽解决方案中,每个任务都有一个优先级屏蔽值,表示该任务最高可以处理的中断优先级。
当一个任务获取了一个共享资源时,会提升其优先级屏蔽值到该资源的最高访问中断优先级,这样可以保证如果高优先级任务需要访问该资源,它的中断优先级会被限制在该资源的最高访问中断优先级以下,从而避免了优先级反转的问题。
需要注意的是,优先级继承和优先级屏蔽都会增加系统的开销,因此应该根据实际需求选择适合的解决方案。
实验4 优先级反转1 实验目的掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理。
2 原理及程序结构2.1 实验设计2.1.1 优先级反转原理在本实验中,要体现嵌入式实时内核的优先级抢占调度的策略,并显现由于共享资源的互斥访问而出现的优先级反转现象。
优先级反转发生在有多个任务需要使用共享资源的情况下,可能会出现高优先级任务被低优先级任务阻塞,并等待低优先级任务执行的现象。
高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务,这种现象就被称为优先级反转。
两个任务都试图访问共享资源是出现优先级反转最通常的情况。
为了保证一致性,这种访问应该是顺序进行的。
如果高优先级任务首先访问共享资源,则会保持共享资源访问的合适的任务优先级顺序;但如果是低优先级任务首先获得共享资源的访问,然后高优先级任务请求对共享资源的访问,则高优先级任务被阻塞,直到低优先级任务完成对共享资源的访问。
2.1.2 设计要点1)设计了3个应用任务TA0~TA2,其优先级逐渐降低,任务TA0的优先级最高。
2)除任务TA1外,其它应用任务都要使用同一种资源,该资源必须被互斥使用。
为此,创建一个二值信号量mutex来模拟该资源。
虽然μC/OS-Ⅱ在创建信号量时可以选择采用防止优先级反转的策略,但在本实验中我们不使用这种策略。
3)应用任务的执行情况如图2-1所示:任务2任务1 任务0图2-1注意:图中的栅格并不代表严格的时间刻度,而仅仅表现各个任务启动和执行的相对先后关系。
2.1.3 系统的运行流程1) 系统初始化,之后进入main 函数;2) 在main 函数中,首先创建一个二值的信号量mutex ;3) 在main 函数中创建TaskStart 任务,由TaskStart 任务创建所有的应用任务(Task0、Task1、Task2)。
优先级较高的任务Task0、Task1先延时若干个时钟节拍,以便低优先级任务Task2运行。
优先编码器的优先级反向引言在计算机科学领域中,编码器是将一种数据表示形式转换为另一种数据表示形式的算法或设备。
编码器在各种应用中都发挥着重要的作用,例如数据压缩、图像处理和语音识别等。
在处理数据时,编码器的优先级反向指的是在使用不同的编码器时,优先级的顺序发生了反转。
本文将深入探讨优先编码器的优先级反向现象及其可能的原因和影响。
优先编码器的优先级反向现象什么是优先编码器在理解优先编码器的优先级反向之前,首先需要理解什么是优先编码器。
通常情况下,优先编码器指的是在处理数据时,系统会优先选择某种特定的编码器来进行数据转换。
这个选择通常基于一些确定性因素,例如编码器的效率、准确性或者处理速度等。
优先编码器的优先级反向定义当优先编码器的优先级反向时,即系统在进行数据转换时,不再优先选择之前设定的编码器。
相反,其他编码器被优先选择,而原本的优先编码器处于次优先的位置。
优先编码器优先级反向的可能原因优先编码器的优先级反向可能由多种原因引起。
其中一种常见的原因是性能差异。
当原本设定的优先编码器的性能无法达到实际需求时,系统可能会自动选择其他编码器来替代。
另外,技术发展的进步也可能导致优先编码器的优先级反向,因为新的编码器可能具有更高的效率和准确性,进而被系统优先选用。
优先编码器优先级反向的影响优先编码器的优先级反向对系统和应用都可能产生一系列的影响。
首先是性能影响,原本的优先编码器未被优先选择,可能导致数据转换的速度变慢或者准确性下降。
其次是适应性的影响,如果系统能够及时调整优先编码器的选择,能够更好地适应不同环境下的需求。
最后,用户体验的影响也是一个重要的方面,如果优先编码器的优先级反向导致用户体验的下降,可能会对系统的可接受程度产生负面影响。
优先编码器优先级反向的解决方案动态优先级调整为了解决优先编码器优先级反向带来的问题,可以引入动态优先级调整的机制。
这种机制可以根据当前的应用场景和需求自动调整优先编码器的选择。
freertos xsemaphoretake 用法标题:深入探究FreeRTOS中xSemaphoreTake的用法摘要:本文将详细介绍FreeRTOS中xSemaphoreTake函数的使用方法。
我们将从基础概念入手,解释任务、信号量和信号量获取的概念。
然后,我们将逐步介绍xSemaphoreTake函数的用法,并提供示例以帮助读者更好地理解该函数的实际应用。
最后,我们将探讨一些使用xSemaphoreTake时可能遇到的问题,并提供解决方案。
引言:在并发编程中,任务间的同步和互斥是必不可少的。
FreeRTOS是一个广泛应用的实时操作系统,提供了一系列用于处理任务同步和互斥的机制。
其中,xSemaphoreTake函数是关键的函数之一,用于获取信号量。
信号量是一种计数器,用于管理资源的共享和访问。
本文将详细介绍xSemaphoreTake函数的用法,帮助读者更好地理解和应用。
第一部分:基础概念解释在开始介绍xSemaphoreTake函数之前,我们需要了解一些基础概念。
首先,任务是FreeRTOS中最基本的执行单元,可以理解为一个线程。
其次,信号量是一种特殊的变量,用于控制任务的同步和互斥。
当多个任务需要访问共享资源时,信号量可以确保资源的正确访问。
最后,信号量获取是任务获取信号量的过程,通过该过程,任务可以访问共享资源。
第二部分:xSemaphoreTake函数的用法现在,我们可以开始介绍xSemaphoreTake函数了。
该函数用于获取信号量,即在任务需要访问共享资源时,通过调用该函数获取信号量。
其函数原型如下:BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait);xSemaphore是一个信号量句柄,用于标识需要获取的信号量。
xTicksToWait是一个等待时间,用于指定任务在获取信号量前的等待时间,如果等待时间为0,则任务将立即返回。
、优先级反转1、什么是优先级反转?优先级反转是指一个低优先级的任务持有一个被高优先级任务所需要的共享资源。
高优先任务由于因资源缺乏而处于受阻状态,一直等到低优先级任务释放资源为止。
而低优先级获得的CPU时间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级的任务反而超过这两个任务而获得CPU时间。
如果高优先级等待资源时不是阻塞等待,而是忙循环,则可能永远无法获得资源,因为此时低优先级进程无法与高优先级进程争夺CPU时间,从而无法执行,进而无法释放资源,造成的后果就是高优先级任务无法获得资源而继续推进。
2、解决方案:(1)设置优先级上限,给临界区一个高优先级,进入临界区的进程都将获得这个高优先级,如果其他试图进入临界区的进程的优先级都低于这个高优先级,那么优先级反转就不会发生。
(2)优先级继承,当一个高优先级进程等待一个低优先级进程持有的资源时,低优先级进程将暂时获得高优先级进程的优先级别,在释放共享资源后,低优先级进程回到原来的优先级别。
嵌入式系统VxWorks就是采用这种策略。
这里还有一个八卦,1997年的美国的火星探测器(使用的就是vxworks)就遇到一个优先级反转问题引起的故障。
简单说下,火星探测器有一个信息总线,有一个高优先级的总线任务负责总线数据的存取,访问总线都需要通过一个互斥锁(共享资源出现了);还有一个低优先级的,运行不是很频繁的气象搜集任务,它需要对总线写数据,也就同样需要访问互斥锁;最后还有一个中优先级的通信任务,它的运行时间比较长。
平常这个系统运行毫无问题,但是有一天,在气象任务获得互斥锁往总线写数据的时候,一个中断发生导致通信任务被调度就绪,通信任务抢占了低优先级的气象任务,而无巧不成书的是,此时高优先级的总线任务正在等待气象任务写完数据归还互斥锁,但是由于通信任务抢占了CPU并且运行时间比较长,导致气象任务得不到CPU时间也无法释放互斥锁,本来是高优先级的总线任务也无法执行,总线任务无法及时执行的后果被探路者认为是一个严重错误,最后就是整个系统被重启。
优先级反转+解决方案1. 优先级反转(Priority Inversion)由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。
这就是所谓的优先级反转(Priority Inversion)。
2. 产生原因其实,优先级反转是在高优级(假设为A)的任务要访问一个被低优先级任务(假设为C)占有的资源时,被阻塞.而此时又有优先级高于占有资源的任务(C)而低于被阻塞的任务(A)的优先级的任务(假设为B)时,于是,占有资源的任务就被挂起(占有的资源仍为它占有),因为占有资源的任务优先级很低,所以,它可能一直被另外的任务挂起.而它占有的资源也就一直不能释放,这样,引起任务A一直没办法执行.而比它优先低的任务却可以执行.所以,一个解决办法就是提高占有资源任务的优先级,让它正常执行,然后释放资源,以让任务A能正常获取资源而得以执行.3. 解决方案( 优先级继承/ 优先级天花板)目前解决优先级反转有许多种方法。
其中普遍使用的有2种方法:一种被称作优先级继承(priority inheritance);另一种被称作优先级极限(priority ceilings)。
A. 优先级继承(priority inheritance)优先级继承是指将低优先级任务的优先级提升到等待它所占有的资源的最高优先级任务的优先级.当高优先级任务由于等待资源而被阻塞时,此时资源的拥有者的优先级将会自动被提升.B. 优先级天花板(priority ceilings)优先级天花板是指将申请某资源的任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级.(这个优先级称为该资源的优先级天花板)A 和B的区别:优先级继承,只有当占有资源的低优先级的任务被阻塞时,才会提高占有资源任务的优先级,而优先级天花板,不论是否发生阻塞,都提升.。
1.什么是堆栈?堆栈(Stack)是一种线性数据结构,具有后进先出(LIFO, Last In First Out)的特点。
这意味着,最后添加到堆栈中的元素,将是第一个被移除的元素。
堆栈通常使用数组或链表来实现。
在堆栈中,只有一端(称为栈顶)可以进行插入或删除操作。
堆栈只定义了两种基本操作:入栈(Push)和出栈(Pop)。
堆栈的应用非常广泛,它可以用于计算机科学、工程学和其他领域中的各种问题。
例如,堆栈可以用于计算表达式的值,存储程序调用时的参数和返回地址,以及维护浏览器的历史记录等。
2.堆栈的基本操作堆栈的基本操作包括入栈(Push)和出栈(Pop)。
入栈操作(Push):将一个元素添加到堆栈的栈顶。
出栈操作(Pop):移除堆栈的栈顶元素,并返回该元素的值。
堆栈还可以定义其他操作,例如查看栈顶元素(Peek)、判断堆栈是否为空(IsEmpty)、清空堆栈(Clear)等。
下面是一个简单的堆栈类的示例,它实现了上述基本操作:class Stack:def__init__(self):self.items = []def is_empty(self):return self.items == []def push(self, item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[-1]def size(self):return len(self.items)3.为什么堆栈适合解决处理顺序与输入顺序相反的问题?堆栈的后进先出(LIFO)的特点使它特别适合解决处理顺序与输入顺序相反的问题。
例如,在计算机科学中,堆栈常常被用来解决表达式求值的问题。
表达式求值是指计算给定的算术表达式的值。
在计算表达式的值时,我们需要考虑运算符的优先级。
例如,在计算“1 + 2 * 3” 的值时,我们应该先乘法(),再加法(+),因为乘法()的优先级比加法(+)高。
引言概述计算机操作系统中的PV操作是进程同步和互斥的重要手段,用于解决多个进程共享资源时可能引发的竞争条件和死锁问题。
PV操作是通过对进程间的信号量进行操作来实现的。
本文将详细介绍PV 操作的定义、原理和应用场景,并通过分析五个大点来深入探讨PV 操作的实现和特性。
正文内容一、PV操作的定义和原理1.PV操作简介:PV操作是一种用于进程间同步和互斥的机制,主要包括两个操作——P操作(等待)和V操作(发出信号)。
2.P操作原理:进程执行P操作时,会判断信号量的值是否大于0,若大于0则将其减一;若等于0则进程被阻塞,等待信号量的值大于0。
3.V操作原理:进程执行V操作时,会将信号量的值加一;如果有阻塞的进程,会唤醒其中一个进程。
4.PV操作的互斥性:PV操作可以实现进程对共享资源的互斥保护,即只允许一个进程访问资源。
5.PV操作的同步性:PV操作可以实现进程之间的同步,即某个进程需要等待其他进程执行完相应操作后再进行操作。
二、PV操作的应用场景1.生产者消费者问题:通过使用信号量来解决生产者和消费者之间的同步和互斥问题,确保生产者和消费者能够正确地访问共享缓冲区。
2.读者写者问题:通过使用信号量来解决多个读者和一个写者之间的同步和互斥问题,确保读者和写者能够正确地访问共享资源。
3.互斥访问共享资源:通过使用信号量来保证多个进程对共享资源的互斥访问,防止竞争条件的发生。
4.进程间的消息传递:通过使用信号量来实现进程间的同步和消息传递,确保消息的正确发送和接收。
5.进程的顺序执行:通过使用信号量来控制进程的执行顺序,确保某些进程按照特定的顺序执行。
三、PV操作的实现方式1.信号量的定义和初始化:在操作系统中,信号量是由一个整数值和一个相关的进程等待队列组成。
需要在创建信号量时对其进行初始化。
2.P操作的实现:P操作需要对信号量的值进行判断,若大于0则执行减一操作;若等于0则将进程加入等待队列,进入阻塞状态。
优先级反转分析
一.优先级反转
优先级反转(Priority Inversion),是由于多任务共享资源,具有最高优先级的任务被低优先级任务祖册,反而使得具有中优先级的任务先于高优先级的任务执行,影响系统的实时性,甚至导致系统崩溃。
具体说明如下:
假设系统中有Task1、Task2、Task3三个任务,分别对应高、中、低三个优先级(如图1所示)。
某一时刻系统的状态如下:
T1:Task1和Task2正在等待某一事件的发生,处于挂起状态,Task3正在执行。
T2:Task1等待的事件发生,Task1剥夺Task3的CPU使用权开始执行,Task3被阻塞。
T3:Task1执行到某一时刻,需要申请Task3使用且还未释放的资源。
则Task1挂起,Task3 开始执行。
T4:Task3执行过程中,Task2进入就绪态,剥夺Task3的CPU使用权开始执行。
T5:Task2执行完,Task3开始执行
T6:Task3执行完,释放资源,Task1开始执行。
从上述过程中,可以看出Task1必须等待Task3执行完毕,释放资源之后才能得到该资源的使用权继续执行。
这种情况下,Task1的优先级实际降到了Task3的优先级水平。
在此过程中,处于中间优先级的Task2剥夺了Task3的CPU使用权,使Task1的状况恶化,即Task2使得Task1增加了额外的时间延迟,也就是Task1和Task2的优先级发生了反转。
在更坏的情况下,如Task1和Task3之间有多个这样的“Task2”存在,这样的优先级反转问题可能会导致整个系统的崩溃。
一些RTOS使用”优先级继承“解决这个问题:即在低优先级进程持有信号量,并且高优先级进程在等待该信号量时,将低优先级进程提高到与高优先级进程相同。
二.常见解决方案
优先级继承和优先级天花板:
如果任务之间由于有共享资源出现了竞争或者死锁,是会严重影响系统安全的。
因此uC/OS对共享资源提供了保护机制。
一般情况下使用的是信号量方法。
创建一个信号量并对他进行初始化,当一个任务需要使用一个共享资源时,他必须先申请得到这个信号量。
在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到信号量,也不能使用该资源。
在uC/OS中称为优先级反转。
简单地说,就是高优先级任务必须等待低优先级任务的完成。
优先级天花板策略(Priority ceilings): 优先级天花板是指将申请(占有)某资源的任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级.(这个优先级称为该资源的优先级天花板) 。
在上述例子中体现为当低优先级任务申请占有某资源时就将这个低优先级任务的优先级升为能访问该资源的所有任务中最高优先级任务的优先级
优先级继承策略对任务执行流程的影响相对较小,因为只有当高优先级任务申请已被低优先级任务占有的临界资源这一事实发生时,才抬升低优先级任务的优先级。
而天花板策略是谁占有就直接升到最高。