一、虚拟内存的起因
获得更大、更快、更便宜,好用不易失的存储器
二、覆盖技术
目标:在较小的可用内存中运行较大的程序,常用于多道程序设计,与分区存储管理配合使用
原理:
- 将程序按照自身逻辑结构,划分为若干个功能独立的程序模块,那些不会同时执行的模块可共享同一块内存区域,按时间先后来运行
- 常驻内存模块:必要的代码和数据
- 可选模块:不常用功能存放于外存中,需要时才装入内存
- 不存在调用关系的模块不必同时装入内存中,从而可以相互覆盖,即这些模块共用一个分区
例子:
覆盖技术缺点:
- 由程序员来把一个大的程序划分为若干小的功能模块,并决定模块间的覆盖关系,增加了变成复杂度
- 覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省
三、交换技术
目标:多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源
方法:
- 将暂时不能运行的程序送到外存,从而获得空闲内存空间
- 操作系统把一个进程的整个地址空间的内存保存到外存中(swap out),而将外存中的某个进程的地址空间读入内存(swap in)。换入换出内容的大小为整个程序的地址空间
问题:
- 交换的时机: 只当内存空间不够或有不够的危险时换出
- 交换区的大小:交换区必须足够大,以存放所有用户进程的所有内存映像的拷贝,必须能对这些内存映像进行直接存取
- 程序换入时的重定位:换出后再换入的内存位置可能会变,最好采用动态地址映射的方法(通过页表的变化,实现逻辑地址与物理地址的动态映射)
覆盖与交换的比较:
- 覆盖只能发生在相互之间没有调用关系的程序模块之间,因此程序需要指出各个模块之间的逻辑覆盖结构
- 交换技术在内存中是以程序大小为单位进行的,不需要给出各个模块之间的逻辑覆盖结构
- 综上,交换发生在内存中程序与管理程序或操作系统之间,覆盖发生在运行程序内部
四、虚存技术
1. 目标:
- 覆盖技术需要开发者将程序划分为若干功能模块,确定覆盖关系,增加了开发者负担
- 交换技术需要把进程的整个地址空间换入换出,增加处理器开销
- 虚拟内存旨在实现进程在内存和外存间交换,但只对进程的部分内容进行交换;只将程序部分内容放入内存中,且对程序透明,无需开发者介入
2. 程序局部性原理:
程序在执行过程中的一个较短时期内,所执行的指令地址和指令的操作数地址,分别局限于一定区域。这可以表现为:
- 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内
- 空间局限性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内
局部性原理表明,从原理上来说,虚拟存储技术是可以实现的,而且实现之后应该能够取得较好的结果
3. 程序的编写方法对缺页率的影响:
4. 基本概念:
5. 基本特征:
- 大的用户空间:通过将物理内存与外存相互结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了两者的分离(32位的虚拟地址理论上可以访问4GB,而可能计算机上仅有256M的物理内存,但硬盘容量大于4GB)
- 部分交换:与交换技术相比,换入换出的是程序的部分内容
- 不连续:物理内存分配不连续,虚拟地址使用不连续
6. 虚拟页式内存管理:
大部分虚拟存储系统采用虚拟页式存储管理技术,在页式存储管理的基础上,增加请求调页和页面置换功能。
a. 基本思路:
- 当一个用户程序要调入内存运行时,不是将该程序的所有页面都装入内存,而是只装入部分的页面,就可启动程序运行
- 在运行的过程中,如果发现要运行的程序或者要访问的数据不在内存(根据页表项中resident标志位),则向系统发起缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行。
b. 页表项结构:
c. 例子:
mov REG, 0: 逻辑地址为0,查页表,得物理地址基地址为 2*4K,通过偏移量可得到实际物理地址
mov REG, 32780: 逻辑地址为32780,查页表,得到8号页表,出现缺页中断
7. 缺页中断处理过程:
- 若物理内存中有空闲的物理页面,则分配物理页帧f,然后执行步骤4;否则执行步骤2
- 采用页面置换算法,选择一个将被替换的物理页帧f(假设其逻辑页为q)。如果改页在内存中被修改过,则写会外存
- 对q所对应的页表项进行修改,将驻留位置为0;
- 将需要访问的页p装入物理页面f当中
- 修改p所对应的页表项的内容,把驻留位置为1,把物理页帧号置为f
- 重新运行被中断的指令
8. 后备存储
一个虚拟地址空间的页面可以被映射到一个文件中某个位置
代码段:映射到可执行二进制文件
动态加载的共享库程序段:映射到动态调用的库文件
其他段:可能被映射到交换文件
9. 虚拟内存性能
为了便于理解分页的开销,使用EAT(有效存储器访问时间)
EAT = 访存时间 * 页表命中几率 + 缺页异常处理时间 * 缺页异常几率
例子:
q代表内存中数据被修改,需要从内存中写入磁盘,此时需要执行两次访问磁盘的操作(读&写)