マルチコアプロセッサを搭載したCで、Linux上のロックフリーIPCを使用してアプリケーションを作成する方法を見つけようとしています。
FIFOまたは共有メモリに書き込むプロセス1とプロセス2があるとします。次に、プロセス3とプロセス4がその共有メモリまたはFIFOから読み取ります。
これはロックフリーアルゴリズムで可能ですか?
ご指導をよろしくお願いいたします。
マルチコアプロセッサを搭載したCで、Linux上のロックフリーIPCを使用してアプリケーションを作成する方法を見つけようとしています。
FIFOまたは共有メモリに書き込むプロセス1とプロセス2があるとします。次に、プロセス3とプロセス4がその共有メモリまたはFIFOから読み取ります。
これはロックフリーアルゴリズムで可能ですか?
ご指導をよろしくお願いいたします。
回答:
リングバッファーの使用への言及を見て、ロックの必要性をなくすか減らすためにロケーションポインターへのアクセスを制御しました。ただし、待機の必要性がなくなるわけではなく、機能するのはリングバッファーに1つのライターと1つのリーダーがある場合のみです。あなたのケースでは、少なくとも2つのバッファが必要になります。
私が理解しているメカニズムは次のとおりです。
ライタは最後のエントリポインタを更新します。
リーダーは、リングバッファーに利用可能なエントリがあるまで待機します(最後の!=現在)。
使用される待機時間に応じて、これは空のキュー内の新しいアイテムのレイテンシを追加するか、待機ループで多くのCPUサイクルを消費する可能性があります。これを機能させるには、ポインタの更新順序と書き込みアクセスの厳密な分離が重要です。ライターは、ポインターをインクリメントしてリーダーで使用できるようにする前に、リングバッファーエントリの書き込みのみを許可されます。
インタープロセス通信はロックフリーにすることはできません。インタースレッドのみ。私の知る限りでは。