如果您打开了许多程序,并且您的计算机的内存/CPU 利用率过高,您可能希望关闭某个程序而不丢失其状态(将其发送到虚拟内存),然后稍后恢复该程序。这是由操作系统自动完成的,但操作系统不知道您想暂停程序多长时间,因此它最终会变得非常慢,因为它试图将每个程序的片段保留在内存中,并将其他片段交换到虚拟内存。手动将整个程序发送到虚拟内存,然后在需要时以相同状态检索它将是一个很好的功能,有没有什么工具可以做到这一点?或者可以编写它吗?
答案1
您的程序始终在虚拟内存中运行。(在您设置页面文件大小的对话框中,Windows 的术语具有极大的误导性。)
您所要求的是强制将程序调出页面的能力。没有办法直接做到这一点。
因此,由于尝试将每个程序的片段保留在内存中并将其他片段交换到虚拟内存,因此最终会变得非常慢。
这种情况不会发生。未被访问的内存页面始终可以释放用于其他用途(并根据需要写入磁盘);无论是否正在访问,操作系统都不会“尝试将每个程序的片段保留在内存中”。如果它们未被访问(通常情况下是空闲程序的私有页面),它们将只留在内存中,直到其他程序的需求造成压力。(在此之前,将它们调出是没有意义的,对吗?)
在 Windows XP 中,最小化应用程序的窗口将强制清除工作集,但我认为 XP 是最后一个实现这一点的版本。
不过,如果您确实想这样做,您可以使用VMmap
SysInternals 的工具。启动时,它会要求您选择一个进程。选择后,选择“查看”|“空工作集”。
但请注意,这只会将页面释放到已修改或备用页面列表。(并且只针对不属于任何其他进程的工作集的页面。)放入已修改列表的页面将写入页面文件,然后移至备用列表。备用列表中的页面被视为“可用”,但在它们被重新用于其他用途之前,它们仍将包含原始进程的内容。
最终结果与 Windows 在可用内存面临压力时采取的措施完全相同 - 您只是在此类需求实际存在之前更快地执行此操作。
完整细节当然可以在内存管理章节中找到Windows 内部原理作者:Solomon、Russinovich 和 Ionescu。