0


0

ファイルを作成し、そこにデータを書き込み、その後短時間の処理の後(自分自身または別のプロセスによって)、ファイルを削除して残りのファイル記述子をすべて閉じるプロセスがあるとします。

ここでは、ファイルが削除されるまでページをメモリに保持するのに十分なRAMがあり、その間に誰もsync()を呼び出さないと仮定します。

今削除されたファイルのブロックはディスクに書き戻されるのでしょうか、それともダーティーリストから即座に削除されますか。

それともファイルシステムに依存しますか? xfsやext4のようなファイルシステムには、この機能が実装されていればそれをサポートするかもしれない「遅延割り当て」があります。

4 Answer


2


古典的なUnixファイルシステムでは、答えは "No"です(つまり、作成および削除されたファイルのデータが必ずしもディスクに保存されるとは限りません)。変化する。 したがって、発生することは、使用中のファイルシステムによっても異なります。

`+ sync()`を呼び出しても、それらが書き込まれることを保証しないことに注意してください。ディスクへのデータの書き込みをスケジュールするだけです。 したがって、システムを停止する前に「 sync 」コマンドを2回入力する古代の差し止め命令-これにより、コンピューターに「 sync +」を2回入力するよりも高速にディスクに書き込むことができるため、書き込みを完了するのに十分な時間が与えられました(特にたまたま110ボーで実際のテレタイプを使用しています)。

'' '' '

POSIX標準では( `+ sync `コマンドで使用される ` sync()+`関数について)とあります:

_ _ sync()関数は、ファイルシステムを更新するメモリ内のすべての情報を、すべてのファイルシステムに書き出すようにスケジュールします。

スケジュールはされていますが、sync()から戻った時点で書き込みが完了するとは限りません。 _ _

Linuxが「すべてのデータがディスクに書き込まれる」ことを保証するためにその定義を変更した場合、それは有効で有用な拡張です。 しかしそれは古典的な振る舞いではありません - そしてLinuxの専門知識を他のシステムに変換することに注意してください。

fsync()のように、他のより厳密な約束を与える関数があります。

_ fsync()関数は、fildesで指定されたオープンファイル記述子のすべてのデータが、fildesで記述されたファイルに関連付けられたストレージデバイスに転送されることを要求します。 転送の性質は実装定義です。 fsync()関数は、システムがその動作を完了するまで、またはエラーが検出されるまで戻りません。 _

そして、他の約束を再び与えるファイル記述子へのオプションがあります:O_SYNC、O_DSYNC、O_RSYNC。 POSIX標準( + open()+)で調べてください。


1


私はJonathan Lefflerに同意しますが、これは古典的なUnixファイルシステムだけではありません。ext4ファイルシステムに関して同様のトピックについての議論がありました。

https://bugs.edge.launchpad.net/ubuntu/ source / linux / bug / 317781 / comments / 45 [コメント]で、Theodore Ts’o(ext4ファイルシステムの主要開発者の一人)はこう述べています。 … たとえば、スクラッチファイルを作成し、20秒後にそれを削除した場合、おそらくそのファイルはディスクにヒットしません。


1


私はこれについていくつかの調査をしました、そして、Linuxの下で、それは確かにファイルシステムに依存するということがわかりました。

ext3は、削除されたファイルがどれほど小さくても、どれほど早く削除されても、常に削除されたファイルを書き戻すようです。 XFSは必ずしもそうとは限りません。十分なRAMがある場合は、短期間の一時ファイルを使用するアプリケーションのパフォーマンスがはるかに向上する可能性があります。

私は「最新の」Linuxファイルシステム(ext4、btrfs)もこれを行っていると思います。 それは良いことです。


0


ここであなたは本当に何を知る必要がありますか?

質問が「おそらくディスクに書き込まれるのでしょうか」という質問であれば。あなたの処理が短いのであれば、答えはノーだが、約束はない。

質問が「ディスクに書き込まれないことを確認できますか」という質問です。答えもノーです。 削除されたファイルは、開いている限り他のファイルと同じです。名前のないファイルです(リンク)。

答えが「ディスクに関しては完全に無料ですか」という答えであれば。答えはもう二度とありません - たとえば、クォータを持つシステムでは、ファイルを書いた直後にファイル内の "ブロック"数がユーザーのファイルシステムクォータに対して課金されることは確実です。