在GNU/Linux机器上,如果一个人想要执行“实时”(亚毫秒时间关键)任务,那么您几乎总是要经历冗长、复杂和容易出现问题的修补内核的过程,以公开对[1] [2]的充分支持。
最大的问题是,许多实时任务最有用的系统甚至不具备允许这些补丁工作的基本硬件要求,即高分辨率的定时器外围设备。或者,如果是这样的话,它是特定于硬件的,因此需要根据具体情况在修补程序中具体实现。即使CPU/指令时钟速率快到足以给出所需的时间粒度,也是如此。
所以,我的问题是,什么是最好的第二名的方式/技巧,以尽可能接近上述实时目标?在应用程序源代码中可以简单地做一些事情,而不需要深入了解底层硬件,也不需要太多的“内核黑客”。
提升进程优先级,为“关键”任务启动一个额外的线程,以及(在C中)使用Nanos休眠()的变体,这些都是我到目前为止想出的最好的答案/技巧。我希望能找到更多。
发布于 2013-03-21 15:34:28
setscheduler调度器(2)和朋友允许您使用两种不同的软实时调度程序,SCHED_FIFO SCHED_RR。在这些调度程序下运行的进程的优先级高于常规进程。因此,只要你只有几个这些过程,并控制它们之间的优先级,你实际上可以得到相当下降的实时响应。
正如注释中所要求的那样,以下是SCHED_FIFO和SCHED_RR之间的区别:
使用“实时”调度程序,有多达100个不同的优先级(POSIX只需要32个不同的级别,因此应该使用最小(2)和最大(2)来获得实际的优先级。调度程序都是通过抢占进程和优先级较低的线程来工作的,区别在于它们如何处理具有相同优先级的任务。
SCHED_FIFO,是一个先入先出的调度程序(因此得名)。这意味着首先命中运行队列的任务允许运行,直到完成为止,自愿放弃运行队列上的空间,或者被更高优先级的任务抢占。
SCHED_RR,是一个循环调度程序。这意味着具有相同优先级的任务只允许在一定时间内运行。如果任务在这次量程耗尽时仍在运行,任务就会被抢占,并且运行队列中的下一个任务(具有相同的优先级)将被允许运行时间量程。与SCHED_FIFO一样,优先级较高的任务抢占了较低优先级的任务,然而,当被高优先级任务抢占的任务被允许再次运行时,则只允许运行其量程中剩下的时间。有关如何设置任务的时间量程,请参阅间隔(2)中的Noes部分。
发布于 2013-03-21 22:35:40
MRG
亚毫秒将很难保证在一个非RT内核。我知道近年来发生了很多非常好的工作(例如,大内核锁已经消失了),但这仍然不足以保证它。
你可以从CERN和Fermilab的友好原子干扰者那里获得一个看。可以安装MRG (请参阅我的链接),这为您提供了PREEMPT_RT修补程序的预打包设置。
或者,如果你有钱,你可以得到红帽MRG。这是一个完全受支持的Linux发行版,内置了抢占式RT补丁,这样就可以消除容易出现问题的内核补丁。
问题是,Redhat对它的收费很高(每个安装每年3000美元)。我想他们已经大跌眼镜了,因为他们最大的客户之一是高速交易投资者,他们仍然拥有大量的资产,因此不会注意到每年3000美元/箱的投资。
我和MRG相处得怎么样?
我在MRG方面做了相当多的工作(使用以上两种方法),而且相当不错。它将股票内核中的中断服务例程替换为线程来服务中断。这意味着您可以以高于IRQ线程的优先级运行您的软件!这是你必须做的事情,如果你想接近保证你的应用程序的亚毫秒延迟。
在我看来,MRG的事情似乎逐渐地进入了主线内核,这是一件好事。也许有一天它会成为主线。
其他Gotchas
现代CPU的热管理可能是一个真正的痛苦的颈部。当系统管理中断被服务时,我的系统锁定了0.3秒(通过BIOS,而不是操作系统),仅仅是因为CPU有点热了。见这。因此,您必须小心您的底层硬件所做的事情。一般来说,你必须开始担心放弃现代个人电脑的管理冷却,回到一直快速旋转的大风扇上。
发布于 2013-03-21 23:01:04
通过将“干扰”从其他进程移除到实时进程,您可以在Linux上取得很大进展。我在Windows中也玩了同样的游戏,这是一个更大的恐惧,但它显示了方向。所以一种检查清单:
与系统其他部分隔离,禁用所有共享:
man cpuset)。创建两个CPU集,一个用于正常进程,另一个用于实时进程。减少系统其余部分的活动:
使其稳定和可再生:
然后进行基准测试,使用压力测试,并在记录最大值的同时让机器开几天。延迟。
所以:祝好运:)
https://stackoverflow.com/questions/15505905
复制相似问题