假设我在HDD磁盘存储中保存了一个文本文件(假设磁盘存储是新的,因此进行了碎片整理),文件名为a,文件大小为10MB
我假定,文件A占用磁盘中的一些空间,如图所示,其中x是磁盘上未占用的空间/内存
AAAAAAAAAAAAA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
现在,我创建并保存另一个文件B,大小一定。因此B将被保存为
aaaaaaaaaaa bbbbbbbbbbbbbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -由于磁盘是碎片整理,我假设存储将是连续的。
在这里,如果我编辑文件A并将文件大小减小到2MB会怎么样?
你能告诉我现在将如何分配内存吗?我能想到的选项有
AAAAAA xxxxxxxxxBBBBBBBBBBBBBBBBxxxxxxxxxxxxxxxxxxxxxxxxxxxx
或
AA xxx AA xxx 的 x 的 xxBBBBBBBBBBBBBBBBxxxxxxxxxxxxxxxxxxxxxxxxxxxx
或一个全新的位置,为其他文件腾出更大的块。
xxxxxxxxxxxxxxxBBBBBBBBBBBBBBBB AAAAAA xxxxxxxxxxxxxxxxxxxxxx
还是基于任何算法或数据结构的任何其他方式。
这很大程度上取决于您使用的文件系统类型(以及操作系统如何与之交互)。对于同一组逻辑操作,Windows中NTFS文件系统的行为可能与Ubuntu中ext3文件系统的行为完全不同。
但是,一般来说,大多数现代文件系统将文件定义为指向磁盘上的块的一系列指针。有一个最小块大小描述了最小的可分配块(通常范围从512字节到4 kb字节),所以小于这个大小或不是这个大小的精确倍数的文件将有一定数量的额外空间分配给它们。那么当你分配一个10mb的文件' a '时会发生什么?文件系统为文件内容保留10MB的块(甚至可能在末尾允许一些额外的块,以容纳对文件或其元数据进行的任何小编辑)。理想情况下,这些块将是连续的,如您的示例所示。当你编辑' A ',让它更小、文件系统将释放部分或全部(最有可能都因为在大多数情况下,编辑"A"写出"A"的全部内容到磁盘,所以几乎是没有理由的文件系统倾向于保持在同一物理位置A写数据到一个新的位置磁盘上的其他地方)的块分配给"A",并更新其引用包括任何新分配的块,如果必要的。
尽管如此,在使用现代文件系统和操作系统的典型情况下,我希望您的示例在磁盘上产生以下最终状态('b'和'a'表示分配给'b'和'a'的不包含任何有意义数据的额外字节):xxxxxxxxxxxxxxxBBBBBBBBBBBBBBBBbbAAAAAAaaxxxxxxxxxxxxxxxxxxxxxx
但是现实世界的结果当然会因文件系统、操作系统和潜在的其他因素而有所不同(例如,当使用SSD时,数据碎片变得无关紧要,因为磁盘的任何部分都可以以非常低的延迟访问,并且没有寻道惩罚,但同时最小化写周期变得很重要,这样设备就不会过早磨损)。因此,在这种情况下,操作系统可能倾向于尽可能地保留'A',以尽量减少需要覆盖的扇区数量)。
所以简短的回答是,"视情况而定"。
如何分配完全取决于文件系统类型(例如FAT32, NTFS, jfs, reiser等)和驱动程序软件。您假设文件将被连续存储的假设并不一定正确——根据硬件的不同,以不同的模式存储文件可能会更高效。例如,假设你有一个磁盘,有16个柱头,块大小为512字节,那么在16个不同的柱头上存储8k的数据可能是最有效的。OTOH,随着最近的硬件不涉及旋转机械部件,故事发生了戏剧性的变化-像"碎片"这样的概念突然变得毫无意义,因为每个块的访问时间是相同的-无论以何种顺序完成。
不,是这样的:
首先创建文件A:(这里大A代表实际用于A的数据,' A '代表为A保留的数据,x代表空闲)
AAAAAAAAAAAAAaaaaaaaXXXXXXXXXXXXXXXXXXX
然后加上B:
AAAAAAAAAAAAAaaaaaaaBBBBbbbbbbbbbb
然后添加C,但没有剩余的未保留空间:
AAAAAAAAAAAAAaaaaaaaBBBBbbbbCCCccc
如果A被截断,结果如下
AAAAAaaaaaaaxxxxxxxxBBBBbbbbCCCccc
如果B现在展开,则会发生以下情况:
AAAAAaaaaaaaBBBBxxxxxBBBBBBBBCCCccc
你看到B的数据不再彼此接近,这被称为碎片。当您运行碎片整理工具时,数据再次被放置在一起。