【问题标题】:memory reserving and committing内存保留和提交
【发布时间】:2011-05-13 18:53:06
【问题描述】:

我正在阅读,这里有一些引用。

当一个进程被创建并被赋予时 它的地址空间,大部分 可用的地址空间是空闲的,或者 未分配。要使用这部分 地址空间,你必须分配 通过调用其中的区域 虚拟分配。 分配一个 区域称为保留

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

在您预订了一个区域后,您 需要将物理存储提交给 在您可以访问之前的区域 其中包含的内存地址。 系统分配物理存储 致力于从 系统的分页文件。

这里有几个问题:

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

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

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

  • 保留有什么作用?

  • 提交有什么作用?

更新 - 2010 年 11 月 23 日下午 1 点 2:48

让我不解的是的下面这段引文。

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

在您预订了一个区域后,您 需要将物理存储提交给 在您可以访问之前的区域 其中包含的内存地址。 系统从 系统的分页文件。

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

【问题讨论】:

    标签: windows memory paging


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:
      • 您实际上不必遵循两阶段的储备/承诺分配方案。

        重点是VirtualAllocVirtualFree可以做几件事。有时这样做真的很有用。但是,您不必这样做。

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

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

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

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

      【讨论】:

      • '物理存储'不是页面文件,它是 RAM 页面文件。让操作系统提交内存区域的唯一方法是读取/写入页面。
      • 内存映射文件也可以是一种物理存储。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2016-04-30
      • 2012-11-16
      • 2016-09-19
      • 2019-03-13
      相关资源
      最近更新 更多