マルチコアプロセッサ向けのLinuxにおけるロックフリーIPC


9

マルチコアプロセッサを搭載したCで、Linux上のロックフリーIPCを使用してアプリケーションを作成する方法を見つけようとしています。

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

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

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


ロックフリー通信に関するいくつかの指示またはいくつかの外部ドキュメントへの参照を提供できますか?この用語の正確な意味は何ですか?
ジョルジョ


私が正しく理解している場合、問題は同時書き込み(1、2)と同時読み取り(3、4)です。ライターとリーダー間の同期は、リンク先のページで説明されているアルゴリズムですでにカバーされています。
ジョルジョ

回答:


2

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

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

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

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

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

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


そして、これもウィキペディアで見つけました、面白いようです、concurrencykit.orgで
poly

1

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


0

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


「ロックフリー」は、ユーザーではなくメカニズムの属性だと思います。共有メモリなどをミックスに追加すると、スレッドとプロセスの違いはかなり薄くなります。
tylerl 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.