複数のプロセスがリソースセットを共有し、「特殊」プロセスがリソースセットに排他的にアクセスできるようにするために、ロックスキームを実装する必要があります。
これはバッチプロセスです。各トランザクションの開始時に無限ループから適切なロックを取得し、最後にロックを解除することをお勧めします。
flock
必要な意味(LOCK_SH、LOCK_EX、LOCK_UN)があります。私はPerl Flock.pmと唯一の目的がflock
「編集」されるダミーファイルを試しました。私はそれがどれくらい遅いかについて少し驚きましたが、時間が費やされる「トップ」では明らかではありません。 (実行されるループにLOCK_SHとLOCK_UNだけが含まれていてもCPUバウンドではありません)flock
。共有リソースが実際のファイルではない場合や、私が知らない他の機能がある場合でも、* nixアクセスの共有リソースです。
修正する:@mswは私が(誤って)ローカルファイルの代わりにNFSファイルをロックしたと正確に推測しました。ローカルファイルを使用すると、パフォーマンスへの影響が完全に排除されます。ファイルロックが実際にこの種の問題を解決する最良の方法であるかどうかを詳しく知るために、この質問を開いておきます。
答え1
Unixには多数のロックシステムがあります。あなたが見つけたのはBSDファイルロックと呼ばれますが、その他ファイルのロック方法。しかもあなたもシグナル、ミューテックスそしてもっと。
あなたの直接の質問に関してはそうです。それは非常に良いアプローチです。かかる時間は心配しないでください。本質的に、ロックは高価な活動です。だからデザインに多くの努力を注ぐ。ロックなし器具。
あなたの計画について私を迷惑にする唯一のことはあなたが作るべきダミーファイルです。必要なものを達成するより簡単な方法があるかもしれませんmkdir(2)
。呼び出しはアトミックなので、ディレクトリがすでに存在する場合はエラーが発生します。対照的に、open(2)
それ原子のみO_EXCL
、これはどこでも使用できません。使用可能な場合は、NFSv2 が使用中または有効になっていないため、期待どおりに機能しない可能性があります。NFSファイルロックデーモン。
このアプローチの1つの利点mkdir
は、.shellスクリプトを介して実行できることですmkdir(1)
。 Perlを使用しているようですが、この場合は外部モジュールではなく組み込み関数です。
もう1つの利点は、特別な助けなしにNFSを介して機能することです。ディレクトリを2回作成することはできません。
このアプローチの唯一の問題mkdir()
は、既存のディレクトリが消えるまで待つ方法がないことです。つまり、ブロックロック操作ではありません。ロックを解除して競合するプロセスがほとんどの時間休止状態になるようにタイマーでラップすることをお勧めします。各プロセスがランダムな時間待機することをお勧めします。たとえば、100〜200ミリ秒の間usleep(3)
。これによりフォームが生成されます。スピンロック。