タイミング関連Cプロセスのコンテキスト切り替えを防止する方法

タイミング関連Cプロセスのコンテキスト切り替えを防止する方法

私たちは定期的にハードウェアをポーリングするプロセスを持っています。このプロセスには1つの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シリアルペリフェラルインタフェース(Serial Peripheral Interface)と通信し、IRQsCPUSPIコアよりはるかに遅いクロック速度で実行されるためだと思います。したがって、私たちのプロセスはSPI / IRQを待つのに多くの時間を費やします。たとえば、状態ではありませんRunnable。カーネルは、優先順位や好みに関係なく、他のプロセスをカーネルに自由に割り当てることができます。

SPIこれにより、CPUコアは常に次の値を処理した後に新しいサンプル要求を送信する準備ができていないため、ハードウェアのサンプリングレートは元のものよりも可変で低くなります。

質問:

1) プロセスが割り込み要求にすぐに応答できるように、他のすべてのプロセスをコアから強制的に分離できますか?それとも2)メインスレッドを実行可能に保つことで、常に次の要求を処理できますか?

ベストアンサー1

おすすめ記事