![Windows 如何能如此快速地转储休眠文件中的完整 RAM?](https://linux22.com/image/1443362/Windows%20%E5%A6%82%E4%BD%95%E8%83%BD%E5%A6%82%E6%AD%A4%E5%BF%AB%E9%80%9F%E5%9C%B0%E8%BD%AC%E5%82%A8%E4%BC%91%E7%9C%A0%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%AE%8C%E6%95%B4%20RAM%EF%BC%9F.png)
我正在经历文章解释了 Microsoft Windows 中的休眠过程。我从中学到的主要观点是
- Windows 将整个 RAM(可能在处理之后)转储到
hiberfil.sys
文件中。 - 在启动期间,读取休眠文件,并将内容加载到 RAM 中。
我的问题是,当我复制一个大小为 1 GB 的文件时,大约需要2分钟去完成。
然而,当Windows写入休眠文件时(在休眠过程中),整个过程可能需要10-15秒。 为什么写入速度会有这么大的差异呢?
我的 RAM 大小是 4 GB。(我不是在谈论快速启动技术。)
基准:
- 将 1 GB 文件从磁盘 1 复制到磁盘 2(外部):2.3 分钟。
- 使系统休眠:15秒。
答案1
答案可能有三个。
这里可能起作用的是 Windows 中的新混合关机功能,它可以有效地关闭应用程序、注销您的帐户,然后继续休眠操作系统的核心。已经保存了这些数据意味着它不需要“重新休眠”。
第二件事是休眠不需要保存被调出到交换文件或未使用的内存页(这是积极填充交换文件的一个原因和并将数据保存在内存中)。
第三是休眠文件数据也被压缩。结合我的第二点,如果您只有一小组要导出的数据,其中包含高度可压缩的数据(可执行文件通常压缩得很好),那么进入休眠文件的数据量可能比工作数据集小得多。请注意,正如评论中所述,文件缓存和其他不必要的缓冲区数据可以轻松丢弃,而不会产生任何不良影响,以减少要转储到休眠文件中的数据量。
此外,目前的硬盘速度相当快。如果磁盘的持续写入速度为 100 MB/s,那么您可以在不到一分钟的时间内将 4 GB 的 RAM 写出(未压缩)。由于休眠可以在暂停所有用户进程之后、暂停 CPU 之前作为最后一项操作进行,因此操作系统通常具有磁盘的完整写入速度。这是您的简单基准测试所不具备的,并且从磁盘复制到磁盘可能比简单地将 RAM 写入磁盘要慢。
结合这些因素,写入休眠文件的数据量可能非常小,可能达到 1 GB 的数量级,并且可能会在 10 秒内写入一个大的连续块。
答案2
首先,需要节省的 RAM 量出奇地小。实际上,只需要刷新映射的脏页集(“惰性写回”)以及已写入和重新定位可执行代码的所有私有页。
- 可执行文件的 .text 段始终由文件映射支持。至少对于一些DLL(但不是全部,取决于它们是否需要重新定位)。
- 类似地,由文件映射支持的内存可以被丢弃(假设它不是 CoW 或 RW和肮脏的)。
- 惰性写回仍会发生,但除此之外,可以丢弃缓存。
- 已分配但尚未写入的内存(通常是应用程序数据的大部分!)由零页支持,可以被丢弃。
- 处于“待机”状态的内存页面的大部分(Windows 上实际的每个进程驻留工作集是令人惊讶的是由于文件很小,只有 16MB,因此某些时候该文件会在后台被复制到页面文件中,然后就会被丢弃。
- 某些设备(例如显卡)映射的内存区域可能(可能)不需要保存。用户有时会惊讶地发现,他们将 8GiB 或 16GiB 插入计算机,而 1GiB 或 2GiB 却毫无原因地“消失了”。主要的图形 API 要求应用程序能够处理“在某些条件下”缓冲区内容无效的情况(没有说明这到底意味着什么)。因此,期望图形驱动程序固定的内存也被丢弃并非不合理。毕竟,屏幕无论如何都会变暗。
其次,与复制文件相反,从驱动器的角度来看,转储需要保存到磁盘的 RAM 页集是单个连续的连续写入。Win32 API 甚至公开了一个用户级功能针对此操作。聚集写入由硬件直接支持,其工作速度与磁盘物理上能够接受数据的速度一样快(控制器将直接通过 DMA 提取数据)。要使
此功能正常工作,需要满足许多先决条件(例如对齐、块大小、固定),并且它与缓存配合得不好,并且没有“惰性写回”(这是正常操作下非常理想的优化)。
这就是为什么不是每次写一直都是这样。但是,当系统保存休眠文件时,所有先决条件都会自动满足(所有数据都是页面对齐的、页面大小合适的并且固定的),并且缓存变得无关紧要,因为计算机马上就要关闭了。
第三,进行一次连续的写入非常有利适用于旋转磁盘和固态磁盘。
交换文件和休眠文件通常是磁盘上最早创建和保留的文件。它们通常有一个,最多两个碎片。因此,除非扇区损坏,磁盘必须重新分配物理扇区,否则逻辑顺序写入转换为身体的在旋转磁盘上顺序写入。
当写入大量连续的连续数据时,磁盘上不需要读取-修改-写入操作。这个问题在旋转硬盘上不太明显,因为旋转硬盘可以写入非常小的单个扇区(只要您不写入单个字节,缓存通常会阻止这种情况,设备就不需要获取原始内容并写回修改后的版本。)然而
,这是非常引人注目在 SSD 上,每次写入都意味着控制器必须读取和修改一个 512kB 的块(这是一个常见的数字,但可能更大),然后将其写回到另一个块。虽然原则上你可以写入(但不能覆写) 闪存盘上的较小单元,您只能擦除大块,这是硬件的工作原理。这就是为什么 SSD 在大块连续写入方面表现更好的原因。
答案3
它不会在休眠时转储整个 RAM。
磁盘上已经复制了大部分 RAM。这样不仅可以快速进入休眠状态,还可以快速为新程序提供内存(以便它们可以快速启动)。
因此它仅需写入 4GB 的一小部分,并且可在 10-15 秒内完成。
从微软:
当 RAM 供应不足时(例如,已提交的字节数大于已安装的 RAM),操作系统会尝试通过将未使用的虚拟内存页面复制到页面文件来保留一定比例的已安装 RAM 供立即使用。因此,此计数器不会达到零,并且不一定能很好地指示您的系统是否缺少 RAM。
答案4
这可能是因为 RAM 的输入/输出速度比硬盘快得多,所以 RAM 输出其中的内容的速度与硬盘读取的速度一样快。
复制文件时,还会受到各种因素的限制 - 磁盘速度,如果必须读取和复制同一个磁盘,则需要更长时间,连接速度有限(如果连接到外部驱动器),检查它是否覆盖任何内容等