1

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

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

4

1 回答 1

5

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

任务 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 上挂起怎么办?在这种情况下,优先级将保持在 80,直到 Z 被放弃——然后它会回落到 100。

为什么要这样做?
这很简单,在大多数情况下,它已经足够好了。然而,这确实意味着当“曲线球#1”开始发挥作用时,优先级将在更长的时间内保持较高而不是必要的。

VxWorks 6.0+

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

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

于 2008-09-20T13:17:19.360 回答