虽然这里和其他地方已经讨论过类似的问题,但我找不到解决以下问题的方法。在Windows 7 Professional(64位)下,我正在开发一个临时需要比可用物理内存多得多的虚拟内存的应用程序。为了模拟这个,我写了一个小程序基本上这样做:
size_t sum = 0;
std::unique_ptr<unsigned char[]> data(new unsigned char[size]);
for(size_t i = 0; i < size; ++i)
data[i] = static_cast<unsigned char>(i);
for(size_t i = 0; i < size; ++i)
sum += data[i];
在任务管理器中可以观察到,在第一个循环期间(当“new”实际保留的内存实际上被提交时),内存使用量会迅速增加。一旦内存曲线达到物理内存限制,系统就会变得无法使用(甚至鼠标光标也不再移动)。
问题是如何防止进程占用所有物理内存,以便其他进程可以使用足够的内存来保持响应。我认为带有QUOTA_LIMITS_HARDWS_MAX_ENABLE标志的SetProcessWorkingSetSizeEx()可以解决这个问题,但事实并非如此。虽然根据资源监视器,进程的工作集大小仍然低于限制,但任务管理器中的内存使用曲线与没有SetProcessWorkingSetSizeEx()的情况相同,并且当物理内存耗尽时系统无响应。
我不介意过程本身由于页面错误而执行的效果不是最佳,但它不应该影响整个系统。你知道如何实现这个目标吗?