10

我正在使用 C++ 在 Linux 上开发一个线程应用程序,它试图实时,对心跳进行操作,或者尽可能接近它。

在实践中,我发现操作系统正在交换我的线程,并在它被切换时导致高达十分之一秒的延迟,从而导致心跳不规则。

有没有办法我的线程可以提示操作系统现在是上下文切换它的好时机?我可以在执行心跳后立即进行此调用,从而最大限度地减少由于不合时宜的上下文切换造成的延迟。

4

6 回答 6

6

很难说你的主要问题是什么,但它肯定不是可以通过调用sched_yield()or来纠正的pthread_yield()。在 Linux 中,yield 唯一明确定义的用途是允许不同的就绪线程在 SCHED_FIFO 调度策略下以相同的优先级抢占同一 CPU 上当前受 CPU 限制的运行线程。在几乎所有情况下,这都是一个糟糕的设计决策。

如果您认真对待在 Linux 中“尝试实时”的目标,那么首先,您应该使用实时sched_setscheduler设置(SCHED_FIFO 或 SCHED_RR,首选 FIFO)。其次,获取 Linux 的完整抢占补丁(如果您的发行版不提供,请从kernel.org获取。它还使您能够重新调度设备驱动程序线程并执行高于硬盘或以太网驱动程序线程的线程. 第三,有关如何设计和设置实时应用程序的更多提示,请参阅RTWiki和其他资源。

无论任何体面的桌面系统上的系统负载如何,这应该足以让您的响应时间低于 10微秒。我有一个嵌入式系统,我只挤出 60 us 响应空闲和 150 us 在沉重的磁盘/系统负载下,但它仍然比你描述的快几个数量级。

于 2010-05-27T05:11:59.877 回答
3

您可以使用各种命令(例如yield )告诉当前正在执行的线程暂停执行。

只是告诉线程暂停是不确定的,999 次它可能会提供良好的间隔,而 1 次则不能。

您可能需要查看实时调度以获得一致的结果。这个站点http://www2.net.in.tum.de/~gregor/docs/pthread-scheduling.html似乎是研究线程调度的一个很好的起点。

于 2010-05-27T04:31:30.973 回答
1

采用sched_yield

和毛线有一个 pthread_yield http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_yield.3.html

于 2010-05-27T04:19:51.953 回答
1

我对这个问题有点困惑。如果您的程序只是在等待周期性的心跳然后做一些工作,那么当您返回等待心跳时,操作系统应该知道安排其他事情。

你不是为了让你的“心跳”而在旗帜上旋转,是吗?

于 2010-05-27T04:47:16.467 回答
1

正在使用计时器功能,例如setitimer(),对吗?对???

如果没有,那么你做错了。

您可能需要指定一个比您真正需要的时间稍短的计时器间隔。如果您使用实时调度程序优先级和计时器,您的进程几乎总是会按时唤醒。

我想说总是准时,但 Linux 还不是一个完美的实时操作系统。

于 2010-06-01T19:24:09.200 回答
0

我对 Linux 不太确定,但在 Windows 上,有人解释说你不能要求系统打断你有几个原因(主要是第一段)。在我看来,原因之一是硬件中断可能随时发生,并且您无法控制。

编辑有人只是建议使用sched_yield然后删除他的答案。不过,它会为您的整个过程腾出时间。你也可以sched_setscheduler用来提示内核你需要什么。

于 2010-05-27T04:05:22.283 回答