VxWorks如何处理优先级继承?

时间:2008-09-20 13:05:57

标签: semaphore vxworks

我们有3个以不同优先级运行的任务:A(120),B(110),C(100)。 A采用带有Inversion Safe标志的互斥量信号量。 任务B执行semTake,这会导致任务A的优先级提升到110。 之后,任务C执行semTake。任务A的优先级现在是100。

此时,A释放信号量,C抓取它。 我们注意到A的优先级没有回到原来的优先级120。 不应该立即恢复A的优先权吗?

1 个答案:

答案 0 :(得分:5)

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

任务A(100升至80)有两个互斥(X& Y) 任务B(pri 90)和任务C(pri 80)分别待定 对于。当任务A将互斥体Y放弃到任务C时,我们可能会期望它 优先级将降至90.当它最终放弃互斥X到任务B时, 我们希望它的优先级可以回落到100。

优先级继承在VxWorks中不起作用。
它的工作原理取决于您使用的VxWorks版本。

pre-VxWorks 6.0

优先级保持“提升”,直到具有该优先级的任务 锁定互斥量信号量会放弃其最后反转安全互斥锁 信号。

使用上面的示例,当任务A放弃互斥锁Y时 对于任务C,它的优先级保持在80.在它放弃互斥锁X之后 任务B,然后它的优先级将回落到100(跳过90)。

让曲线球#1投入混音。如果任务A锁定了互斥锁,该怎么办? Z虽然这一切都在进行,但没人在等待Z?在那里面 情况下,优先级将保持在80,直到Z被放弃 - 然后 它会回落到100。

为什么这样呢?
这很简单,对大多数情况来说,这很好 足够。然而,它确实意味着当“曲线球#1”进入时 比赛时,优先级会比较长时间保持较高的优势 是必要的。

VxWorks 6.0 +

现在的优先级 保持升高,直到锁定互斥锁的任务 信号量放弃了它的最后一个反转安全互斥量 提高优先级

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