3

(Linuxまたは他のUNIXライクなシステムからの)共有メモリに使用する場合、マッピングへのアクセスを調整するために使用(または機能)mmap()することは可能(および移植可能)ですか?fcntl()flock()lockf()

このSOの質問への回答は、それが機能するはずであることを示唆しているようです。

私が念頭に置いているのは、共有メモリをプロセス/ページマップで構造化して、ロックの競合を最小限に抑えることです。プロセスはそれぞれのページで同時に動作する可能性があり、プロセス/ページのマッピングを更新するときにのみロックを取得する必要があります。(所有されていないページからの読み取りアクセスには、シリアル番号の確認、目的のデータのコピー、およびそのブロックのシリアル番号が変更されていないことの検証が含まれます)。

概念的には、このファイルマッピングを共有する各プロセスは、を実行しmmap()、その中の空きブロックを見つけ、プロセス/ページ領域へのロックを取得し、それを独自の割り当てで更新し、ロックを解放してから、楽しく作業を続けます。どのプロセスでも、古いマッピングを検索し(kill()シグナルとしてゼロを使用)、プロセス/ページテーブルのマッピングをクリーンアップできます。

(大まかに言えば、私はLinux上でPythonの共有メモリを使用する生産者/消費者処理エンジンをいじっています。ソリューションがBSDや他のプログラミング言語に移植可能であることを望んでいます---サポートがあればmmap()に必要なインターフェイスfcntl()flock()またはlockf(). ロックの競合を測定して同期の失敗を検出する方法を示す疑似コードにも興味があります。それぞれのオブジェクトを使用したスレッド化マルチプロセッシングQueue()が、実装するための最も簡単な方法であることを認識しています。 Pythonプロデューサー/コンシューマー処理モデル)。

4

1 に答える 1

1

ロックが相互排除を提供すると確信していますが、それらがメモリバリアを提供するかどうかはわかりません。カーネル(fcntl、flock、およびlockfが実行する)にジャンプすると、メモリの読み取りと書き込みの順序が狂ってコミットするように強制される可能性がありますが、確実な保証は得られないと思います。これはおそらく機能するものの1つだと思います。テストすると機能することが示されますが、多くのことを言っている参照が見つからない限り、常に機能するかどうかはわかりません。

私はCからこれに似た何かをしましたが、共有メモリ自体でアトミックスピンロックを使用しました。以前はインラインアセンブリを少し実行する必要がありましたが、gccには、使用できる固有の操作がいくつかあります。

http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html

非常に単純なPython拡張機能を作成する場合は、__ sync_lock_test_and_set(...)と__sync_lock_release(...)をラップして必要な処理を実行できます。それらはかなりポータブルでなければなりません。

pthreadミューテックスを共有メモリに入れる方法もあると思いますが、私はそれについての経験がありません。繰り返しになりますが、Pythonからアクセスするには、単純なC拡張機能を作成する必要があります。

于 2010-11-27T09:48:23.000 に答える