如何防止时序相关的 C 进程进行上下文切换

如何防止时序相关的 C 进程进行上下文切换

我们有一个进程负责按照时间间隔轮询硬件。我们希望将一个 CPU 核心专门用于此过程。例如,我们希望这个进程始终保持可运行。

我们解决这个问题的第一次尝试如下:

# Set process to highest priority
nice -n -20 cmd

# Set thread affinity in C for our hardware sampling thread
pthread_setaffinity_np(...)

上述两个步骤都按预期工作。我们的线程停留在core3我们设置的位置,并且nice位于-20顶部。

当重新运行ftrace根据本次讨论这个问题,我们通常会看到以下内容:

> cat trace | grep " 3)" | grep " => "
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 

rhd_loc-2735是我们的流程。

除了上面显示的内容之外,我们还看到许多kworker-2703切换到核心的情况,有时其他较低优先级的进程也交换到核心。

我们认为上下文切换的原因是我们的进程与SPI等待的(串行外设接口)进行通信IRQs,并且SPI运行时钟速率比 CPU 核心慢一个数量级。因此,我们的进程花费大量时间等待 SPI/IRQ,例如,它不处于状态Runnable。无论优先级或关联性如何,内核都可以自由地将其他进程分配给内核。

这会导致我们的硬件采样率变得更加可变且低于应有的水平,因为我们的 CPU 内核并不总是立即准备好处理下一个值SPI,然后提交新的采样请求。

问题:

我们是否可以 1) 强制所有其他进程远离核心,以便我们的进程可以立即响应中断请求,或者 2) 保持主线程可运行,以便它始终可用于处理下一个请求?

相关内容