Windows 内存映射文件是否保留在物理内存中?

Windows 内存映射文件是否保留在物理内存中?,windows,memory-management,memory-mapped-files,Windows,Memory Management,Memory Mapped Files,我有一个使用大量内存映射文件的进程。 问题是这些文件保存在物理内存中,即使机器内存不足,其他进程也需要这个内存 我尝试使用来限制进程工作集,但没有帮助,进程的工作集一直在超过最大值 是否有更好的方法限制流程的工作集? 我可以更改Windows分页内存映射文件的启发式吗?我认为这种行为是由于MMF(内存映射文件)的工作方式造成的。看看博客文章。它解释了MMF文件跳过Windows分页过程,因此页文件不支持MMF文件。取而代之的是,MMF本身就成为了数据备份,这意味着,它最终会占用更多的RAM,因为

我有一个使用大量内存映射文件的进程。
问题是这些文件保存在物理内存中,即使机器内存不足,其他进程也需要这个内存

我尝试使用来限制进程工作集,但没有帮助,进程的工作集一直在超过最大值

是否有更好的方法限制流程的工作集?

我可以更改Windows分页内存映射文件的启发式吗?

我认为这种行为是由于MMF(内存映射文件)的工作方式造成的。看看博客文章。它解释了MMF文件跳过Windows分页过程,因此页文件不支持MMF文件。取而代之的是,MMF本身就成为了数据备份,这意味着,它最终会占用更多的RAM,因为它不会被分页(呃,我不确定我自己是否得到了这一点-最好阅读博客!)


内存映射文件的MSDN文档和另一个与MMF相关的SO问题。

如果您发现您的内存映射文件进程保留了很多页面,那么这意味着操作系统不需要放弃任何内存映射区域来提供给其他进程。那么,您如何知道其他进程实际需要当前用于映射文件的内存呢?仅仅因为操作系统的物理内存不足就没有任何意义。其他进程需要内存,以使操作系统删除映射的页面并为它们提供RAM


因此,您的mmap-I/O进程似乎正在耗尽另一个使用RAM频率较低的进程。一种方法是在内存不足的进程中明智地锁定内存。查看win32的VirtualLock。

检查我的答案;使用VirtualUnlock()可以手动取消提交部分MMF;e、 例如,你认为你不会很快再次访问的部分。

最终使用了暴力虚拟锁

PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
{
        if (pmc.WorkingSetSize > MaxWorkingSetSize)
        {
                VirtualUnlock(FilePtr.pData, MaxWorkingSetSize);
                UnmapViewOfFile(FilePtr.pData);
                CloseHandle(FilePtr.hFileMap);
                CloseHandle(FilePtr.hFile);
        }
}

我知道这一点,因为我也拥有另一个进程,我看到它有很多页面错误,并且没有使用所需的内存。但是性能会受到什么影响呢?当操作系统不必将脏页提交到磁盘时,页面错误可能非常便宜。如果您的其他进程使用的内存比您想象的要少,那么显然它实际上并不需要。我应该提到的是,(其他进程的)性能要慢几个数量级。好的,您的I/O访问模式导致虚拟内存管理器耗尽您的其他进程。答案已编辑。在我启动另一个进程之前,mmf进程已经有几分钟没有访问其内存了,这可能仍然是一个饥饿场景吗?MSDN文章清楚地显示mmf API在VMM之上,因此它应该能够分页到磁盘并清除未使用的页。有趣。出于好奇,您在哪里执行此代码?在每次访问映射文件时。