内存保留和提交
Posted
技术标签:
【中文标题】内存保留和提交【英文标题】:memory reserving and committing 【发布时间】:2011-05-13 18:53:06 【问题描述】:我正在阅读
当一个进程被创建并被赋予时 它的地址空间,大部分 可用的地址空间是空闲的,或者 未分配。要使用这部分 地址空间,你必须分配 通过调用其中的区域 虚拟分配。 分配一个 区域称为保留。
使用地址的保留区域 空间,你必须分配物理 存储,然后将此存储映射到 保留区域。 这个过程是 称为提交物理存储。
在您预订了一个区域后,您 需要将物理存储提交给 在您可以访问之前的区域 其中包含的内存地址。 系统分配物理存储 致力于从 系统的分页文件。
这里有几个问题:
为什么我们在使用内存时需要遵循reserve-commit 范式?即为什么我们需要遵循这种两步范式,而不是直接分配一些物理内存并使用它?
如果提交给区域的物理存储是从系统的页面文件中分配的,为什么我们需要 RAM(听起来很荒谬)?在我看来,地址空间区域应该映射到 RAM(通过分页机制),并且 RAM 页面应该由分页文件支持。
也许这个问题可以通过解释以下2个方面来回答:
保留有什么作用?
提交有什么作用?
更新 - 2010 年 11 月 23 日下午 1 点 2:48
让我不解的是
...最好考虑物理 存储为存储在分页中的数据 磁盘驱动器上的文件。所以当一个 应用程序提交物理存储 到地址空间的一个区域 调用 VirtualAlloc 函数, 空间实际上是从一个 硬盘上的文件。
在您预订了一个区域后,您 需要将物理存储提交给 在您可以访问之前的区域 其中包含的内存地址。 系统从 系统的分页文件。
那么,内存在哪里?如果我将我的机器配置为没有页面文件怎么办?
【问题讨论】:
【参考方案1】:保留页面的全部意义在于确保连续的地址空间可用于某些任务。例如,我们希望堆栈能够增长到 1MB,但我们不想提交所有的内存,因为它实际上还没有被使用。所以我们保留了 1MB 的页面,但提交了少量的页面,比如 64kB。通过在已提交区域的末尾设置保护页,我们可以检测何时需要提交更多内存。
提交内存是将某种存储映射到页面的行为。它可以位于物理 RAM 中,它是工作集的一部分,也可以位于页面文件中。它也可以映射到私有内存中。为了方便,NtAllocateVirtualMemory/VirtualAlloc 可以同时保留和提交。
编辑更新的问题:当您提交页面时,将根据进程页面文件配额/系统范围的承诺限制收费。此限制由可用的物理 RAM 量和页面文件的大小决定。这实际上并不意味着页面存储在页面文件中或写入页面文件。如果内存不足,它们可能会出现,但其他页面大部分都保存在物理内存中。
【讨论】:
【参考方案2】:您实际上不必遵循两阶段的储备/承诺分配方案。
重点是VirtualAlloc
和VirtualFree
可以做几件事。有时这样做真的很有用。但是,您不必这样做。
提交的内存区域是系统为其分配物理存储的区域。
您不必担心它的确切分配位置:RAM 或页面文件。这对您应该是透明的(除非您正在编写内核模式设备驱动程序)。此外,大部分内存页面可以换出到页面文件并按需加载到RAM中。
只是一些已提交的内存页面不需要与页面文件绑定,因为它们已经绑定到另一个物理存储。内存映射文件就是一个例子。
在正常情况下,当您提交内存页面时,使用它一段时间并释放它 - 很可能它根本不会到达页面文件。
【讨论】:
'物理存储'不是页面文件,它是 RAM 或页面文件。让操作系统提交内存区域的唯一方法是读取/写入页面。 内存映射文件也可以是一种物理存储。以上是关于内存保留和提交的主要内容,如果未能解决你的问题,请参考以下文章