我的老板说,同时复制两个文件比复制一个文件再复制另一个文件花费的时间更长,因为硬盘驱动器必须不断在磁盘上的两个位置之间切换磁头。这是真的吗?在我看来,操作系统应该足够智能来解决这个问题(即,它应该知道按顺序复制它们)。当复制到连接到 USB 端口的驱动器时,这是真的吗?
编辑:还有其他与文件系统有关的因素吗?例如,复制包含 10 个文件的 1 个目录与从整个磁盘复制 10 个文件有什么区别吗?我只想知道一个源介质和一个目标介质(不从多个驱动器读取)。
答案1
我将推迟你这个问题。似乎在同一个磁盘上同时运行两个复制操作(尽管通过单独的复制操作启动)确实会花费更长的时间,这是由于磁头在竞争操作之间来回搜寻产生的延迟。
但是,如果复制操作开始同时,正如您所说,绝大多数现代操作系统都足够智能,可以将传输一个接一个地排队,从而可以缩短复制时间。
显然有许多应用程序可以强制文件复制操作排队并按顺序执行,例如万亿拷贝和快速复制
然而,在多个物理卷上执行并发复制操作则完全是另一回事。通过替代协议传输文件也是如此。
关于复制到连接到 USB 端口的驱动器的问题,这在很大程度上取决于驱动器使用的内存类型和正在使用的 USB 规格(对于 USB 1.0 和 2.0 来说肯定是一个值得注意的瓶颈),以及前面提到的有关复制源卷的因素。
答案2
有很多因素可能会影响这一点。
- 源驱动器 - 这是旋转磁盘还是 SSD?如果是旋转磁盘,文件的布局可能会影响性能。由于两个文件可能位于磁盘的不同部分,因此这将导致磁头寻道损失。正如您所说,如果您一次选择两个文件并以此方式启动复制,则操作系统将按顺序处理复制。
- 文件布局 - 文件的碎片(无论是在源还是目标上)可能会影响非 SSD 驱动器的性能
- 目标 - 如果有两个写入流写入单个目标,那么您又回到了磁头寻道问题(再次假设不是 SSD),并且您可能会严重交错文件。我曾经在一家生产高性能存储的公司工作,他们面临的一个大问题是他们可以读取或写入多少实时视频流(2k 视频每秒需要约 300 兆)。交替写入会减慢复制过程,也会使文件读取速度变慢。当然,如果您的磁盘一开始就碎片化,那么您的文件无论如何都会被交错写入。
- 单个/多个源/目标 - 取决于您的文件是全部来自一个驱动器还是全部写入一个驱动器,磁头寻道问题可能或多或少
- 文件大小 - 对于非常小的文件,磁头寻道问题并不重要,因为磁头无论如何都需要寻找下一个文件(这意味着磁头不会在文件之间来回移动,而是按顺序读取文件)
至于操作系统是否足够智能来解决这个问题,一般来说,它们是可以的。也就是说,如果你同时复制多个文件(例如,考虑一下一次选择多个文件并进行拖放)。
当然,如果您启动两个cp
命令,那么它将运行这两个命令,或者在 Windows 中,如果您复制/粘贴单独的文件,并在屏幕上获得两个“复制”进度窗口,则不会发生优化。在这种情况下,您已明确告知操作系统您想要同时运行两个副本,因此它不会决定一个副本比另一个更重要并开始对它们进行排队。
答案3
如果您多次选择并复制 - 无论是从 GUI,还是使用“copy C:\folder* D:\folder\”之类的命令 - 那么文件无论如何都会被按顺序复制,使得问题变得毫无意义。
如果您复制一些文件,并且在复制过程中开始复制更多文件(通过 GUI 中的两个单独操作或同时运行两个单独命令,如“cp -r /usr/bin/ /opt/bin/ & cp -r /usr/local/bin/ /opt/local/bin/” - 那么性能几乎肯定会下降 - 可能下降一点点(高端固态硬盘,两个复制操作中的文件都很大)或者下降很多(旋转磁盘,一个或两个操作中的文件相对较小)。更好的操作系统可能会在一定程度上减轻性能损失 - 例如,现代 Linux 内核使用 CFQ(完全公平队列)I/O 调度程序,它将在某种程度上“批量”阻止操作以提高效率 - 但您的性能仍然会受到影响。在某些情况下,命中率可能会非常高,因为旋转磁盘的随机 I/O 速度比顺序 I/O 慢得多(可能慢两个数量级或更多,这就是为什么现代 I/O 调度程序尽力通过批处理和缓存操作来减轻问题,以尽量减少不必要的寻道)。
TL;DR - 仅运行一个副本手术一次,无论其中包含多少个单独的文件手术,如果您担心性能。