提交的内存进入物理RAM还是在页面文件中保留空间?

Sil*_*Sil 3 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. 我还读过"通过C/C++第5版的Windows",这本书说提交内存意味着在页面文件中保留空间....

最后两种情况对我没有意义......如果你提交内存,这是不是意味着你承诺物理存储(RAM)?当存储器变低时,页面文件用于交换当前未使用的存储器页面.

书中说,当你提交内存时,你实际上在页面文件中保留了空间.如果这是真的,那意味着对于一个已提交的页面,页面文件中保留了空间,而内存中的页面框架是......所以需要两倍的空间?!页面文件的目的不是使总物理内存大于实际值吗?如果我有一个带1G页面文件的1G RAM => 2G可用的"物理内存"(该书也说明了这一点,但在此之后它说明了我在第2点描述的内容).

我错过了什么?谢谢.

编辑:我看到它的方式在这里完美描述:http://support.microsoft.com/kb/555223

"它显示了进程分配了多少字节,操作系统在页面文件中提交了一个RAM页面框架或一个页面槽(可能两者都有)"

但我已阅读,违背我的信念就像那些两个点以上和其他像这样的,例如东西太多了:http://blogs.msdn.com/ricom/archive/2005/08/01/446329.aspx

Ste*_*art 9

你误解了windows的内存模型的工作方式.术语和文档混淆了一些无济于事的东西.

提交内存时,操作系统会向您提供"承诺",以提供支持该内存的页面.实际上它不是从物理内存或页面文件中分配一个,它只是检查"uncommited pages"计数器是否大于零然后递减它.如果此操作成功,页面将在页面表中标记为已提交.

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

因此,当页面错误处理程序分配页面时,实际上页面永远不会被实际分配.文档令人困惑的原因是上面的描述非常复杂.文档必须描述它是如何工作的,而不必详细介绍分页内存管理器如何工作以及描述是否足够好.