smw*_*dia 10 memory windows paging
我正在阅读<Windows via C/C++>,这里有一些引用.
创建进程并为其提供地址空间时,此可用地址空间的大部分是空闲的或未分配的.要使用此地址空间的一部分,必须通过调用VirtualAlloc在其中分配区域.分配区域的行为称为保留.
要使用保留的地址空间区域,必须分配物理存储,然后将此存储映射到保留区域.此过程称为提交物理存储.
保留区域后,需要先将物理存储提交到该区域,然后才能访问其中包含的内存地址. 系统从系统的页面文件中分配提交到区域的物理存储.
以下是几个问题:
为什么在使用内存时我们需要遵循reserve-comit范式?即为什么我们需要遵循这个两步范式,而不是直接分配一些物理内存并使用它?
如果从系统的分页文件中分配了提交到某个区域的物理存储,为什么我们需要RAM(听起来很荒谬)?在我看来,地址空间区域应该映射到RAM(通过分页机制),RAM页面应该由分页文件支持.
也许这个问题可以通过解释以下两个方面来回答:
保留做什么?
承诺做什么?
以下来自<Windows via C/C++ 5th edition>的引文让我感到困惑.
...最好将物理存储视为存储在磁盘驱动器上的页面文件中的数据.因此,当应用程序通过调用VirtualAlloc函数将物理存储提交到地址空间区域时, 实际上会从硬盘上的文件分配空间.
保留区域后,需要先将物理存储提交到该区域,然后才能访问其中包含的内存地址. 系统从系统的页面文件中分配提交到区域的物理存储.
那么,RAM在哪里?如果我将机器配置为没有页面文件怎么办?
您实际上不必遵循两阶段保留/提交分配方案。
重点是,VirtualAlloc并且VirtualFree 可以做几件事。有时这样做确实很有用。但你不必这样做。
提交的内存区域是系统为其分配物理存储的区域。
您不必担心它的具体分配位置:RAM 或页面文件。这对您来说应该是透明的(除非您正在编写内核模式设备驱动程序)。而且,大部分内存页面可以交换到页面文件并按需加载到 RAM 中。
只是一些提交的内存页面不需要与页面文件绑定,因为它们已经绑定到另一个物理存储。内存映射文件就是这样的例子。
在正常情况下,当您提交内存页面时,使用它一段时间并释放它 - 很可能它根本不会到达页面文件。