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