
foo.txt
サイズが バイトの というファイルがあるとします。サイズが バイトの500
新しいファイルを作成し、 として保存して、ファイルを上書きするとします。OS (Windows および Linux) は、使用されなくなった領域 (バイト)を自動的に解放しますか?10
foo.txt
410
2つ目のシナリオでは、dd ユーティリティ上記のように、古い foo.txt と新しい foo.txt の両方を作成します。OS は、使用されなくなった領域を自動的に解放しますか?
舞台裏では、ファイルへのすべての書き込みで同じ OS システム コールが使用され、上書きの処理はプログラム間で一貫していると想像しています...
答え1
あなたの質問は、プロセスがいくつかの要素を含むと見なしていることから生じているように思われます。つまり、未使用のスペースはすべて他の用途に使用できること、既存のファイルと同じ名前のファイルが同じ場所に書き込まれることです。これらの前提は両方とも不正確です。また、使用されなくなったスペースが解放されることについても言及されています。動作の仕組み上、これらの用語は同義語のようなものです。スペースはファイルに割り当てられるか、割り当てられないかのどちらかです。
davidgo が説明したように、ドライブはセクター全体またはブロック単位で動作します。ここでは、簡単にするために、スペース割り当て単位を「ブロック」と呼びます。スペースはブロック単位で割り当てられます。1 バイトのファイルにはブロック全体が割り当てられるため、小さなファイルについて話している場合でも、サイズが 1 ブロック未満のものにはブロック全体が割り当てられます。小さな (サブブロック) ファイルには、他の目的でアクセスできない未使用の領域がブロック内にあります。複数のブロックを使用する大きなファイルを、より少ないブロックを使用する小さなファイルに置き換えるということもできます。その場合、不要になったブロック全体があります。
古いファイルは実際には上書きされません。新しいファイルは、必要な数のブロックを使用して別の場所に保存されます。ファイルシステムのファイル テーブル内の古いファイルのブロックへの参照が変更されます。これらのブロックはどのファイルにも割り当てられなくなり、再利用できるようになります。このプロセスでは古いファイルの内容は削除されず、スペースが必要になるまで無視されます。削除されたファイルを回復できるのはそのためです。
dd を使用した場合、これが異なるかどうかを尋ねられました。dd はさまざまな方法で使用できます。同じ名前を使用して新しいファイルを書き込むだけに限定すると、同じように機能します。
答え2
@KamilMaciorowski が言ったように、質問の重要な要素はディスクのブロック サイズです。ブロック サイズが 512 バイト未満の最新のファイル システムを見つけることは非常にまれです (ほとんどのファイル システムはブロック サイズがはるかに大きいです)。これは、ブロック サイズよりも小さいファイル操作を扱う場合、それらの操作がブロック サイズと同じ量のリソースを使用することを意味するため、重要です。したがって、あなたの質問に対する答えは「いいえ」です。400 バイトのファイルは 1 ブロックを占め、1 ブロックを使用する別のファイルに置き換えられます。元のブロックは解放される可能性があります (ただし、上書きされる可能性があります) が、ディスク領域は節約されません。
皆さんはご存知だと思いますが、他の人のために、ブロックが解放されると通常は上書き/空白化されず、回復できることが多いことにも注目してください。これは、ディスク内の内容と OS が認識する内容をさらに抽象化する SSD ではさらに当てはまります (ウェア レベリングのおかげです)。