内存预留和提交

时间:2010-11-22 11:09:19

标签: windows memory paging

我正在阅读< Windows via C / C ++>这是一些报价。

  

创建并给出流程时   它的地址空间很大   可用的地址空间是免费的,或   未分配。使用部分内容   地址空间,你必须分配   其中的地区通过电话   的VirtualAlloc。 分配的行为   区域称为保留

     

使用保留的地址区域   空间,你必须分配物理   存储然后将此存储映射到   保留区域。 这个过程是   称为提交物理存储

     

保留区域后,您   需要提交物理存储   区域才能访问   其中包含的内存地址。   系统分配物理存储   致力于从一个地区   系统的分页文件。

以下是几个问题:

  • 为什么我们在使用内存时需要遵循reserve-comit范式?即为什么我们需要遵循这个两步范式,而不是直接分配一些物理内存并使用它?

  • 如果从系统的分页文件中分配了提交到某个区域的物理存储,为什么我们需要RAM(听起来很荒谬)?在我看来,地址空间区域应该映射到RAM(通过分页机制),RAM页面应该由分页文件支持。

也许可以通过解释以下两个方面来回答这个问题:

  • 预约会做什么?

  • 提交的内容是什么?

更新 - 1月2日下午2:48

以下来自<的引文Windows via C / C ++ 5th edition>这让我很困惑。

  

......最好考虑身体上的   存储为存储在分页中的数据   磁盘驱动器上的文件。所以当一个   应用程序提交物理存储   到地址空间区域   调用VirtualAlloc函数,   空间实际上是从a分配的   文件在硬盘上

     

保留区域后,您   需要提交物理存储   区域才能访问   其中包含的内存地址。   系统分配从一个区域提交的物理存储   系统的分页文件。

那么,RAM在哪里?如果我将机器配置为没有页面文件怎么办?

2 个答案:

答案 0 :(得分:2)

保留页面的重点是确保连续的地址空间可用于某些任务。例如,我们希望堆栈能够增长到1MB,但我们不想提交所有内存,因为它实际上还没有使用。所以我们保留1MB的页面,但是提交一小部分,比如64kB。通过在已提交区域的末尾设置一个保护页面,我们可以检测何时需要提交更多内存。

提交内存是将某种存储映射到页面的行为。它可以位于物理RAM中,它是工作集的一部分,也可以位于页面文件中。它也可以映射到私有内存中。为方便起见,NtAllocateVirtualMemory / VirtualAlloc可以同时保留和提交。

编辑更新的问题:当您提交页面时,将根据进程页面文件配额/系统范围的承诺限制收取费用。此限制由可用物理RAM量和页面文件大小决定。这实际上并不意味着页面存储在页面文件中或写入页面文件。它们可能是因为内存不足,但其他页面大部分都保存在物理内存中。

答案 1 :(得分:0)

  • 您实际上不必遵循2阶段保留/提交分配方案。

    重点是VirtualAllocVirtualFree 可以做几件事。有时这样做非常有用。但是你不必这样做。

  • 提交的内存区域是系统分配物理存储的区域。

    您不必担心它的确切位置:RAM或页面文件。这对您来说应该是透明的(除非您正在编写内核模式设备驱动程序)。此外,大多数内存页面可以交换到页面文件并按需加载到RAM中。

    只是一些已提交的内存页面不需要与页面文件绑定,因为它们已经绑定到另一个物理存储。内存映射文件就是这样的例子。

    在提交内存页面的正常情况下,使用它一段时间并释放它 - 很可能它根本不会到达页面文件。