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

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

到现在为止都很好但是:

  1. 提交字节计数器的描述表明:“提交的内存是在磁盘分页文件上保留了空间的物理内存”。

  2. 我也读“通过C / C + +第五版Windows”,这本书说,提交内存意味着保留页面文件的空间….

最后两种情况对我来说是没有意义的…如果提交内存,这是不是意味着你承诺物理存储(RAM)? 页面文件在那里用于换出当前未使用的内存页面,以防内存变低。

这本书说,当你提交内存时,你实际上在分页文件中保留了空间。 如果这是真的,那么这意味着对于一个提交的页面,在页面文件中有空间保留,在内存中有一个页面框架…因此需要两倍的空间! 是不是页面文件的目的是使整个物理内存大于实际? 如果我有一个1G页面文件=> 2G的可用“物理内存”的1G内存(本书也说明了这一点,但之后说明了我在第二点描述的内容)。

我错过了什么? 谢谢。

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

“它显示进程已经分配了多less字节,并且操作系统已经在页面文件中提交了RAM页面页面或页面插槽(可能两者都是)”

但是我已经阅读了太多与我的信念相矛盾的东西,比如上面的这两个点,以及其他类似的例子: http : //blogs.msdn.com/ricom/archive/2005/08/01/446329.aspx

你误解了Windows内存模型的工作方式。 术语和文档混淆了一些东西,这没有帮助。

当你提交内存时,操作系统为你提供一个“承诺”来提供一个页面来回存储内存。 它实际上并不是从物理内存或页面文件中分配一个,而是简单地检查“uncommited pages”计数器是否大于零,然后递减计数。 如果成功,页面被标记为已提交到您的页面表中。

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

所以实际上,一个页面直到需要时才会被实际分配,当它由页面错误处理程序分配时。 文档混淆的原因是上面的描述相当复杂。 文档必须描述它是如何工作的,而不必深入分页内存管理器的工作原理和描述是否足够。

物理内存的每个页面都由页面文件(对于易失性页面的内存(例如数据)或磁盘文件(对于只读内存页面,如代码和资源))支持。 当我说支持时 ,我的意思是当需要页面时,操作系统从磁盘文件中读取它,当不再需要时,操作系统释放它并将内容刷新到磁盘文件。

当您提交虚拟内存块时,虚拟内存管理器(VMM)将为您分配进程的虚拟地址描述符(VAD)树中的条目,并在分页文件中保留空间。 物理内存将被分配,直到访问该块内存。 在页面文件被禁用的情况下,空间将被直接保留在物理内存中。

请参考以下链接: 管理虚拟内存和管理内存映射文件