ユーザーAはファイルfoo
を読み取るようにシステムに要求し、同時にユーザーBは自分のデータを同じファイルに保存したいと考えています。この状況は、ファイルシステムレベルでどのように処理されますか?
ほとんどのファイルシステム(すべてではない)は、ロックを使用して同じファイルへの同時アクセスを保護します。ロックは排他的であるため、ロックを取得した最初のユーザーがアクセスを取得します-後続のユーザーは「アクセス拒否」エラーを取得します。このシナリオ例では、ユーザーAはファイルを読み取ってファイルロックを取得できますが、ユーザーBはユーザーAが読み取り中に書き込むことができません。
一部のファイルシステム(NTFSなど)では、ロックのレベルを指定できるため、たとえば同時読み取りは許可されますが、書き込みは許可されません。バイト範囲ロックも可能です。
データベースとは異なり、ファイルシステムは通常トランザクションではなくアトミックではなく、異なるユーザーからの変更は分離されません(変更が見られる場合でも、ロックするとこれが禁止される場合があります)。
ファイル全体のロックの使用は粗雑なアプローチですが、一貫性のない更新を防ぎます。すべてのファイルシステムがファイル全体のロックをサポートしているわけではないため、ロックファイルを使用するのが一般的です。通常は、関連付けられたファイルが使用中であることを示す空のファイルです。 (ファイルの作成は、ほとんどのファイルシステムでアトミック操作です。)
Linuxの場合、簡単な答えは、コンカレントライターがいる場合、ファイルから奇妙な情報を取得できるということです。カーネルは内部的にロックを使用して、各read()およびwrite()操作をシリアルに実行します。 (ただし、ファイル全体がロックされているか、ページごとの粒度であるかは忘れます。)しかし、アプリケーションが複数のwrite()呼び出しを使用してファイルに情報を書き込む場合、read()はこれらの呼び出しの間に発生する可能性があるため、一貫性のないデータが表示される可能性があります。これは、オペレーティングシステムでは atomicity violation です。
Mdmaで述べたように、 file locking を使用して、一度に1人のリーダーと1人のライターのみが存在することを確認できます。 NTFSは強制ロックを使用しているようです。1つのプログラムがファイルをロックすると、他のすべてのプログラムがアクセスしようとするとエラーメッセージが表示されます。
Unixプログラムは一般にロックをまったく使用しません。使用する場合、ロックは通常advisoryです。アドバイザリロックは、他のプロセスが同じファイルでアドバイザリロックを取得できないようにするだけです。 itは実際には読み取りまたは書き込みを妨げません。 (つまり、ロックを確認した人だけがファイルをロックします。)