0

假设我在 HDD 磁盘存储中保存了一个文本文件(假设磁盘存储是新的并且已进行碎片整理)并且文件名是 A,文件大小为 10MB

我假设文件 A 占用了磁盘中的一些空间,如图所示,其中 x 是磁盘上未占用的空间/内存

AAAAAAAAAAAAA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

现在,我创建并保存另一个一定大小的文件 B。所以 B 将被保存为

AAAAAAAAAAAAA BBBBBBBBBBBBBBBBBxxxxxxxxxxxxxxxxxxxxxxxxxxx - 由于磁盘已进行碎片整理,我假设存储将是连续的。

在这里,如果我编辑文件 A 并将文件大小减小到 2MB 会怎样。你能说现在将如何分配内存吗?

我能想到的一些选项是
AAAAAA xxxxxxxxxBBBBBBBBBBBBBBBBxxxxxxxxxxxxxxxxxxxxxxxxxxxx


AA xxx AA xxx A x A xxBBBBBBBBBBBBBBBBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

或者一个全新的位置为其他文件释放更大的块。
xxxxxxxxxxxxxxxBBBBBBBBBBBBBBBB AAAAAA xxxxxxxxxxxxxxxxxxxxxx

还是基于任何算法或数据结构的任何其他方式。

4

3 回答 3

1

这在很大程度上取决于您使用的文件系统类型(以及操作系统如何与之交互)。对于同一组逻辑操作,Windows 中 NTFS 文件系统的行为可能与 Ubuntu 中 ext3 文件系统的行为完全不同。

然而,一般来说,大多数现代文件系统将文件定义为一系列指向磁盘上块的指针。有一个最小块大小来描述最小的可分配块(通常从 512 字节到 4 KB),因此小于这个大小或不是这个大小的某个精确倍数的文件将有一些额外的空间分配给它们。

那么当您分配一个 10 MB 的文件“A”时会发生什么?文件系统为文件内容保留了价值 10MB 的块(甚至可能在最后允许一些额外的块以容纳对文件或其元数据所做的任何微小编辑)。理想情况下,这些块将是连续的,如您的示例所示。当您编辑“A”并使其更小时,文件系统将释放部分或全部(很可能全部释放,因为在大多数情况下编辑“A”涉及将“A”的全部内容再次写入磁盘,因此没有什么理由文件系统更喜欢将“A”保留在相同的物理位置,而不是将数据写入磁盘上其他位置的新位置)分配给“A”的块,并更新其引用以包括已分配的任何新块(如有必要) .

话虽如此,在典型情况下并使用现代文件系统和操作系统,我希望您的示例在磁盘上产生以下最终状态(“b”和“a”表示分配给“B”和“A”的额外字节不包含任何有意义的数据):

xxxxxxxxxxxxxxxBBBBBBBBBBBBBBBBbbAAAAAAaaxxxxxxxxxxxxxxxxxxxxxx

但实际结果当然会因文件系统、操作系统和潜在的其他因素而异(例如,当使用 SSD 时,数据碎片变得无关紧要,因为可以以非常低的延迟访问磁盘的任何部分并且没有寻道损失,但在同时,最小化写入周期变得很重要,这样设备就不会过早磨损,因此操作系统可能倾向于在这种情况下尽可能地保留“A”,以尽量减少需要的扇区数量被覆盖)。

所以简短的回答是,“这取决于”。

于 2011-04-09T07:50:17.663 回答
0

如何分配完全取决于文件系统类型(例如 FAT32、NTFS、jfs、reiser 等)和驱动程序软件。您认为文件将连续存储的假设不一定正确 - 根据硬件,以不同的模式存储文件可能会更高效。例如,假设您有一个具有 16 个柱面和 512 字节块大小的磁盘,那么在 16 个不同的柱面上存储 8k 数据可能是最有效的。
OTOH,随着最近不涉及旋转机械部件的硬件,故事发生了巨大变化——像“碎片化”这样的概念突然变得毫无意义,因为每个块的访问时间都是一样的——不管它是以什么顺序完成的。

于 2011-04-09T07:30:46.103 回答
-1

不,是这样的:

首先创建文件 A:(这里的大 A 代表 A 实际使用的数据,'a' 代表 A 的保留数据,x 代表免费)。

AAAAAAAAAAAAAaaaaaaaXXXXXXXXXXXXXXXXXX

然后添加 B:

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

然后添加C,但没有剩余空间:

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

如果 A 被截断,这将会发生

AAAAaaaaaaaxxxxxxxxxBBBBbbbbCCCccc

如果 B 现在被扩展,这将发生:

AAAAaaaaaaaBBBBxxxxxBBBBBBBBCCCccc

您会看到 B 的数据不再彼此靠近,这称为碎片。当您运行碎片整理工具时,数据会再次靠近在一起。

于 2011-04-09T07:27:06.893 回答