競合状態が読み書きに与える影響(同時に発生)

競合状態が読み書きに与える影響(同時に発生)

a読み取るためにファイルを開くとしましょう。アプリケーション(このように呼び出す)がランダムな間隔でファイルに書き込まれるとaWriterどうなりますか?開いて読もうとすると、a間違ったファイルの内容を受け取ることがありますか?同時に aWriter新しい行を作成しています。ファイルはどのようになり、ファイルを読み取った内容はどうなりますか?

別の状況。b100行のテキストを含むファイルがあるとします。bWriterランダムに書くアプリケーションもあります。bファイルの最初の80行を削除したいですbbWriter文を書きたいと仮定すると、開いbてからも書くことができますか?あきらめて書き込み内容を失うでしょうか?

Syslog関連のPerlスクリプトを書いているので、この質問をします。 Syslogにすべてのログをファイルに書き込むように指示し、スクリプトは(5分ごとに)ファイルの内容を読み取り、別の操作を実行し、ファイル内のすべての行を削除して前の行をアーカイブに書き込む必要があります。私はこのファイルをスクリプトとログの最後の場所の間の中間段階として使用します。

誰がそれが正確にどのように機能するかについての洞察を与えることができますか?

答え1

両方のプロセスが書き込み用に同じファイルハンドルを開くことができます。いつものように、最後に処刑する人が勝ちます。

あるプロセスがファイルハンドルを開き、別のプロセスがここに80行を書き込むと、最初のプロセスのメモリバッファには80行がありません。その後、バッファがファイルハンドルに書き込まれると、ファイルの内容は単に2番目のメモリバッファの内容になります。

ところで、最近、多くのプログラムは、元のファイルの内容が最後に開かれてから変更されたことを検出します。一部は書き込みを拒否し、一部はバッファを再ロードするように求められます。いくつかは他のことをするかもしれません。すべてのプログラムは、正しいことを行うことを確認する責任があります。カーネル/ファイルシステムは気にせず、80行がないメモリバッファ正しいコピー。

これで、ホームディレクトリにあるいくつかのテキストファイルやドキュメントだけでなく、データベースなどのより重要なものであれば、ファイルロックを使用する可能性が高くなります(ロックを言わない、または使用しないという意味でもありますvimgedit。データベースには独自の内部ロック機構があります。

UNIXスタイルのプラットフォームの一般的なアイデアは、ファイルハンドルの書き込みに対してコラボレーションを実行することです。ロックは、セキュリティ制御メカニズム(権限/ ACLの目的)ではなく、データ整合性メカニズムです。データを書き込む2つのプログラムは通常、データが正しく書き込まれていることを確認したいので、互いのロックを尊重することは両方の当事者にとって有益です。カーネル/ファイルシステムはロックについて警告しますが、まだ各プロセスが最善であると思うタスクを実行できるようにします。ただし、Linuxはインストールオプションでロックを適用します(ファイルシステムのサポートが必要な場合がありますがわかりません)。

ロックの詳細をご覧ください。Wikipediaファイルのロック記事。

関連情報