繁体   English   中英

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

[英]Committed memory goes to physical RAM or reserves space in the paging file?

  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

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

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

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

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

物理内存的每一页都由页面文件(用于存储器的易失性页面,如数据)或磁盘文件(用于只读存储器页面,如代码和资源)支持。 当我说支持时 ,我指的是当需要页面时,操作系统从磁盘文件读取它的行为/进程,当不再需要它时,操作系统释放它并将内容刷新到磁盘文件。

提交虚拟内存块时,虚拟内存管理器(VMM)将为进程的虚拟地址描述符(VAD)树中分配一个条目,并在页面文件中保留空间。 只有在访问此块存储器之前,才会分配物理内存。 在禁用页面文件的情况下,空间将直接保留在物理内存中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM