私たちは定期的にハードウェアをポーリングするプロセスを持っています。このプロセスには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)と通信し、IRQs
CPUSPI
コアよりはるかに遅いクロック速度で実行されるためだと思います。したがって、私たちのプロセスはSPI / IRQを待つのに多くの時間を費やします。たとえば、状態ではありませんRunnable
。カーネルは、優先順位や好みに関係なく、他のプロセスをカーネルに自由に割り当てることができます。
SPI
これにより、CPUコアは常に次の値を処理した後に新しいサンプル要求を送信する準備ができていないため、ハードウェアのサンプリングレートは元のものよりも可変で低くなります。
質問:
1) プロセスが割り込み要求にすぐに応答できるように、他のすべてのプロセスをコアから強制的に分離できますか?それとも2)メインスレッドを実行可能に保つことで、常に次の要求を処理できますか?