当我的程序使用Swapfile时,Windows会停止

时间:2009-02-27 07:26:31

标签: windows memory swapfile

我正在以正常优先级运行用户模式程序。我的程序正在搜索NP问题,结果耗尽了大量内存,最终会在交换文件中结束。

然后我的鼠标冻结了,任务管理员需要永远打开并让我结束这个过程。

我想知道的是,即使我的2个内核中只有1个被使用,我仍然可以阻止我的Windows操作系统完全锁定。

编辑: 谢谢你的回复。

我知道让它使用更少的内存会有所帮助,但对我来说整个操作系统应该锁定是没有意义的。

4 个答案:

答案 0 :(得分:2)

显而易见的答案是“少用内存”。当你的应用程序耗尽所有 可用内存,操作系统必须将任务管理器(等)分页,以便为您的应用腾出空间。当您切换程序时,操作系统必须重新登录其他程序(因为它们是必需的)。 磁盘读取比内存读取慢,所以一切似乎都是 走得慢。

如果您想避免这种情况,请让您的应用管理自己的内存,或者 使用比蛮力更好的算法。 (有遗传 算法,模拟退火等)

答案 1 :(得分:1)

除了“重新构建你的应用程序以减少内存使用”之外,我认为这个问题没有编程答案。交换文件问题很可能是由于访问磁盘的瓶颈,特别是如果您使用的是IDE HDD或高度分散的交换文件。

答案 2 :(得分:1)

问题是当另一个程序(例如explorer.exe)要执行时,它的所有代码和内存都已被换出。为了给其他程序腾出空间,Windows必须首先将程序正在使用的数据写入磁盘,然后加载其他程序的内存。在另一个程序中执行的每个新代码页都需要磁盘访问,导致它运行缓慢。

我不知道您的程序的访问模式,但我猜它以随机的方式触及所有内存页面,这使得问题变得更糟,因为只要Windows从您的内存页面中删除程序,突然你再次需要它,Windows必须找到一些其他页面给予相同的处理。

要为其他进程提供更多RAM,您可以使用SetProcessWorkingSetSize来减少程序可能使用的最大RAM量。当然,这会使你的程序运行得更慢,因为它必须进行更多的交换。

您可以尝试的另一种方法是向系统添加更多驱动器,并将交换文件分发给这些驱动器。您可能拥有双核CPU,但只有一个驱动器。将交换文件分布在多个驱动器上允许Windows在它们之间平衡工作(尽管我没有第一手经验告诉它有多好)。

答案 3 :(得分:1)

这有点极端,但你总是可以最小化你的交换文件,这样你就不会有所有磁盘崩溃,并且你的程序不允许分配很多虚拟内存。在控制面板/高级/高级选项卡/ Perfromance /虚拟内存下,将页面文件设置为自定义大小,并输入值2mb(XP上允许的最小值)。当分配失败时,您应该获得异常并且能够正常退出。它并没有完全解决你的问题,只是加快了速度;)

另一件值得考虑的事情是,如果你是在32位平台上,移植到64位系统并获得一个具有更多可寻址RAM的盒子。