首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存映射文件是否保留在物理内存中?

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

Stack Overflow用户
提问于 2009-10-25 18:20:47
回答 4查看 3.5K关注 0票数 5

我有一个使用大量内存映射文件的进程。

问题是这些文件保存在物理内存中,即使计算机内存不足,其他进程也需要此内存。

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

有没有更好的方法来限制进程的工作集?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-15 14:01:46

最终使用了蛮力VirtualUnlock。

代码语言:javascript
复制
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);
        }
}
票数 3
EN

Stack Overflow用户

发布于 2009-10-25 22:17:37

如果您发现包含内存映射文件的进程保留了大量这样的页面,那么这意味着操作系统不需要丢弃任何内存映射区域来提供给其他进程。那么,您如何知道其他进程实际上需要当前用于映射文件的内存呢?仅仅因为操作系统的物理RAM很低并不意味着什么。其他进程必须要求内存才能使操作系统丢弃映射的页面并将RAM提供给它们。

因此,您的mmap-I/O进程似乎正在使使用RAM频率较低的其他进程处于饥饿状态。一种方法是明智地在正处于饥饿状态的进程中锁定内存。看看适用于win32的VirtualLock。

票数 2
EN

Stack Overflow用户

发布于 2009-10-25 20:19:07

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

Here's内存映射文件的MSDN文档,here's另一个与MMF相关的SO问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1620536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档