优先级反转描述:
有3个任务,其优先级由高到低为A > B > C;其中A、C中都有对紧缺资源S的访问;由信号量控制,互斥访问紧缺资源。
场景如下:A、B挂起等待相应事件的发生;C运行,使用资源S,锁信号量;A等待事件发生,转为就绪状态,由于优先级高于C,转运行状态;当A使用资源S时,由于其正在被C使用,所有A挂起,C开始运行;B等待事件发生,转为就绪状态,由于优先级高于C,转运行状态;B运行完毕,C开始运行;C释放资源S后,A才开始运行。
从以上可以看出,优先级低的任务B先于优先级高的任务A运行,也即高优先级的任务被较低优先级的任务诸塞,优先级发生了反转,实时性难以得到保证。
-------
解决方案:
a)优先级天花板
描述:当任务C使用资源S时,将任务C的优先级提高到能访问资源S的最高优先级,即将C的优先级提高到资源S的优先级天花板。
优点:简单、易行
缺点:每次使用紧缺资源都需要改变其优先级,然后还要改回来,这无形中浪费了很多CPU时间
b)优先级继承
描述:任务C访问资源S,此时任务A也访问资源S,发现有人已经在使用资源S,则比较两者的优先级,发现A的优先级更高,则让C继承A的优先级,即将C的优先级提高到A的相同级别,如此类推,在C释放资源后,需要把其优先级改回来。
优点:可以根据实际情况改变优先级,不会浪费太多的CPU时间
缺点:有判断,过程较复杂,而且操作系统需要支持相同优先级(硬伤)
c)优先级天花板的改进
描述:任务C访问资源S,此时任务A也访问资源S,发现有人已经在使用资源S,则比较两者的优先级,发现A的优先级更高,则提升C的优先级至天花板,在C释放资源后,需要把其优先级改回来。
-------------
思考:
b)与c)的区别:打击范围不同,b打击范围小,c打击范围大
参考:《uC/OS优先级反转及解决》 http://blog.csdn.net/sunnybeike/article/details/6965210