UFS(Unix File System)では、ファイルは直接または間接ブロックを参照する15個のポインタを持つinode構造で表されます。
下の画像を例に挙げてみましょう。
Data
右側に表示される各ブロックには、実際のファイルデータが含まれています。サイズはdata block
通常4096で、ファイルシステムの作成時に決定されます。
40MBの大容量ファイルの場合、ほぼ1Kのデータブロックを占めています。この場合、ファイルにデータを追加すると、最後のブロックにのみ影響するか、最後のデータブロックにスペースがない場合は新しいデータブロックが作成されることがわかりました。
ただし、ファイルの先頭(約200バイト)にいくつかのデータを追加すると、下のデータブロックにカスケード効果があり、各データブロックの最後の200バイトが次のブロックに移動(またはプッシュ)されます。ワンピース?
同様に、最初のデータブロックの最初の200バイトを削除すると、子データブロックにカスケード効果がありますか?
それとも、通常、UFSまたはファイルシステムには、各データブロックに対していくつかのバッファスペースを予約してこの状況を処理する効率的な方法はありますか?
よろしくお願いします。
答え1
ほとんどのファイルシステムはファイルの先頭にデータを挿入することをサポートしておらず、Unixには対応するAPIはありません。ほとんどのオペレーティングシステムでファイルを変更する唯一の方法は、セグメントを上書きする(たとえばに変更)、データをaaaaaaaaaa
最後aaabbbaaaa
に追加する(たとえばにaaaaaaaaaa
変更aaaaaaaaaacccc
)、ファイルを切り捨てること(たとえばaaaaaaaaaa
に変更aaaaa
)です。
ファイルの先頭にデータを追加するには、追加したデータで新しいファイルを作成し、古いファイルの内容をコピーします。
これは元のUnixとほとんどの(すべてではありませんが)最新のUnix(そして通常はほとんどのオペレーティングシステム)に当てはまります。