一、虚拟内存的起因
1. 迅速增长的存储需求
程序规模的增长速度远远大于存储器容量的增长速度
2. 存储层次结构
寄存器 ==> 高速缓存 ==> 内存 ==> 磁盘 ==> 磁带
3. 操作系统的存储抽象
地址空间
4. 虚拟内存需求
- 覆盖(overlaping):应用程序手动把需要的指令和数据保存在内存中。
- 交换(swapping):操作系统自动把暂时不执行的程序保存在外存中。
- 虚拟存储:在有限容量的内存中,以页为单位自动装入更多、更大的程序。
二、覆盖技术
1. 目标
在较小的可用内存中运行较大的程序。常用于多道程序系统,与分区存储管理配合使用。
2. 原理
把程序按照其自身逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。
- 必要部分(常用)的代码和数据常驻内存;
- 可选部分(不常用)的其他程序模块中实现,平时存放在外存中,在需要用到时才装入内存;
- 不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖。
3. 缺点
- 由程序员把一个大的程序划分为若干小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了编程的复杂度;
- 覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省。
三、交换技术
1. 目标
多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源。
2. 方法
- 可以将暂时不能运行的程序送到外存中,从而获得空闲内存空间;
- 操作系统把一个进程的整个地址空间的内容保存到外存中(换出swap out),而将外存中的某个进程的地址空间读入到内存中(换入swap in)。换入换出内容的大小为整个程序的地址空间。
3. 实现
实现过程中需要考虑的问题
- 交换时机的确定:只有当内存空间不够或有不够的危险时换出;
- 交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取;
- 程序换入时的重定位:采用动态地址映射的方法。
覆盖与交换的比较
- 覆盖只能发生在那些相互之间没有调用关系的程序模块之间;
- 交换是以在内存中的程序大小为单位来进行的,发生在内存中程序和管理程序或操作系统之间。
四、虚存技术
1. 目标
- 不是把程序的所有内容都放在内存中,由操作系统自动完成;
- 能够实现进程在内存与外存之间的交换,而且只对进程的部分内容进行交换。
2. 程序的局部性原理
程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限在一定区域内。
- 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
- 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小的区域内。
3. 基本概念
- 只在内存中装入程序当前需要执行的部分页面或段;
- 在程序执行过程中,如果需执行的指令或访问的数据尚未在内存中(缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序;
- 操作系统将内存中暂时不使用的页面或段调出保存在外存中。
4. 基本特征
- 用户空间大,把物理内存与外存相结合;
- 部分交换;
- 不连续性:物理内存分配的不连续,虚拟地址空间的不连续。
5. 虚拟页式内存管理
基本思路
- 当一个用户程序要调入内存执行时,不是该程序的所有页面都装入内存,而是只装入部分的页面,就可以启动程序运行;
- 在运行的过程中,如果发现要运行的程序或要访问数据不在内存,则向系统发出缺页中断,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续执行。
页表表项
- 驻留位:表示该页是在内存(1)还是在外存(0);
- 保护位:表示允许对该页做何种类型的访问;
- 修改位:表明此页在内存中是否被修改过;
- 访问位:如果该页面被访问过,则设置此位。
缺页中断的处理过程
- 如果在内存中有空闲的物理页面,则分配一个物理页,然后转第4步,否则转第2步;
- 采用某种页面置换算法,选择一个将被替换的物理页帧 f,它所对应的逻辑页为 q。如果该页在内存期间被修改过,则需要把它写回外存;
- 对 q 所对应的页表项进行修改,把驻留位置为 0;
- 将需要访问的页 p 装入到物理页面 f 当中;
- 修改 p 所对应的页表项的内容,把驻留位置为 1,把物理页帧号置为 f;
- 重新运行被中断的指令。
后备存储
- 一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的位置;
- 代码段:映射到可执行二进制文件;
- 动态加载的共享库程序段:映射到动态调用的库文件
- 其他段:可能被映射到交换文件。
6. 虚拟内存性能
E A T ( e f f i c t i v e m e m o r y a c c e s s t i m e ) = 访存时间 × 页表命中几率 + p a g e f a u l t 处理时间 × p a g e f a u l t 几率 EAT(effictive\ memory\ access\ time) = 访存时间 × 页表命中几率 + page\ fault 处理时间 × page\ fault几率 EAT(effictive memory access time)=访存时间×页表命中几率+page fault处理时间×page fault几率