当前位置:  开发笔记 > 程序员 > 正文

VxWorks如何处理优先级继承?

如何解决《VxWorks如何处理优先级继承?》经验,为你挑选了1个好方法。

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

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



1> Benoit..:

理想情况下,当继承的优先级降低时,它将以逐步的方式完成.由于删除了导致优先级提升的每个依赖关系,因此继承的优先级应下降到最高剩余依赖关系的优先级.
例如:

任务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的优先级.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有