一个进程可以使用最多 4 GB 的虚拟内存(包括用户和内核),但是当它不使用虚拟内存时,它的内核内存和用户内存是否在 RAM 中?
答案1
使用虚拟内存不是可选的,应用程序无法避免它。假设我们谈论的是 x86 受保护的内存,这是大多数当前操作系统(如 Linux、OS X 和 Windows)在 x86 上使用的内存。
基本上,每个进程都会看到一个 4 GB 的虚拟地址空间 (VAS)。操作系统与硬件一起设置所谓的页面描述符表 (PDT),以页面粒度(通常为 4 KB)描述该 VAS 的映射方式。页面可能映射到物理内存,也可能映射到文件(这意味着当进程尝试从 VAS 的该部分读取时,它将陷入操作系统,然后操作系统将从磁盘上的文件读取页面并将其放入内存中),或者它可能根本没有映射,在这种情况下,尝试访问 VAS 的该部分将导致进程崩溃。另外,虽然内核内存已映射到进程中,但进程无法直接访问它,如果尝试这样做,它将崩溃。
而且,操作系统可能会使用页面文件或交换分区,从而允许操作系统将较少使用的内存页面移至磁盘并将内存用于更有用的事情。同样,如果这样做,PDT 必须进行相应更新,并且与内存映射文件类似,如果进程尝试访问已交换出的页面,它将陷入操作系统,操作系统会将页面带回内存。(虽然交换能力通常与虚拟内存本身相混淆,但虚拟内存背后的基本思想是虚拟地址与物理内存地址不同的概念。)