同时将多个文件写入硬盘分区是否会导致碎片化?这些文件是否会交错写入硬盘?
例子:
- 同时从网络下载多个文件
- 将文件从不同来源复制到同一分区
- 下载多个种子
不同的操作系统之间是否有所不同?预先为整个文件分配空间是否是应用程序特有的功能?
答案1
这在很大程度上取决于所使用的文件系统,某种程度上取决于操作系统,以及打开文件的程序。应用程序在创建新文件时需要请求正确的存储量,当这些应用程序不知道需要请求多少空间时,操作系统和文件系统功能会影响它们遵循的打开和扩展行为。
如果程序向操作系统请求一个 4.2GB 的文件,操作系统会找到一块有 4.2GB 可用空间的块。如果找不到,操作系统会为程序提供足够的可用空间片段来保存文件。这里有一些变量,这是简化的。
如果程序向操作系统请求一个 4KB 文件,操作系统会提供。如果程序不断请求新的连续 4KB 段(您正在下载文件,而程序不知道它有多大),直到获得 4.2GB 空间,操作系统会很乐意提供空间。这就是文件系统和操作系统产生差异的情况。
例如,XFS 是基于扩展的,因此添加的空间将是连续的,直到无法连续为止。此外,XFS 可以配置为预先为新文件分配一定量的空间,这可以进一步最大限度地减少碎片(对虚拟机存储卷以及 DVD ISO 卷很有用)。
EXT2/3、NTFS 以及我相信的 Reiser 会分配连续的空间,直到无法再分配为止。然后它将开始新的片段。不过每个片段的大小可以是 4KB。
让我们考虑最坏的情况。两个并行的 4.2GB 文件每次以 4KB 的速度并行保存到同一目录中。“同一目录”属于最坏情况的一部分,因为某些 OS/FS 组合会尝试将同一目录中的文件彼此靠近。对于某些 OS/FS 组合,这将导致两个文件在磁盘上完全交错。对于其他尝试将新打开的文件保存在不同的空闲段上的组合,可能根本没有碎片或碎片很少。
关于 XFS 的一点(我认为 ext4 和 btrfs 也可以做到这一点)。在这种情况下,交叉将不是 4KB,它将是您在安装卷时设置的分配大小值。将其设置为 256MB,您将获得一个 4.2GB 的文件,其中包含 17 个片段,而不是超过一百万个。对于存储大文件的卷(如媒体服务器)很有用。对于存储大量小文件和一些大文件的卷没有用。
正因为如此,Bittorrent 客户端要么在开始新的下载时打开稀疏文件,要么在启动之前仅分配总共指定的大小。
当从同一分区的不同部分复制文件(或者甚至从其他分区复制文件)时,复制过程理论上知道复制的文件有多大,因此从一开始就从操作系统请求适当大小的空间;无需为新文件附加分配。