VxWorks如何处理优先级继承?

时间:2020-03-06 14:29:01  来源:igfitidea点击:

我们有3个任务以不同的优先级运行:A(120),B(110),C(100)。
A使用带有"反转安全"标志的互斥信号量。
任务B执行semTake,这导致任务A的优先级提高到110.
稍后,任务C执行semTake。现在,任务A的优先级为100。

此时,A释放信号量,C抓住它。
我们注意到,A的优先级并没有降低到其最初的优先级120。
难道不应该立即恢复A的优先级吗?

解决方案

理想情况下,当继承的优先级为
降低,它将以逐步的方式完成。作为每个
删除了导致优先级升高的依赖项,
继承的优先级应降至
最高的剩余依赖关系。
例如:

任务A(从100扩展到80)有两个互斥体(X和Y)
任务B(pri 90)和任务C(pri 80)分别处于待处理状态
为了。当任务A将互斥量Y放弃给任务C时,我们可能期望它
优先级将降至90。当它最终放弃互斥体X交给任务B时,
我们希望其优先级降到100。

优先级继承在VxWorks中不起作用。
它的工作方式取决于我们使用的VxWorks的版本。

VxWorks 6.0之前的版本

优先级保持"提高",直到具有
锁定互斥量信号量会放弃其最后一次反转安全互斥量
信号。

使用上面的示例,当任务A放弃互斥锁Y时
任务C的优先级仍为80。在放弃互斥量X后,
任务B,则其优先级将降为100(跳过90)。

让我们将曲线球1混入。如果任务A锁定了互斥锁该怎么办
尽管Z正在进行所有操作,但是没有人正在Z上挂起吗?在那里面
在这种情况下,在放弃Z之前,优先级将一直保持为80,然后
它将回落到100。

为什么要这样呢?
很简单,在大多数情况下,这很好
足够的。但是,这确实意味着当"曲线球#1"出现时
播放时,优先级将保持更长的时间比
是必要的。

VxWorks 6.0以上

现在的优先级
保持提升状态,直到互斥锁已锁定的任务为止
信号量放弃了最后一个反转安全互斥量,该互斥量有助于
提高优先级。

这项改进避免了以下问题
"曲线球#1"。它确实有其自身的局限性。例如,如果
等待任务A放弃时,任务B和/或者任务C超时
信号量,不会重新计算任务A的优先级
直到它放弃信号量为止。