我们有3个以不同优先级运行的任务:A(120),B(110),C(100).A采用带有Inversion Safe标志的互斥量信号量.任务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版本.
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的优先级.