我正在阅读< Windows via C / C ++>这是一些报价。
创建并给出流程时 它的地址空间很大 可用的地址空间是免费的,或 未分配。使用部分内容 地址空间,你必须分配 其中的地区通过电话 的VirtualAlloc。 分配的行为 区域称为保留。
使用保留的地址区域 空间,你必须分配物理 存储然后将此存储映射到 保留区域。 这个过程是 称为提交物理存储。
保留区域后,您 需要提交物理存储 区域才能访问 其中包含的内存地址。 系统分配物理存储 致力于从一个地区 系统的分页文件。
以下是几个问题:
为什么我们在使用内存时需要遵循reserve-comit范式?即为什么我们需要遵循这个两步范式,而不是直接分配一些物理内存并使用它?
如果从系统的分页文件中分配了提交到某个区域的物理存储,为什么我们需要RAM(听起来很荒谬)?在我看来,地址空间区域应该映射到RAM(通过分页机制),RAM页面应该由分页文件支持。
也许可以通过解释以下两个方面来回答这个问题:
预约会做什么?
提交的内容是什么?
以下来自<的引文Windows via C / C ++ 5th edition>这让我很困惑。
......最好考虑身体上的 存储为存储在分页中的数据 磁盘驱动器上的文件。所以当一个 应用程序提交物理存储 到地址空间区域 调用VirtualAlloc函数, 空间实际上是从a分配的 文件在硬盘上。
保留区域后,您 需要提交物理存储 区域才能访问 其中包含的内存地址。 系统分配从一个区域提交的物理存储 系统的分页文件。
那么,RAM在哪里?如果我将机器配置为没有页面文件怎么办?
答案 0 :(得分:2)
保留页面的重点是确保连续的地址空间可用于某些任务。例如,我们希望堆栈能够增长到1MB,但我们不想提交所有内存,因为它实际上还没有使用。所以我们保留1MB的页面,但是提交一小部分,比如64kB。通过在已提交区域的末尾设置一个保护页面,我们可以检测何时需要提交更多内存。
提交内存是将某种存储映射到页面的行为。它可以位于物理RAM中,它是工作集的一部分,也可以位于页面文件中。它也可以映射到私有内存中。为方便起见,NtAllocateVirtualMemory / VirtualAlloc可以同时保留和提交。
编辑更新的问题:当您提交页面时,将根据进程页面文件配额/系统范围的承诺限制收取费用。此限制由可用物理RAM量和页面文件大小决定。这实际上并不意味着页面存储在页面文件中或写入页面文件。它们可能是因为内存不足,但其他页面大部分都保存在物理内存中。
答案 1 :(得分:0)
您实际上不必遵循2阶段保留/提交分配方案。
重点是VirtualAlloc
和VirtualFree
可以做几件事。有时这样做非常有用。但是你不必这样做。
提交的内存区域是系统分配物理存储的区域。
您不必担心它的确切位置:RAM或页面文件。这对您来说应该是透明的(除非您正在编写内核模式设备驱动程序)。此外,大多数内存页面可以交换到页面文件并按需加载到RAM中。
只是一些已提交的内存页面不需要与页面文件绑定,因为它们已经绑定到另一个物理存储。内存映射文件就是这样的例子。
在提交内存页面的正常情况下,使用它一段时间并释放它 - 很可能它根本不会到达页面文件。