我正在以正常优先级运行用户模式程序。我的程序正在搜索一个 NP 问题,结果占用了大量内存,最终出现在交换文件中。
然后我的鼠标冻结了,任务管理器需要很长时间才能打开并让我结束进程。
我想知道的是,即使我的 2 个内核中只有 1 个被使用,我如何才能阻止我的 Windows 操作系统完全锁定。
编辑:感谢您的回复。
我知道让它使用更少的内存会有所帮助,但对我来说整个操作系统应该锁定是没有意义的。
显而易见的答案是“使用更少的内存”。当您的应用程序用完所有可用内存时,操作系统必须调出任务管理器(等)以为您的应用程序腾出空间。当您切换程序时,操作系统必须将其他程序重新分页(根据需要)。磁盘读取比内存读取慢,所以一切似乎都变慢了。
如果您想避免这种情况,请让您的应用程序管理自己的内存,或者使用比蛮力更好的算法。(有遗传算法、模拟退火等)
除了“重组你的应用程序以使用更少的内存”之外,我认为这个问题没有编程答案。交换文件问题很可能是由于访问磁盘的瓶颈,特别是如果您使用的是 IDE HDD 或高度碎片化的交换文件。
问题是当另一个程序(例如 explorer.exe)要执行时,它的所有代码和内存都被换掉了。为了给其他程序腾出空间,Windows 必须首先将程序正在使用的数据写入磁盘,然后加载其他程序的内存。在其他程序中执行的每一页新代码都需要访问磁盘,导致它运行缓慢。
我不知道您的程序的访问模式,但我猜它会以随机方式大量接触其所有内存页面,这使问题变得更糟,因为一旦 Windows 从您的程序中逐出内存页面,突然您再次需要它,Windows 必须找到其他页面来进行相同的处理。
要为其他进程提供更多 RAM,可以使用SetProcessWorkingSetSize来减少程序可能使用的最大 RAM 量。当然这会使你的程序运行得更慢,因为它必须做更多的交换。
您可以尝试的另一种选择是向系统添加更多驱动器,并将交换文件分布在这些驱动器上。您可能有一个双核 CPU,但您只有一个驱动器。将交换文件分布在多个驱动器上可以让 Windows 平衡它们之间的工作(尽管我没有亲身体验它的性能如何)。
这有点极端,但你总是可以最小化你的交换文件,这样你就没有所有的磁盘 thashing,并且你的程序不允许分配太多的虚拟内存。在控制面板/高级/高级选项卡/性能/虚拟内存下,将页面文件设置为自定义大小并输入值 2mb(XP 上允许的最小值)。当分配失败时,您应该得到一个异常并能够优雅地退出。它并不能完全解决您的问题,只是加快速度;)
另一件值得考虑的事情是,如果您在 32 位平台上,移植到 64 位系统并获得一个具有更多可寻址 RAM 的盒子。