我是靠谱客的博主 健壮店员,最近开发中收集的这篇文章主要介绍优先级反转,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

任务调度有多种方法(算法)

1. 罗宾环调度算法:Round-robin scheduling algorithm

2. 基于优先级的调度算法:Priority-controlled scheduling algorithm

任务调度的一种常见调度算法就是:根据优先级高低去调度,优先让高优先级的任务去执行。

任务调度器,总是去激活某个(在所有任务中优先级是最高的),且处于就绪状态的任务,让其去执行。

任务有多种状态:就绪,挂起,等等

任何任务,都可能由于,需要某种资源,而该资源被别人(别的任务)占用,而无法继续运行下去,

此时就变成:挂起 (等待其所需要的资源被释放);然后才可以继续变成:就绪(等待下次调度时,就可以继续执行了)

问题:当某个最高优先级的任务A,由于其所需要的某个资源被某个低优先级的任务C占用了(还没使用完,还没释放),所以高优先级任务A就被阻塞了。
此高优先级的任务A,必须等到低优先级任务C,把其所占用的资源释放掉后,才能继续运行。

但是要等到低优先级任务C释放其所占用的资源的话,则很明显,必须要先让低优先级的任务C去执行,等低优先级任务C执行完毕后,才能去释放,高优先级任务A所希望得到的那个资源。
所以,任务调度就去调度,让低优先级任务C去执行了。

但是,此时,的问题就来了:
在高优先级任务A等待的这段时间内,某个中优先级的任务B,已经处于就绪状态了。
当高优先级的任务A,由于所需资源被占用而挂起,然后中优先级的任务B,由于比(本来打算去调度执行的)低优先级任务C的优先级高,所以被调度执行,然后B去一直执行,直到结束。一个具有中等优先级的任务(B),却比一个更高优先级的任务(A)先执行

本来应该是优先级最高的任务A先执行的,结果却变成了,比优先级最高的任务A,的优先级低一些,中等优先级任务B,先执行了。
好像是:高优先级任务A和中优先级任务B,两者之间的优先级调换了,反转了一样。


优先级反转有何危害?
对于:嵌入式实时操作系统,最最重要的指标就是:确保任务执行时间是可预测的,即涉及到最后期限deadline
要确保,任何时刻,执行某个任务,都不能超过某个时间,比如1ms(我随便举例的)
然后再来解释,优先级反转的危害:
由于优先级反转,造成任务调度时,时间的不确定性。
时间不确定,破坏了实时系统的实时性
严重时可能导致系统崩溃
由于本身基于优先级设计的任务,每个优先级不同的任务,往往对应着实际的现实中的执行的任务
其优先级反转,导致低优先级比高优先级先执行了
直接就导致任务错乱,逻辑错乱了。
如何解决或避免优先级反转?

优先级反转的解决办法:
1. priority inheritance 优先级继承:
对于,占了高优先级任务A的某种所需资源的,低优先任务级C,
当A被阻塞,要去调度,即使存在另一个中优先级任务B,则也可以实现:
由于此时低优先级任务C已有和A同样的优先级了,则调度器自然会去执行比中优先级任务B的优先级高的C了。然后,等C执行完毕后,就可以继续执行A了。
2. Priority Celling(最高优先级/优先级天花板)
3. 给临界区,即上述的mutex等公用资源的部分
凡是想要用到,临界区的资源的任务,
要进入临界区之前,都将临界区的优先级赋值给该任务,
使得该任务有了最高的优先级,可以不被打断,而始终继续运行,直到用到资源
这样,就避免了,被高优先级A发现某资源被低优先级的C占用之类的问题了

最后

以上就是健壮店员为你收集整理的优先级反转的全部内容,希望文章能够帮你解决优先级反转所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部