所谓的虚拟内存,是具有请求调入和置换功能,从逻辑上对内存容量加以扩充的一种存储器系统。他的组成如下:

可以看到,操作系统将内存、外存结合起来,形成的存储器系统就是虚拟内存。
虚拟内存的工作原理主要有以下两点:
另一方面,虚拟内存具有下面的特征:
结合虚拟内存的组成(内存+外存)以及笔者前面几篇关于内存分配管理方式的介绍,将虚拟内存的实现所涉及的几点总结为下图:

具体的实现方式有以下三种:
下面将主要介绍请求分页存储管理,另外两种基本原理也都差不多,就不再赘述。
由于进程在执行过程中,并不会一次性将程序装入,因此每当需要装入新的程序部分到内存时,就会进行请求。在这个过程中,涉及到了请求分页的存储管理页表。

当程序执行过程中,发现所需要的部分未加载至内存,将会发生缺页中断,将所需部分程序装入至内存。以上面的存储管理页表为例。
假如此时需要页号0的程序部分,操作系统将其装入内存后维护存储管理页表:更新内存块号、状态位等。

相对应的,如果页面置换算法判断为淘汰时(例如访问频率低),内存中的程序就需要对换入硬盘缓存中。在这个过程中也需要缺页中断来完成。
操作系统根据存储管理表中的外存地址,将进行多次缺页中断,将对应程序部分挂起到硬盘缓存中。

虚拟内存的地址变换机构与前几篇文章所介绍的非连续内存分配差不多。区别在于页表的结构内容更多了。整个流程如下:

上面多次提到了页面置换算法,简单的了解几个总结如下:

页面分配策略涉及到的问题是:操作系统分配给进程多少内存页才比较合适?
首先需要知道驻留集,驻留集表示驻留在主存中的页面数。驻留集的大小对操作系统的影响有以下几点:
几种页面分配策略:
首先两种分配方式:固定分配、可变分配。所谓的“固定分配”就是操作系统分配固定大小的总页面,不够时不能向操作系统申请新的内存空间;而“可变分配”指的是,操作系统分配内存页后,还可以再向操作系统申请。
然后是两种置换方式:局部置换、全局置换。所谓的“局部置换”,是说分配的内存不足时,只能在进程所分配的内存页中进行置换;而“全局置换”是可以从主存中其余空闲的内存中进行置换。
以上两种方式的搭配,形成了三种分配策略:
根据页面的调入时机,有两种策略:
