(Linuxまたは他のUNIXライクなシステムからの)共有メモリに使用する場合、マッピングへのアクセスを調整するために使用(または機能)mmap()
することは可能(および移植可能)ですか?fcntl()
flock()
lockf()
このSOの質問への回答は、それが機能するはずであることを示唆しているようです。
私が念頭に置いているのは、共有メモリをプロセス/ページマップで構造化して、ロックの競合を最小限に抑えることです。プロセスはそれぞれのページで同時に動作する可能性があり、プロセス/ページのマッピングを更新するときにのみロックを取得する必要があります。(所有されていないページからの読み取りアクセスには、シリアル番号の確認、目的のデータのコピー、およびそのブロックのシリアル番号が変更されていないことの検証が含まれます)。
概念的には、このファイルマッピングを共有する各プロセスは、を実行しmmap()
、その中の空きブロックを見つけ、プロセス/ページ領域へのロックを取得し、それを独自の割り当てで更新し、ロックを解放してから、楽しく作業を続けます。どのプロセスでも、古いマッピングを検索し(kill()
シグナルとしてゼロを使用)、プロセス/ページテーブルのマッピングをクリーンアップできます。
(大まかに言えば、私はLinux上でPythonの共有メモリを使用する生産者/消費者処理エンジンをいじっています。ソリューションがBSDや他のプログラミング言語に移植可能であることを望んでいます---サポートがあればmmap()
に必要なインターフェイスfcntl()
、flock()
またはlockf().
ロックの競合を測定して同期の失敗を検出する方法を示す疑似コードにも興味があります。それぞれのオブジェクトを使用したスレッド化とマルチプロセッシングQueue()
が、実装するための最も簡単な方法であることを認識しています。 Pythonプロデューサー/コンシューマー処理モデル)。