我的问题是关于计算机操作系统的理论,特别是有关休眠的问题。
据我所知,休眠(ACPI 状态 S5,对吗?)涉及在 OS 重新启动时将恢复 RAM 所需的所有数据写入硬盘。好的,这听起来不错。
但是,我记得以前上操作系统课的时候,老师讲解过操作系统之间内存管理的差异。Windows 和 Linux 内核都使用虚拟内存:所有页面都初始化为交换页面,然后在需要时加载到 RAM 中所以他们可以随时被重新安置。
我还知道,内存页面不会立即刷新到交换区,而是会在内存中保留一段时间,或者当需要从交换区加载页面并且所有内存页面都肮脏的
我的问题是:为什么 Windows 需要存储一个单独的hiberfil.sys
文件,里面转储所有 RAM,因为所有页面应该已经存在于交换文件中(休眠仅仅意味着刷新缓存并停止计算机)并且在长时间不活动后几乎全部清除?
同样,为什么 Linux 明确表示正在将页面复制到交换分区?当我只是暂停系统时,它需要几秒钟的连续磁盘访问才能停止(可能是内核刷新缓存),但是当我想休眠时,它需要与恢复相同的时间。
我是否遗漏了有关内核的某些信息?
答案1
您所描述的部分内容听起来不像虚拟内存,而更像是磁盘缓存,操作系统会将读取自磁盘的数据的副本保存在内存中,以防应用程序想要再次读取这些数据。在这种情况下,它还可能延迟将“脏”页面写回磁盘,以便通过一次性写入大量页面来提高效率。
虚拟内存则相反——数据首先写入 RAM,只有当内核需要释放 RAM 用于其他用途时,才写入交换文件。(并非每个内存位都必须在交换文件中有相应的空间;否则,您就不能拥有比 RAM 大小更小的交换文件。)传统思维认为这就是需要的方式;如果不需要,则一直将 RAM 复制到磁盘会花费太多。想想当您运行大量占用大量内存的程序时,您的计算机运行速度有多慢,它必须开始占用交换空间。
尽管如此,有些实验性研究操作系统的工作方式更像您所描述的,它们有一些复杂的规则,用于定期将内存复制回磁盘,结果是不需要休眠 - 您可以拔掉计算机的电源插头,但可能会损失 30 秒的工作时间。查看郊狼操作系统,卡普罗西, 或者爱神如果你对理论感兴趣的话。我不知道它们的性能如何,也不知道这种策略可能存在哪些其他缺点,但是当你考虑到与视频卡或其他设备共享内存等疯狂因素时,我想很难让它在所有情况下都正常工作。据我所知,没有一个生产操作系统会做这种事情。
答案2
这里的误解是并非所有 RAM 内容都可以交换到磁盘。
用户进程有专用的交换空间,但系统没有。这是因为系统的许多部分永远不会被换出,而换出的部分只是从内存中擦除,因为不再需要(不是书面系统在这种情况下包括内核和驱动程序以及用于控制进程的所有数据(例如虚拟内存段表)。
休眠文件中写入了复制所需的所有数据系统状态。这远远不及 RAM 的大小,因为只写出占用的内存。
保存和恢复所花的时间大致相同,因为需要读取的数据与写出的数据相同。在读取速度远快于写入速度的磁盘(如 SSD)上,恢复速度会快得多。
答案3
您的页面文件可能比 RAM 更小、更大或相同大小。有些人甚至(错误地)将其关闭。因此,微软决定创建一个单独的文件,该文件保证与 RAM 大小相同,并且可以分别在启动和休眠时读取和写入。至于 Linux,我认为逻辑相同。
编辑:
正如 harrymc 在他的回答中指出的那样,这是为了维持系统状态。