我们有3个以不同优先级运行的任务:A(120),B(110),C(100)。 A采用带有Inversion Safe标志的互斥量信号量。 任务B执行semTake,这会导致任务A的优先级提升到110。 之后,任务C执行semTake。任务A的优先级现在是100。
此时,A释放信号量,C抓取它。 我们注意到A的优先级没有回到原来的优先级120。 不应该立即恢复A的优先权吗?
答案 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的优先级不会重新计算 直到它放弃信号量。