首先,需要节省的RAM数量非常少。实际上,仅需要清除一组映射的脏页(“惰性写回”),并且还需要写入已写入并重定位了可执行代码的所有私有页。
- 可执行文件的.text段始终由文件映射支持。至少对于某些 DLL 也是如此(但并非全部,这取决于是否需要重定位)。
- 类似地,由文件映射支持的内存也可以被丢弃(假定它不是CoW或RW 且脏了)。
- 仍然需要进行延迟写回,但是除此之外,可以丢弃缓存。
- 已分配但未写入的内存(通常是应用程序数据的绝大部分!)由零页支持,可以丢弃。
- 那是对内存页面的更大一部分“待机”状态(在Windows上实际每进程驻留工作集是惊人地小,区区16MB)将已在某些时候被复制到页面文件在后台可以被丢弃。
- 某些设备(例如图形卡)映射的内存区域可能(不需要)保存。用户有时会惊讶地发现他们将8GiB或16GiB插入计算机,而1GiB或2GiB只是“消失”,没有明显的原因。主要的图形API要求应用程序能够“在某些情况下”使缓冲区内容变为无效(而不能确切说明其含义)。因此,可以预料图形驱动器固定的内存也将被丢弃。毕竟,屏幕还是会变黑。
其次,与复制文件相反,从驱动器的角度来看,转储需要保存磁盘的RAM页面集是一次连续的连续写入。Win32 API甚至为此操作公开了一个用户级功能。硬件直接支持聚集写入,并且其工作速度与磁盘在物理上能够接收数据的速度一样快(控制器将直接通过DMA提取数据)。
这项工作需要满足许多先决条件(例如对齐,块大小,固定),并且不能很好地与缓存一起使用,也没有“延迟写回”之类的东西(在正常操作下这是非常理想的优化) )。
这就是为什么不是每个写的原因一直这样工作。但是,当系统保存休眠文件时,将自动满足所有前提条件(所有数据都是页面对齐的,页面大小且固定的),并且缓存已变得无关紧要,因为即将关闭计算机。
第三,对于旋转磁盘和固态磁盘而言,执行一次连续写入都是非常有利的。
交换文件和休眠文件通常是在磁盘上创建和保留的最早的文件。它们通常有一个,最多两个碎片。因此,除非扇区损坏并且磁盘必须重新分配物理扇区,否则逻辑顺序写入将转换为旋转磁盘上的物理顺序写入。
当写入大量连续的连续数据时,磁盘上无需进行读-修改-写操作。在可以写入非常小的单个扇区的旋转硬盘上,此问题不太明显(假设您不写入单个字节,这通常可以防止缓存,设备不需要获取原始内容并写回修改后的版本。) 。
但是,这在SSD上非常明显,因为每次写入都意味着控制器必须读取和修改例如512kB块(这是一个通常的数字,但是可能更大),然后再写回另一个块。虽然您原则上可以写入(但不能覆盖))闪存盘中较小的单元,则只能擦除巨大的块,这就是硬件的工作方式。这就是为什么SSD在进行大量顺序写入时性能要好得多的原因。