cod*_*der 66 memory windows hibernate
我正在阅读一篇解释 Microsoft Windows 中的休眠程序的文章。我从中得出的主要观点是
hiberfil.sys
文件中。我的问题是,当我通常复制大小为 1 GB 的文件时,大约需要2 分钟才能完成。
但是,当 Windows 正在写入休眠文件时(在休眠过程中),整个过程可能需要 10-15 秒。 为什么写入速度会有如此大的差异?
我的 RAM 大小是 4 GB。(我不是在谈论快速启动技术。)
基准:
Mok*_*bai 46
这可能是一个三重的答案。
可能在这里起作用的一件事是 Windows 中新的混合关机,它有效地关闭了您的应用程序,将您注销,然后继续休眠操作系统的核心。已经保存了这些数据意味着它不需要潜在地“重新休眠”它。
第二件事是休眠不需要保存已调出到交换文件或未使用的内存页面(这将是积极填充交换文件并将数据保留在内存中的一个原因) .
第三是休眠文件数据也被压缩。结合我的第二点,如果您只有一小部分数据要导出,其中包含高度可压缩的数据(可执行文件通常可以很好地压缩),那么输出到休眠文件的数据量可能比工作集小得多数据的。请注意,如评论中所述,文件缓存和其他不必要的缓冲区数据可以很容易地被丢弃而不会产生不良影响,以减少要转储到休眠文件中的数据量。
此外,当前的硬盘驱动器速度非常快。使用具有 100 MB/s 数量级持续写入的磁盘,您将能够在一分钟内写出(未压缩)4 GB 的 RAM。由于休眠可以作为挂起所有用户进程之后和挂起 CPU 之前的最后一件事来完成,因此操作系统通常具有磁盘的完整写入速度。这是您的简单基准测试所没有的一件事,从磁盘复制到磁盘可能比简单地将 RAM 写入磁盘要慢。
结合这些内容,写入休眠文件的数据量可能非常小,可能只有 1 GB 的数量级,并且可能会在 10 秒内写入一个大的连续块。
Dam*_*mon 32
首先,需要节省的 RAM 量非常小。事实上,只需要刷新映射的脏页集(“延迟回写”),以及所有已写入和重定位的可执行代码的私有页面都需要写入。
其次,与复制文件相反,从驱动器的角度来看,转储需要保存到磁盘的一组 RAM 页面是单个连续的连续写入。Win32 API 甚至为此操作公开了一个用户级函数。Gather write 由硬件直接支持,其工作速度与磁盘物理上能够接受数据的速度一样快(控制器将通过 DMA 直接拉取数据)。
这有很多前提条件(例如对齐、块大小、固定),并且它不能很好地与缓存一起使用,并且没有“懒惰回写”之类的东西(这是正常操作下非常理想的优化)。
这就是为什么不是每次写一直这样工作。然而,当系统保存休眠文件时,所有先决条件都会自动满足(所有数据都是页面对齐、页面大小和固定的)并且缓存变得无关紧要,因为计算机马上就要关闭了。
第三,单次连续写入对于旋转磁盘和固态磁盘都非常有利。
交换文件和休眠文件通常是磁盘上最早创建和保留的一些文件。它们通常有一个,最多两个片段。因此,除非扇区损坏并且磁盘必须重新分配物理扇区,否则逻辑顺序写入将转换为旋转磁盘上的物理顺序写入。
当写入大量连续的连续数据时,不需要对磁盘进行读-修改-写操作。这个问题在可以写入非常小的单个扇区的旋转硬盘上不太明显(如果您不写入单个字节,缓存通常会阻止,则设备不需要获取原始内容并写回修改后的版本。) .
然而,这在 SSD 上非常明显,其中每次写入意味着例如 512kB 块(这是一个通常的数字,但它可能更大)必须由控制器读取和修改,然后写回不同的堵塞。虽然您原则上可以写入(但不能覆盖) 闪存盘上的较小单元,您只能擦除大块,这就是硬件的工作原理。这就是 SSD 在大量顺序写入时表现如此出色的原因。
这可能是因为RAM的输入/输出速度比硬盘快得多,因此RAM可以像硬盘读取数据一样快地输出其中的内容。
复制文件时,您还受到各种因素的限制 - 磁盘的速度,如果必须在同一磁盘上读入和读出,则需要更长的时间,连接的速度有限(如果是外部驱动器),请检查它没有覆盖任何东西等
归档时间: |
|
查看次数: |
14373 次 |
最近记录: |