【问题标题】:Committed memory goes to physical RAM or reserves space in the paging file?提交的内存进入物理 RAM 还是在页面文件中保留空间?
【发布时间】:2011-02-19 22:19:12
【问题描述】:
  1. 当我使用 MEM_COMMIT 执行 VirtualAlloc 时,此“在内存中或磁盘上的页面文件中为指定的保留内存页分配物理存储”(引用自 MSDN 文章 http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx)。

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

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

  2. 我还阅读了“Windows via C/C++ 5th edition”,这本书说提交内存意味着在页面文件中保留空间....

最后两种情况对我来说没有意义...如果您提交内存,这是否意味着您提交物理存储 (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 memory-management


    【解决方案1】:

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

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

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

    所以实际上一个页面永远不会真正分配,直到你需要它,当它被页面错误处理程序分配时。文档令人困惑的原因是上述描述非常复杂。文档必须描述它是如何工作的,而无需深入了解分页内存管理器如何工作的血腥细节,并且描述已经足够好了。

    【讨论】:

    • 我了解 Windows 内存架构,我同意你所说的......但这并不能回答我的问题。我没有清楚地说明我的问题,所以我将改写:其中哪一个是正确的:“提交的内存是由物理 RAM 或页面文件支持的内存”或“提交的内存是由页面文件支持的内存”,因为我可以似乎没有使它们兼容但我一直在到处寻找一种或另一种说法。根据我的理解和您的回答,第二个陈述是错误的。我说的对吗?
    • 我明白了——很遗憾,我找不到答案。我可以找到表明当所有页面文件都 100% 提交时操作系统进入“恐慌”模式的参考资料。大概的想法是,您不能提交比页面文件更多的内容,因为如果您这样做了,那么当您需要内存时,您会将内存中的页面分页到哪里。
    • 但是操作系统可以在没有分页文件或非常小的分页文件的情况下运行。按照您的推理,这意味着无法提交内存 => 没有应用程序能够运行。
    • 是的。我怀疑真正的答案只有编写内存管理器的人知道。这两个极端都没有意义,因此提交限制必须在中间的某个地方。中间的某个地方会与它没有记录在案,因为这将允许它被更改。
    【解决方案2】:

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

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

    请参考以下链接:Managing Virtual MemoryManaging Memory-Mapped Files

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 2014-03-04
      • 2016-04-20
      • 2018-08-29
      • 2013-02-22
      • 1970-01-01
      • 2013-08-23
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多