文章目录
虚拟内存基本概念
传统存储管理方式的特征、缺点
- 一次性 :
作业必须一次性全部装入内存才能运行- 作业很大时, 无法全部装入内存,
导致大作业无法运行 - 当大量作业要求运行时, 由于内存无法容纳所有作业, 因此只有少量作业可以运行, 导致
并发度下降
- 作业很大时, 无法全部装入内存,
- 驻留性 : 一旦作业被装入内存, 就会
一直驻留在内存中, 直至作业运行结束.- 事实上, 在一个时间段内, 只需要访问作业的
一小部分就可以正常运行,这就导致了内存中驻留了大量暂时用不到的数据, 浪费了宝贵的系统资源
- 事实上, 在一个时间段内, 只需要访问作业的
局部性原理
- 时间局部性原理 : 一个程序在执行过程中如果使用了某条指令, 不久将来还会再次使用这条指令. 如果访问了某个的数据, 不久将来还会访问该数据 (因为程序中存在大量循环)
- 空间局部性 : 一旦程序访问了某个存储单元后, 不久之后, 该存储单元附近的存储单元也可能被访问. (因为很多数据 和 指令在内存中是连续存储)
高速缓冲技术 : 将近期会频繁访问的数据放入更高速的存储器中, 暂时不用的数据放在更低速的存储器中
虚拟内存的定义和特征
-
基于局部性原理, 在程序装入时, 将程序中
很快会被使用到的部分先装入内存,暂时不用的部分留在外存, 就可以让程序运行起来 -
运行过程中, 当所需要的
信息不存在时, 再让操作系统从外存中把相关信息调入内存, 然后继续执行 -
如果内存空间不够,
操作系统将内存中暂时用不到的数据调出到外存 -
在操作系统管理下, 用户看来似乎有一个比实际内存大得多的内存(
因为可以运行比实际内存大很多的作业), 即虚拟内存- 虚拟内存: 操作系统虚拟性的一个体现, 实际的物理内存没有改变, 在逻辑上进行了扩充
-
虚拟内存的最大容量是计算机的地址结构确定的(CPU寻址范围)
-
虚拟内存的实际容量 = min(内外存容量之和, CPU寻址范围)
- 特征
- 多次性(传统一次性) : 作业无需一次性全部装入内存, 而是可以分多次调入
- 对换性(传统驻留性) : 可以在作业运行过程中, 不用的作业数据, 需要的数据调入
- 虚拟性 : 逻辑上扩充了内存容量, 用户看到的内存容量远大于实际容量
如何实现虚拟内存技术
- 虚拟内存技术允许将一个作业多次调入调出内存, 如果采用传统的连续存储, 每次调入调出都需要保证和上次一调入有一段相连的足够的空间, 不方便. 因此虚拟内存的实现需要建立在
非连续存储的管理方式上
总结
请求分页管理方式
-
请求分页存储管理方式是在基本分页存储管理方式上进行扩展, 增加了虚拟内存技术 - 请求分页存储管理方式的不同
- 程序执行过程中, 当所访问的信息不存在时,
有操作系统负责将外存中相关信息调入内存, 然后继续执行程序 (页面缺失, 请求调页) - 程序执行过程中,如果内存空间不够, 有操作系统负责
将内存中暂时用不到的信息调出到外存(内存不够, 页面置换)
- 程序执行过程中, 当所访问的信息不存在时,
页表机制
- 为了实现请求调页过程中, 操作系统需要知道每个页面
是否已经被调入内存, 如果没被调入, 需要知到它们在外存中存放的位置 - 为了实现页面置换功能, 操作系统需要通过某些指标决定调出哪个页面 : 有的页面修改过, 就需要将外存中的就数据覆盖; 有的页面没有修改过, 就不用浪费时间写会外存. 因此操作系统需要记录
各个页面的修改信息
缺页中断机构
- 缺页中断是由于
当前执行的指令想要访问的目标页面未被调入内存而产生的, 属于内中断 - 一条指令执行期间, 可能发生
多次内中断(因为一条指令可能需要访问多个页面 copy a to b, 如果数据a, b属于不同的页面, 就有可能发生两次中断) - 中断
- 内中断 (CPU内部, 当前执行的指令)
- 陷入 : 有意为之的异常, 系统调用
- 故障 : 由错误条件产生, 可以被系统修复的. 如 缺页中断
- 异常 : 有错误条件产生, 不可以被系统修复. 如 除以0
- 外中断 (CPU外部)
- I/O操作
- 人为操作
- 内中断 (CPU内部, 当前执行的指令)
地址变换机构
总结
页面置换算法
- 当内存空间不够使, 进行选择, 将哪一个页面换到外存
最佳置换算法(OPT)
- 最佳置换算法(OPT, optimal) : 每次选择
以后永不使用或者在最长时间内不再被访问的页面进行置换, 保证最低的缺页率 -
实际无法实现, 因为只有进程执行过程中才知道下一个访问的页面是什么, 操作系统无法提前预判页面访问序列
先进先出置换算法(FIFO)
- 每次置换
最早进入内存的页面 - 实现方法 : 把调入的页面根据调入顺序排成一个队列, 需要置换页面时, 选择队头页面即可. 队列的长度取决于分配的内存块
最近最久未使用置换算法(LRU)
- least recently used : 每次置换
最久未被使用的页面 - 实现方法 : 每个页表项增加一个字段,
用来记录该页面自上次访问以来所经历的时间t, t值越大, 说明越久未被访问, 就被置换.
时钟置换算法(CLOCK)
- OPT 性能最好, 无法实现
- FIFO 实现简单, 性能差, 但是有Belady异常
- LRU 性能好, 最接近OPT, 但是实现困难, 需要特殊硬件支持
- 时钟置换算法是一种开销和性能均衡的算法, (也称 CLOCK算法, 最近未使用算法, NRU, Not Recently Used)
简单的CLOCK算法
改进的CLOCK算法
总结
页面分配策略
驻留集
-
请求分页存储管理系统中, 给进程分配的物理块的集合
- 虚拟技术中, 驻留集大小一般小于进程的总大小
- 驻留集过小 : 会导致频繁缺页, 系统花费大量时间处理缺页异常, 实际用于进程推进时间少
- 驻留集过大 : 并发度下降, 资源利用率低
-
固定分配: 操作系统为每一个进程分配一个固定大小的驻留集, 运行期间不可变 -
可变分配: 操作系统先为进程分配一定大小的驻留集, 运行期间根据需要适当增加和减少. -
局部置换: 缺页时, 操作系统只会置换该进程的页面 -
全局置换: 缺页时, 操作系统会将空闲的页框分配给该页面, 也可以置换别的进程的页面 (置换除本进程的 未锁定的页面)