在一台 GNU/Linux 机器上,如果想要执行“实时”(亚毫秒级时间关键)任务,您几乎总是必须经历漫长、复杂且容易出现问题的内核补丁过程,以提供足够的支持[1] http://en.wikipedia.org/wiki/RTLinux#Background [2] http://en.wikipedia.org/wiki/Xenomai.
最大的问题是,许多实时任务最有用的系统甚至不具备允许这些补丁工作的基本硬件要求,即高分辨率定时器外设。或者,如果这样做,它是特定于硬件的,因此需要根据具体情况在补丁中专门实现。即使 CPU/指令时钟速率足够快以提供所需的时间粒度,情况也是如此。
所以,我的问题是,最好的是什么第二个地方尽可能接近上述实时目标的方法/技巧?人们可以简单地在应用程序源代码中完成的事情,无需深入了解底层硬件或太多“内核黑客”。
提升进程优先级、为“关键”任务启动一个额外的线程以及(在 C 中)使用 nanosleep() 的变体是迄今为止我想出的最好的答案/技巧。我希望能找到更多。
The sched_setscheduler(2) http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html和朋友允许你使用两种不同的软实时调度器,SCHED_FIFO
and SCHED_RR
。在这些调度程序下运行的进程的优先级高于常规进程。因此,只要您只有其中几个进程,并控制它们之间的优先级,您实际上可以获得相当不错的实时响应。
之间的区别SCHED_FIFO
and SCHED_RR
is:
-
对于“实时”调度程序,最多有 100 个不同的优先级(POSIX 仅需要 32 个不同的级别,因此应该使用sched_get_priority_min(2) http://man7.org/linux/man-pages/man2/sched_get_priority_min.2.html and sched_get_priority_max(2) http://man7.org/linux/man-pages/man2/sched_get_priority_max.2.html得到实际的数字。调度程序通过抢占优先级较低的进程和线程来工作。区别在于它们如何处理具有相同优先级的任务。
-
SCHED_FIFO
是先进先出调度程序(因此得名)。这意味着首先进入运行队列的任务将被允许运行,直到完成、自愿放弃其在运行队列上的空间或被更高优先级的任务抢占。
-
SCHED_RR
是一个循环调度程序。这意味着具有相同优先级的任务只允许运行一定的时间段。如果在该时间片用完时该任务仍在运行,则该任务将被抢占,并且运行队列中的下一个任务(具有相同优先级)将被允许运行直至其时间片。与SCHED_FIFO
,较高优先级任务会抢占较低优先级任务,但是,当被较高优先级任务抢占的任务被允许再次运行时,则仅允许其运行其量程中剩余的时间。请参阅中的注释部分sched_rr_get_interval(2) http://man7.org/linux/man-pages/man2/sched_rr_get_interval.2.html了解如何设置任务的时间量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)