文章目录
- 虚拟内存的概念
- 虚拟内存的实现
- 请求分页存储管理
- 缺页中断机构
- 地址变换机构
- 页面置换算法
- 页面分配策略
- 调入页面的时机
虚拟内存的概念
所谓的虚拟内存,是具有请求调入和置换功能,从逻辑上对内存容量加以扩充的一种存储器系统。他的组成如下:
可以看到,操作系统将内存、外存结合起来,形成的存储器系统就是虚拟内存。
虚拟内存的工作原理主要有以下两点:
- 时间局部性(一定时间内,多次执行)
- 空间局部性(对于某些热点内存,多次频繁的访问并执行)
另一方面,虚拟内存具有下面的特征:
- 多次性
- 对换性(比如进程挂起时,会从主存储器迁出到硬盘缓存中)
- 虚拟性
虚拟内存的实现
结合虚拟内存的组成(内存+外存)以及笔者前面几篇关于内存分配管理方式的介绍,将虚拟内存的实现所涉及的几点总结为下图:
具体的实现方式有以下三种:
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
下面将主要介绍请求分页存储管理,另外两种基本原理也都差不多,就不再赘述。
请求分页存储管理
由于进程在执行过程中,并不会一次性将程序装入,因此每当需要装入新的程序部分到内存时,就会进行请求。在这个过程中,涉及到了请求分页的存储管理页表。
- 页号:内存(一般指的是主存储内存)中的逻辑地址;
- 内存块号:页号所对应的内存中的物理地址;
- 状态位:是否已经加载到内存中;
- 访问字段:代表了对应内存页的访问频率,可以用于“对换”的判断参考;
- 修改位:表示对应的内存页中数据是否发生过修改;
- 外存地址:内存页所对应的程序对换存储地址(硬盘);
缺页中断机构
当程序执行过程中,发现所需要的部分未加载至内存,将会发生缺页中断,将所需部分程序装入至内存。以上面的存储管理页表为例。
假如此时需要页号0的程序部分,操作系统将其装入内存后维护存储管理页表:更新内存块号、状态位等。
相对应的,如果页面置换算法判断为淘汰时(例如访问频率低),内存中的程序就需要对换入硬盘缓存中。在这个过程中也需要缺页中断来完成。
操作系统根据存储管理表中的外存地址,将进行多次缺页中断,将对应程序部分挂起到硬盘缓存中。
地址变换机构
虚拟内存的地址变换机构与前几篇文章所介绍的非连续内存分配差不多。区别在于页表的结构内容更多了。整个流程如下:
- 首先请求调页,根据逻辑地址(程序中写的地址是逻辑的,不是物理的实际的地址)判断是否在内存中(查表,优先快表);
- 如果内存不足,则需要进行页面置换,即将内存中部分程序对换至硬盘缓存中,将淘汰的程序在页表中的数据修改为调入程序对应的数据;
- 如果内存充足,则在页表中进行新增,完成程序的装入;
- 将某些热点表同步至快表中;
页面置换算法
上面多次提到了页面置换算法,简单的了解几个总结如下:
- 先进先出置换算法
- 最佳置换算法
- 最近最久置换算法
- 时钟置换算法
- 改进型时钟置换算法
页面分配策略
页面分配策略涉及到的问题是:操作系统分配给进程多少内存页才比较合适?
首先需要知道驻留集,驻留集表示驻留在主存中的页面数。驻留集的大小对操作系统的影响有以下几点:
- 给进程分配的页面总空间小,会使得支持的进程数量增多,因此CPU时间利用率高;
- 给进程分配在主存中的页数少,会使得错页率高(可能会频繁的换入换出);
- 进程在主存的页数多,但是错页率不会有明显改善(因为内存足够,错页率已经低了);
几种页面分配策略:
首先两种分配方式:固定分配、可变分配。所谓的“固定分配”就是操作系统分配固定大小的总页面,不够时不能向操作系统申请新的内存空间;而“可变分配”指的是,操作系统分配内存页后,还可以再向操作系统申请。
然后是两种置换方式:局部置换、全局置换。所谓的“局部置换”,是说分配的内存不足时,只能在进程所分配的内存页中进行置换;而“全局置换”是可以从主存中其余空闲的内存中进行置换。
以上两种方式的搭配,形成了三种分配策略:
- 固定分配局部置换;
- 可变分配全局置换;
- 可变分配局部置换;
调入页面的时机
根据页面的调入时机,有两种策略:
- 预调页策略:一般用于进程的首次调入,一次性调入若干相邻页面;
- 请求调页策略:在进程运行时发现缺页再进行调入,由于要从硬盘进行调入调出,因此I/O操作开销较大;