在Linux上,Ada任务优先级的语义是什么?

4

背景:我正在将一个Ada项目从Vxworks迁移到Linux平台。该项目在很大程度上依赖于使用Ada的动态任务优先级。

我做了几个实验,结果让我感到困惑。Ada任务优先级似乎对底层Linux优先级/良好性没有影响。即使将具有不同优先级的两个相同任务固定到一个CPU核上,它们完成所需的时间也是相等的。

问题:Ada任务在Linux上的语义是什么?为什么设置任务优先级没有效果?


3个回答

4
我对Linux不是很了解,但我记得如果你以root身份运行程序,你才能改变任务的优先级。可能还有其他条件;在Sparc Solaris上获得动态优先级是很复杂的。
GNAT参考手册的Specialized Needs Annexes部分可能声称附录D已经完全实现,而且代码确实存在。然而,在macOS上,有6个ACATS测试未通过附录D的测试。ACATS维护人员表示,在非专用操作系统上,附录D的测试可能无法通过(抱歉,找不到参考资料)。

3
我做了几个实验,让我感到困惑。Ada任务的优先级似乎对底层Linux的优先级/亲和力没有影响。即使将两个具有不同优先级的相同任务固定在一个CPU核心上,它们完成所需的时间也是相等的。
这并不像你想象的那样重要:任何高于后台进程的“一般噪音”优先级的进程都会吸收所需的计算量。此外,还需要考虑“任务在您的程序中的优先级是什么”,因为它本身就是具有自己优先级的进程。
问题:在Linux上,Ada任务的语义是什么?为什么设置任务优先级没有效果?
Ada的任务语义是可移植的,并且在Windows、裸机、Linux和VxWorks上应该完全相同。这也是Ada能够如此可移植的原因之一,以至于为其他系统开发的非平凡程序可以在极其不同的体系结构上运行(假设没有[低级]系统依赖)。
至于为什么您没有看到任何区别,可能是因为上述原因,再加上我们拥有快速的机器。

2
问题:在Linux上,Ada任务的语义是什么?为什么我设置任务优先级后没有看到任何效果?
第一个问题基本上已经被Shark8回答了。我想我会发布对第二个问题的答案。
回答:在Linux上使用Ada任务优先级需要使用Linux的“实时”调度算法。默认情况下通常是SCHED_OTHER。pragma Time_Slice (0.0)或pragma Task_Dispatching_Policy (FIFO_Within_Priorities)将调度算法设置为SCHED_FIFO。这需要以root身份运行应用程序。
注意:我曾尝试在运行中的进程上手动设置SCHED_FIFO,但没有成功。
详细信息:https://docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/platform_specific_information.html#index-10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接