虚拟内存管理
内存空间扩充技术,依据是局部性原理。
传统存储管理的缺点:
- 一次性。作业必须一次性全部装入内存后才能开始运行。
- 大作业无法运行。作业很大时,无法一次全部装入内存,导致大作业无法运行。
- 多道程序并发度下降。当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能够运行。
- 驻留性。一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。浪费了内存空间。
虚拟内存的定义和特征
虚拟内存定义
基于局部性原理,在程序装入内存时,可以将程序中很快用到的部分装入内存,暂时不用的部分留在外存,就可以让程序开始执行。
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出外存。
在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。(物理内存没变,逻辑上进行了扩充)
易混淆知识点
虚拟内存的最大容量由计算机的地址结构(CPU寻址范围)确定的。
虚拟内存的实际容量=min(内存和外存容量之和,CPU寻址范围)
例如:
虚拟内存特征
- 多次性。
无需在作业运行时一次全部装入内存,而是允许被分成多次调入内存。 - 对换性。
在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。 - 虚拟性。
在逻辑上扩充了内存容量,使用户看到内存容量,远大于实际的容量。
实现虚拟内存技术
虚拟内存的实现需要建立在 离散分配的内存管理方式基础上。
请求分页管理方式
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存(提供请求调页功能,将缺失页从外存调入内存),然后继续执行程序。
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出外存(提供页面置换功能)。
请求分页管理方式:
- 页表机制
- 缺页中断机构。
每当要访问的页面不在内存时,就产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。
此时,缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。 - 地址变换机构
缺页中断机构
如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入内存,并修改页表中相应的页表项。
若内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面则不用写回外存。
缺页中断属于内中断(当前执行的指令想要访问的目标页面未调入内存而产生)
一条指令执行期间,可能产生多次缺页中断。
页面置换算法
页面的换入换出需要磁盘I/O,会要较大的开销,因此算法应该尽量减少缺页率。
具体算法
- 最佳置换算法(OPT)
- 先进先出置换算法(FIFO)
- 最近最久未使用置换算法(LRU)
- 时钟置换算法(CLOCK)
- 改进型的时钟置换算法
最佳置换算法(OPT)
每次选择淘汰的页面将是以后永不使用或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
优劣:
可以保证最低的缺页率,但实际上,只有在执行过程中才能知道接下来会访问到哪个页面。操作系统无法提前判断页面访问序列。因此,最佳置换算法是无法实现的。
先进先出置换算法(FIFO)
每次选择淘汰的页面是最早进入内存的页面。
实现方法:
把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择头页面即可。队列的最大长度取决于系统为某进程分配了多少个内存块。
Belady异常----当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。(只有FIFO算法会产生)
FIFO算法虽然简单,但是算法与进程实际运行时的规律不适应,因为先进入的页面有可能最经常访问。因此,算法简单性能差。
最近最久未使用置换算法(LRU,Last recently used)
每次淘汰的页面是最近最久未使用的页面。
实现方法:
赋予每个页面对应的页表项中,用访问字段记录自上次被访问以来所经历的时间t。
当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。
该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大。
时钟置换算法(CLOCK)
时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法/最近未用算法(NRU,Not Recently Used)
不足:
仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要考虑执行I/O操作写回外存,只有被淘汰的页面被修改过,才需要写回外存。
改进型的时钟置换算法
在其他条件相同时,优先淘汰没有修改过的页面,避免I/O操作。
修改位为0,表示没有被修改过否则被修改过。
用(访问位,修改位)的形式表示。
算法规则:
将所有可能被置换的页面排成一个 循环队列。
- 第一轮,从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位。(最近未访问且没修改过的页面)
- 第二轮,若第一轮失败,从当前位置开始扫描到第一个(0,1)的帧用于替换。将本轮扫描过的帧的访问位修改设为0 。(最近未访问但修改过的页面)
- 第三轮,若第二轮失败,从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位。(最近访问过但没修改的页面)
- 第四轮,若第三轮失败,从当前位置开始扫描到第一个(0,1)的帧用于替换。 (最近访问过且修改过的页面)
由于第二轮已将所有帧的访问位修改为0,故第三轮、第四轮必定有一个帧被选中,做多进行四轮扫描。
几种算法比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52dqacAj-1678897319618)(pic/27.png)]
,从当前位置开始扫描到第一个(0,1)的帧用于替换。 (最近访问过且修改过的页面)
由于第二轮已将所有帧的访问位修改为0,故第三轮、第四轮必定有一个帧被选中,做多进行四轮扫描。