一部のUnicesは、「新しいバージョン」が出るまで、カーネルが以前のバージョン(他のプロセスが読み取りにアクセスできるようにする)を使用するように要求するフラグと一緒に書き込みのために既存のファイルを開く方法がありました。します。バージョンが完全に作成され(fdが閉じられた)、この時点からファイルが新しいバージョンとして表示されます。
つまり、他のプロセスでは古いバージョンまたは新しいバージョンを表示できますが、不完全に作成されたバージョンは表示されません。
知識のある人が私にいくつかの指示を与えることができますか?
答え1
説明する内容は、オーバーレイファイルのデフォルトの名前変更と同じです。
ファイル名を変更したり、別のファイルの上にファイルを移動したりすると、古いファイルの関連付けが解除されます。これは、ファイルがまだ存在するが、もはやファイルシステムツリーには存在しないことを意味します。これにより、以前のアプリケーションがファイルを開いたままにしておく限り、ファイルにアクセスできます。すべてのアプリケーションが既存のファイルを閉じると、そのファイルは事実上ディスクから割り当て解除されます。
システムrename
コールはアトミック操作です。したがって、これを行うには、別の名前で新しいファイルを作成し、一時ファイルの名前を変更するrename
ファイルに変更を呼び出す必要があります。作業はアトミックなので、ファイルが失われる可能性はまったくありません。古いファイルから新しいファイルにすぐに移動されます。
ただし、一時ファイルと置き換えられるファイルは同じマウントポイントになければなりません。
答え2
〜のようにパトリックが書いた一般的なアプローチは、新しいバージョンを別のファイルに書き込んで完了したら、新しいバージョンの名前を古いファイル名に置き換えて自動的に上書きすることです。 2番目のタスクと呼ばれます。財政の名前を変更する。
今、いくつかの参考資料は次のとおりです。
ISO Cの要件は
rename
原子的です。オープングループ基本仕様から:リンク名がある場合新しい引数が存在するため、削除する必要があります。古い次に名前を変更する 新しい。この例では、名前付きリンクは新しい名前変更操作全体で他のプロセスに表示され参照する必要があります。新しいまたは古い手術開始前。
以前のバージョンの Mac OS X には原子名変更機能はありません。この問題はLionで解決されたことが知られています。
Btrfsは明らかに意図的に標準に違反しています。原子名の変更は保証されません。、性能上の理由から。しかし、名前変更の上書きはまだ原子的です。、これがこの目的のために必要なすべてです。
答え3
これは思います。更新時に割り当てられる。ファイルシステムがこの機能を使用すると、データをディスクに直接書き込むのではなく、ディスクの空き容量カウンタから書き込むデータのサイズを減算し、同期システムが実行されるまでデータをメモリに保存します。呼び出しまたはカーネルが決定します。ダーティバッファをフラッシュします。
この場合、ファイルがあるプロセスによって変更され、別のプロセスによって開かれると、後者のプロセスは変更されていません。または必要に応じて「古い」)ファイルバージョンです。
もちろん、上記は理論的であり、さまざまな要因によって異なります。これは少し予測できません。カーネルがいつダーティページをフラッシュするのかわからないからです。たとえば、Linux(「Linuxカーネルについて」のセクション15.3を読むこともできます。)、ダーティページは、次の条件でディスクに書き込まれます。
ページキャッシュがいっぱいになったため、より多くのページが必要になったり、ダーティページの数が多すぎたりしました。
ページが汚れたまま、あまりにも多くの時間が経過しました。
プロセスは、ブロックデバイスまたは特定のファイルに対して保留中のすべての変更をフラッシュするように要求します。これは、sync()、fsync()、またはfdatasync()システムコールを呼び出すことによって行われます。
この機能は、HFS +、XFS、Reiser4、ZFS、Btrfs、およびext4ファイルシステムで実装されていることが知られています。