任务优先级反转

(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 优先级天花板

     优先级天花板是指将申请(占有)某资源的任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级.(这个优先级称为该资源的优先级天花板)  
             对象:任意申请资源的任务都提高其优先级到最高,保证其最快得到执行
             缺点:切换优先级花费时间,有时不必要

             改进:仅在有多任务竞争资源时,改变申请或占用资源的任务优先级

2.3 两者的区别

     优先级继承:只有一个任务访问资源时一切照旧,没有区别,只有当高优先级任务因为资源被低优先级占有而被阻塞时,才会提高占有资源任务的优先级;而优先级天花板,不论是否发生阻塞,都提升,即谁先拿到资源,就将这个任务提升到该资源的天花板优先级。

ucos中可以利用互斥型信号量解决上述问题。互斥型信号量创建函数申请一个比使用某共享资源的所有进程中比最高优先级更高的优先级作为预留。当某个进程调用pend函数申请使用该共享资源,同时该资源已经被占用时,pend函数会判断是否需要提升占用该资源进程的优先级,以使其尽快释放所占用的资源,从而防止优先级反转的发生 。

猜你喜欢

转载自blog.csdn.net/he1234555/article/details/103413513