为什么驱动器之间的文件传输使用 RAM

aku*_*kas 9 memory windows ssd hard-drive file-transfer

我注意到,每当我将大文件从我用作系统驱动器的 SSD 复制或移动到我的 HDD 或外部硬盘或闪存驱动器时,Windows 显示的速度图总是看起来相同:传输速度从大约 450 MB/s 开始,几秒钟后下降到 90 到 130 MB/s 之间,并保持稳定,直到复制/移动操作结束。

传输速度图

这激发了我的好奇心,所以我决定弄清楚这是什么原因。我的一些想法是:

也许这就是传输发生的实际速度

怀疑。虽然 450 MB/s 的速度与我的 SSD 的额定速度相匹配,但考虑到我在后台还有其他一些磁盘读/写操作,7200 rpm 的硬盘驱动器无法跟上它,因为我后来得到的 130 MB/s 的速度也是我所能期望的最高速度。那么,额外的数据去哪儿了?

额外的数据被存储在硬盘的缓存中

这更有意义,但如果我考虑到更高传输速度的持续时间,我的硬盘缓存大小必须超过 3 GB,这绝对不是。还能是什么?

额外的数据正在存储在 RAM 中

这是有道理的。我的 RAM 是我系统中唯一可以与我的 SSD 速度相匹配的其他部分,而且我有很多。让我们来看看这个理论!

我打开任务管理器,并查看性能选项卡。内存使用量稳定在 3.7 GB。然后我开始另一个 15 GB 的文件传输。内存使用量开始上升,并在传输速度降至 130 MB/s 时停止在 5.3 GB。它保持不变,直到文件传输结束(传输对话框关闭),然后慢慢回落到传输前的 3.7 GB 级别。

所以,我的最后一个理论是正确的。进一步确认的是额外使用的内存被标记为Modified

修改的.

重点是什么?

我的问题是,这样做的目的是什么?虽然我不介意文件传输使用我的一些 RAM,因为即使在我最繁重的多任务会话期间,我也从未见过它的使用率超过 70%,但存储 1.6 GB 的数据有什么好处你赢了不在您的 RAM 中进行任何处理?

从数据完整性的角度来看,我没有看到任何好处,因为您只是在复制文件,并且在断电的情况下,RAM 或 HDD 都不会特别成功地保留传输中的数据。

我可以看到好处是源磁盘(SSD)被快速释放,因此如果另一个进程需要对其执行大量读/写操作,它可以在没有文件传输阻碍它的情况下这样做,但如果是这样,为什么不继续以最大速度将所有 15 GB 加载到内存中?

此外,此过程会误导用户,因为即使在传输对话框关闭后文件传输仍在继续,因为某些数据仍在从内存复制到硬盘驱动器。这可能会导致用户在数据仍在写入时拔出可移动驱动器,可能会损坏可移动驱动器,导致并非每个人都为安全移除硬件而烦恼。

请记住,我没有使用可移动驱动器对此进行彻底测试,因为 Windows 可能会以不同的方式处理它们,使我的最后一点无效。

Ifc*_*0o1 1

Windows 内存管理是一件复杂的事情。正如您所看到的,它在不同的设备上有不同的行为。

\n\n

不同的操作系统有不同的内存管理。

\n\n

你的问题很有趣。我正在分享一个MSDN 页面,它解释了 Windows 中内存管理的一部分,更具体地说是“映射文件”

\n\n

它是软件开发人员的文档,但 Windows 也是软件。

\n\n
\n

使用 MMF I/O 的优点之一是系统在 4K 数据页中执行所有数据传输。在内部,所有内存页均由虚拟内存管理器 (VMM) 管理。它决定何时应将页面分页到磁盘,哪些页面将被释放以供其他应用程序使用,以及每个应用程序可以在整个物理内存分配中拥有多少页面。由于 VMM 以相同的方式执行所有磁盘 I/O\xe2\x80\x94 一次一页读取或写入内存\xe2\x80\x94,它已进行了优化,使其尽可能快。将磁盘读写指令限制为 4K 页序列意味着多个较小的读取或写入被有效地缓存到一个较大的操作中,从而减少了硬盘读/写头移动的次数。一次读取和写入内存页有时称为分页,这对于虚拟内存管理操作系统很常见。

\n
\n\n

不幸的是,我们无法轻易弄清楚 Microsoft 如何实现读/写 - 它不是开源的。
\n但我们知道它有非常不同的情况:

\n\n
From      To\n==================\nSSD       HDD\nHDD       Busy SSD ??\nNTFS      FAT\nNTFS      ext4\nNetwork   HDD\nIDE0slave IDE0master // IDE cable support disk to disk transfer.\nIDE       SATA // in this case you have separated device controllers.\n
Run Code Online (Sandbox Code Playgroud)\n\n

你明白了...硬盘可能很忙,文件系统可能不同(或者可能相同)...

\n\n

例如:ddLinux 中的命令“逐字节”复制数据 - 它非常快(因为两个 HDD 的磁头同步移动),但如果文件系统不同(例如具有不同的块大小) - 复制的数据将无法读取,因为文件系统具有不同的结构。

\n\n

我们知道 RAM 比 HDD 快得多。因此,如果我们必须进行一些数据解析(以适应输出文件系统),最好将这些数据放在 RAM 中。

\n\n

还想象一下您直接从-到复制该文件。
\n如果您使用其他数据流使源过载,会发生什么情况?目的地呢?
\n如果此时您几乎没有可用 RAM 怎么办?
\n...

\n\n

只有微软工程师知道。

\n