web-dev-qa-db-ja.com

ロックフリーIPC

ロックフリーのアプリケーションを書く方法を探していますIPC Linux、C、マルチコアプロセッサ)。

FIFOまたは共有メモリに書き込むプロセス1およびプロセス2があるとします。次に、プロセス3およびプロセス4がその共有メモリまたはFIFOから読み取ります。

これはロックフリーアルゴリズムで可能ですか?

ご指導をよろしくお願いいたします。

9
poly

私は、リングバッファーの使用への言及を見て、ロックの必要性を排除または削減するためにロケーションポインターへのアクセスを制御しました。ただし、待機の必要性がなくなるわけではなく、機能するのは、リングバッファーに1つのライターと1つのリーダーがある場合のみです。あなたのケースでは、少なくとも2つのバッファが必要になります。

私が理解しているメカニズムは次のとおりです。

  • ライターは、空きスロットができるまで待機します(最後+ 1!=現在)
  • ライターはエントリをリングバッファに書き込みます。
  • ライターは最後のエントリポインタを更新します。

  • リーダーは、リングバッファーに使用可能なエントリがあるまで待機します(最後の!=現在)。

  • リーダーがエントリを処理します。
  • リーダーは現在のポインタをインクリメントします。

使用される待機時間に応じて、これは空のキュー内の新しいアイテムのレイテンシを追加するか、待機ループで多くのCPUサイクルを消費する可能性があります。これを機能させるには、ポインタの更新順序と書き込みアクセスの厳密な分離が重要です。ライターは、ポインターをインクリメントしてリーダーで使用できるようにする前に、リングバッファーエントリの書き込みのみを許可されます。

2
BillThor

はい、可能です。プロジェクトでは、ロックフリーキューのアルゴリズムの1つを使用します。しかし、これらのアルゴリズムは本当に明白ではありません。それらを深く理解したい場合は、数か月を費やす準備ができているはずです。

1
Dmitry Poroh

Inter process通信をロックフリーにすることはできません。インタースレッドのみ。私の知る限りでは。

0
DeadMG