虚拟内存对于操作系统来说是非常重要的,它是用于当做内存来弥补计算机物理内存空间缺乏的硬盘空间。当实际内存耗尽时(在内存耗尽之前),虚拟内存就在硬盘上创建了。当物理内存耗尽后,虚拟内存管理器选择最近没有用过的,低优先级的内存部分写到交换文件上。这个过程对应用是隐藏的,在应用看来虚拟内存和实际内存没啥区别。
  系统启动时会把所有的内存进行初始化,建立数据结构对内存进行分页。这些动作是实现虚拟内存的前提。那怎样实现虚拟内存呢?将内存页放到非物理内存的存储介质上,通常这些存储介质是硬盘,这些内存页存储在硬盘的页面文件中,比如Linux系统中的交换分区swap和Windows系统文件中虚拟内存文pagefile.sys。但对于应用程序认为这些内存页是内存的一部分,硬盘上的扇区如何变成内存对于应用程序都是透明的。
  但对于操作系统而言这样的转换不可能是透明的,除非CPU自己能完成和所有外围设备(包括硬盘)的交互。为了实现对虚拟内存的访问,CPU提供了新的异常中断,由操作系统负责实现中断处理程序。大致过程如下,
CPU经过计算得到了所要访问地址的内存页,
1、该内存页存在于物理内存,直接访问。
2、该内存页不在物理内存中,访问不到。因为CPU没有能力读取硬盘,只能触发异常中断,操作系统发现异常中断事件后会将在硬盘上的内存页读到物理内存中。首先操作系统在找到空闲物理内存,从硬盘上读出并写入物理内存中;然后修改页表,将页表标定与当前物理内存关联;由于发生中断导致后面代码无法继续执行,CPU会在中断返回之后重新执行发生错误的汇编代码。
  这里会遇到一个问题,就是有限物理内存没有空闲时,操作系统系统的虚拟内存调度程序会将各个进程中一部分暂时不用的内存换出到页面文件(交换分区)中,并将需要访问内存的程序的内容从页面文件中换入到那部分被标定为空闲的物理内存。这就是通常所说的Page Out操作。当这样的操作频繁发生时会对系统性能产生很大影响。对于虚拟内存计算调度,Page Out操作的优化会在以后进行补充。
还有一个问题需要说明,有些内存页是不能交换到硬盘上。例如,当CPU预读的数据不存在物理内存中,发生中断异常进行Page Out动作。处理这个中断也需要有一段代码,当CPU试图运行这段代码时它发现这段代码也不在物理内存中,接下来系统将没办法进行下去了。
  在操作系统中这样的应用还有很多,它们不能被放到硬盘上,必须保证永远在物理内存中运行。因此引出了分页池/非分页池 (Paged Pool/Non-Paged Pool)的概念。系统会保证那些必须使用Non-Paged Pool的应用以便保证不会出现上面的问题。
下面是一段对Paged Pool/Non-Paged Pool的描述:
The paged pool is exactly what its name implies: a region of virtual memory that is subject to paging. The size of the paged pool is limited and depends . both the amount of available physical memory . each individual machine and the specific operating system release. For example, the maximum size of the paged pool is about 491 MB . 32-bit hardware running Windows XP and about 650 MB . Windows Server 2003 SP1.
The nonpaged pool is a region of system virtual memory that is not subject to paging. Drivers use the nonpaged pool for many of their storage requirements because it can be accessed at any IRQL. Like the paged pool, the nonpaged pool is limited in size. . a 32-bit x86 system that is started without the /3GB switch, the nonpaged pool is limited to 256 MB; with the /3GB switch, the limit is 128 MB. . 64-bit systems, the nonpaged pool currently has a limit of 128 GB.
  在上面的一段描述中提到了“/3GB switch”这个概念,这是Windows系统中的一个内存开关,这就涉及到Windows如何使用大内存的问题。
  我在“Windows如何提供大内存支持”中会对它有详细的介绍。