windows - 提交的内存转到物理 RAM 还是在页面文件中保留空间?

标签 windows memory-management

  1. 当我使用 MEM_COMMIT 执行 VirtualAlloc 时,“为指定的保留内存页在内存或磁盘上的分页文件中分配物理存储”(引自 MSDN 文章 http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx)。

到目前为止一切都很好但是:

  1. Committed Bytes Counter 的描述说“Committed memory 是在磁盘分页文件上保留空间的物理内存。”

  2. 我还看了《Windows via C/C++ 5th edition》这本书说commit memory means reserving space in the page file....

最后两种情况对我来说没有意义...如果您提交内存,是否意味着您提交物理存储 (RAM)?页面文件用于在内存不足的情况下换出当前未使用的内存页面。

书上说,当您提交内存时,实际上是在分页文件中保留了空间。如果这是真的,那将意味着对于已提交的页面,页面文件中保留了空间,而内存中的物理页面框架保留了空间……所以需要两倍的空间?!页面文件的目的不是使总物理内存大于实际内存吗?如果我有 1G RAM 和 1G 页面文件 => 2G 可用“物理内存”(书中也说明了这一点,但紧接着它说明了我在第 2 点所描述的内容)。

我错过了什么?谢谢。

编辑:我的看法在这里得到了完美的描述:http://support.microsoft.com/kb/555223

“它显示进程分配了多少字节以及操作系统已向其提交 RAM 页框或页面文件中的页槽(可能两者都有)”

但我读过太多与我的信念相矛盾的东西,例如上面的两点和其他类似的东西,例如:http://blogs.msdn.com/ricom/archive/2005/08/01/446329.aspx

最佳答案

您误解了 Windows 内存模型的工作方式。术语和文档有点混淆,这无济于事。

当您提交内存时,操作系统会向您提供一个“ promise ”以提供一个页面来支持该内存。它实际上并没有从物理内存或页面文件中分配一个,它只是检查“未提交页面”计数器是否大于零,然后递减它。如果成功,该页面将在您的页表中标记为已提交。

接下来会发生什么取决于您是否访问内存。如果你不这样做,你所做的就是阻止其他人使用一个页面——尽管它从未真正被分配过,所以不可能说出你没有使用哪个页面。当您触摸内存时,虽然会生成页面错误。此时页面错误处理程序看到页面已提交并开始寻找可以在内存管理器保留的许多页面列表上使用的页面。如果它找不到一个,那么它会强制将其他内容输出到页面文件并为您提供该页面。

因此,真正的页面永远不会真正分配,直到您需要它,当它由页面错误处理程序分配时。文档令人困惑的原因是上面的描述相当复杂。文档必须描述它是如何工作的,而无需深入了解分页内存管理器如何工作的血淋淋的细节,并且描述足够好。

关于windows - 提交的内存转到物理 RAM 还是在页面文件中保留空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2841087/

相关文章:

c - Linux内核修改指针值

c++ - 重载中的析构函数出现问题 = STATUS_ACCESS_VIOLATION

linux - 内存泄漏会导致我的进程被杀死吗?

ios - 非平凡循环中的 block

c++ - calloc vs new 用于各种编译器中的复杂结构

c - 奇怪的LNK2001 : unresolved external symbol

python - 在 Python 循环中重复超时或用户输入

c# - 如何创建超过 MAX_PATH 的目录

c++ - CreateProcessAsUser 生成错误 5

windows - Delphi 中的这些 Windows API 签名有什么区别?