低レイテンシのコード設計には、「実行するシステムに注意する」タイプのコーディングと展開が慎重に行われます。つまり、たとえば、標準のIPC メカニズム (SysV を使用してmsgsnd
/msgget
プロセス間でメッセージを渡す、またはpthread_cond_wait
/ pthread_cond_signal
PThreads 側で) と同様に、通常のロック プリミティブ (適応ミューテックス) はかなり遅いと見なされることを意味します ...何千もの CPU サイクルを必要とするもの、つまりコンテキスト スイッチが含まれます。
代わりに、ディスラプター パターンなどの「ホット-ホット」ハンドオフ メカニズムを使用します。プロデューサーとコンシューマーの両方がタイトなループでスピンし、単一または最悪の場合、次のアイテムの場所を示すアトミックに更新された少数のメモリ ロケーションを永続的にポーリングします。 -be-processed が見つかった、および/または処理された項目を完了としてマークします。すべてのプロデューサー/コンシューマーを個別の CPU コアにバインドして、コンテキスト スイッチが発生しないようにします。
このタイプのユースケースでは、個別のスレッドを使用する (そして、すべてのスレッドが同じアドレス空間を共有することによってメモリ共有を暗黙的に取得する) か、個別のプロセスを使用する (そして、データになるデータに共有メモリを使用することによって明示的にメモリを共有する)。 -processed と queue mgmt "metadata") の違いはほとんどありません。TLB とデータ キャッシュは "常にホット" であるためです (コンテキスト スイッチは決してありません)。
「プロセッサ」が不安定であったり、完了時間が保証されていない場合は、失敗したメッセージやタイムアウトしたメッセージを処理するために「リーパー」メカニズムを追加する必要がありますが、そのようなガベージ コレクション メカニズムは必然的にジッター (レイテンシ スパイク) をもたらします。これは、特定のスレッドまたはプロセスが終了したかどうかを判断するためにシステム コールが必要であり、システム コールのレイテンシが最良の場合でも数マイクロ秒であるためです。
私の見解では、あなたはここで油と水を混ぜようとしています。低レイテンシの展開で使用するために特別に作成されていないライブラリ コード/制御できないライブラリ コードを、ナノ秒のレイテンシでメッセージをディスパッチする要件と組み合わせて使用する必要があります。ターゲットをウェイクアップするためにシステムコールを実行する必要があり、それには時間がかかるため、nsec のレイテンシを与えるなどの方法はありません。pthread_cond_signal()
あなたの「ハンドラーコード」が「リッチ」環境に依存し、大量の「状態」がこれらとメインプログラムの間で共有されている場合...「蒸気駆動の飛行機を壊す必要がある」と言っているように聞こえますサウンドバリア」...