我正在 Linux 上用 C++ 开发一个线程应用程序,它试图实现实时,根据心跳执行操作,或者尽可能接近实时。
在实践中,我发现操作系统正在交换我的线程,并导致切换时延迟长达十分之一秒,从而导致心跳不规则。
有没有一种方法可以让我的线程向操作系统暗示现在是上下文切换的好时机?我可以在进行心跳后立即进行此调用,从而最大限度地减少由于不合时宜的上下文切换而导致的延迟。
很难说你的情况的主要问题是什么,但它肯定不是可以通过调用来纠正的问题sched_yield()
or pthread_yield()
。在 Linux 中,yield 的唯一明确定义的用途是允许不同的就绪线程在 SCHED_FIFO 调度策略下,在同一 CPU 上以相同优先级抢占当前 CPU 绑定的正在运行的线程。几乎在所有情况下这都是一个糟糕的设计决策。
如果您认真对待 Linux 中“尝试实时”的目标,那么首先,您应该使用实时sched_setscheduler
设置(SCHED_FIFO 或 SCHED_RR,优先使用 FIFO)。
其次,获取 Linux 的完整抢占补丁(来自内核.org http://www.kernel.org/pub/linux/kernel/projects/rt/如果您的发行版不提供这一功能。它还使您能够重新安排设备驱动程序线程并执行高于硬盘或以太网驱动程序线程的线程。
三、看RTWiki https://rt.wiki.kernel.org/index.php/Main_Page以及其他资源,了解有关如何设计和设置实时应用程序的更多提示。
这应该足以让你的年龄低于 10 岁micro秒响应时间,无论任何像样的桌面系统上的系统负载如何。我有一个嵌入式系统,我只挤出 60 us 响应空闲时间和 150 us 在重磁盘/系统负载下的响应时间,但它仍然比您所描述的快几个数量级。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)