我的线程可以帮助操作系统决定何时将其切换出来吗?

Wil*_*mKF 10 c++ linux pthreads context-switch

我正在使用C++中的Linux上的线程应用程序,它试图实时,在心跳上执行操作,或尽可能接近它.

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

有没有办法我的线程可以提示操作系统,现在是上下文切换它的好时机?我可以在做心跳之后立即进行此呼叫,从而最大限度地减少由于定时上下文切换导致的延迟.

Cub*_*bbi 6

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

如果您认真考虑在Linux中"尝试实时"的目标,那么首先,您应该使用实时sched_setscheduler设置(SCHED_FIFO或SCHED_RR,首选FIFO).第二,获取Linux的完整抢占补丁(如果您的发行版没有提供,则来自kernel.org.它还将使您能够重新安排设备驱动程序线程并执行比线程更高的线程,比如硬盘或以太网驱动程序线程第三,有关如何设计和设置实时应用程序的更多提示,请参阅RTWiki和其他资源.

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