直到现在一切都很好但是
Committed Bytes Counter的描述说“提交的内存是在磁盘分页文件上保留空间的物理内存。”
我还读过“通过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
答案 0 :(得分:9)
你误解了windows的内存模型的工作方式。术语和文档混淆了一些无济于事的东西。
当您提交内存时,操作系统会向您提供“承诺”,以提供支持该内存的页面。实际上它不是从物理内存或页面文件中分配一个,它只是检查“uncommited pages”计数器是否大于零然后递减它。如果此操作成功,页面将在页面表中标记为已提交。
接下来会发生什么取决于您是否访问内存。如果你不这样做,你所做的就是阻止其他人使用页面 - 虽然它实际上从未被分配过,所以不可能说你没有使用哪个页面。当您通过生成页面错误触摸内存时。此时,页面错误处理程序看到页面被提交并开始查找可以在内存管理器保留的多个页面列表上使用的页面。如果它找不到,那么它将强制将其他内容输出到页面文件并为您提供该页面。
实际上,在页面错误处理程序分配页面之前,页面永远不会实际分配。文档令人困惑的原因是上面的描述非常复杂。文档必须描述它是如何工作的,而不必详细介绍分页内存管理器如何工作以及描述是否足够好。
答案 1 :(得分:2)
物理内存的每一页都由页面文件(用于内存的易失性页面,如数据)或磁盘文件(用于只读内存页面,如代码和资源)支持。当我说支持时,我指的是当需要页面时,操作系统从磁盘文件读取它的行为/进程,当不再需要它时,操作系统将其释放并刷新内容到磁盘文件。
当您提交虚拟内存块时,虚拟内存管理器(VMM)将为您分配进程的虚拟地址描述符(VAD)树中的条目,并在页面文件中保留空间。只有在访问此块存储器之前,才会分配物理内存。在禁用页面文件的情况下,空间将直接保留在物理内存中。
请参阅以下链接:Managing Virtual Memory和Managing Memory-Mapped Files