完全に作成された後にのみ自動的に新しいバージョンに置き換えられるように、既存のファイルを再作成します。

完全に作成された後にのみ自動的に新しいバージョンに置き換えられるように、既存のファイルを再作成します。

一部のUnicesは、「新しいバージョン」が出るまで、カーネルが以前のバージョン(他のプロセスが読み取りにアクセスできるようにする)を使用するように要求するフラグと一緒に書き込みのために既存のファイルを開く方法がありました。します。バージョンが完全に作成され(fdが閉じられた)、この時点からファイルが新しいバージョンとして表示されます。

つまり、他のプロセスでは古いバージョンまたは新しいバージョンを表示できますが、不完全に作成されたバージョンは表示されません。

知識のある人が私にいくつかの指示を与えることができますか?

答え1

説明する内容は、オーバーレイファイルのデフォルトの名前変更と同じです。

ファイル名を変更したり、別のファイルの上にファイルを移動したりすると、古いファイルの関連付けが解除されます。これは、ファイルがまだ存在するが、もはやファイルシステムツリーには存在しないことを意味します。これにより、以前のアプリケーションがファイルを開いたままにしておく限り、ファイルにアクセスできます。すべてのアプリケーションが既存のファイルを閉じると、そのファイルは事実上ディスクから割り当て解除されます。

システムrenameコールはアトミック操作です。したがって、これを行うには、別の名前で新しいファイルを作成し、一時ファイルの名前を変更するrenameファイルに変更を呼び出す必要があります。作業はアトミックなので、ファイルが失われる可能性はまったくありません。古いファイルから新しいファイルにすぐに移動されます。
ただし、一時ファイルと置き換えられるファイルは同じマウントポイントになければなりません。

答え2

〜のようにパトリックが書いた一般的なアプローチは、新しいバージョンを別のファイルに書き込んで完了したら、新しいバージョンの名前を古いファイル名に置き換えて自動的に上書きすることです。 2番目のタスクと呼ばれます。財政の名前を変更する

今、いくつかの参考資料は次のとおりです。

答え3

これは思います。更新時に割り当てられる。ファイルシステムがこの機能を使用すると、データをディスクに直接書き込むのではなく、ディスクの空き容量カウンタから書き込むデータのサイズを減算し、同期システムが実行されるまでデータをメモリに保存します。呼び出しまたはカーネルが決定します。ダーティバッファをフラッシュします。

この場合、ファイルがあるプロセスによって変更され、別のプロセスによって開かれると、後者のプロセスは変更されていません。または必要に応じて「古い」)ファイルバージョンです。

もちろん、上記は理論的であり、さまざまな要因によって異なります。これは少し予測できません。カーネルがいつダーティページをフラッシュするのかわからないからです。たとえば、Linux(「Linuxカーネルについて」のセクション15.3を読むこともできます。)、ダーティページは、次の条件でディスクに書き込まれます。

  • ページキャッシュがいっぱいになったため、より多くのページが必要になったり、ダーティページの数が多すぎたりしました。

  • ページが汚れたまま、あまりにも多くの時間が経過しました。

  • プロセスは、ブロックデバイスまたは特定のファイルに対して保留中のすべての変更をフラッシュするように要求します。これは、sync()、fsync()、またはfdatasync()システムコールを呼び出すことによって行われます。

この機能は、HFS +、XFS、Reiser4、ZFS、Btrfs、およびext4ファイルシステムで実装されていることが知られています。

関連情報