十一、虚拟存储器(二)
7.2操作系统软件
- 设计时三个基本选择问题
- 是否支持虚存技术
- 是否支持页式/段式/段页式
- 采用的算法
- 软件设计的主要问题
- 纯段式系统越来越少,段通常被分页,虚拟存储管理的问题主要就是虚拟页式存储管理的问题
- 目标:缺页率最小!
- 缺页中断产生巨大开销
- 虚拟存储管理软件的各个方面
- 调页策略
- 放置策略
- 替换策略
- 驻留集和工作集管理
- 清除(回写)策略
- 负载(并发度)控制
7.2.1调页策略
- 决定何时将页调入内存
- 两种常用策略:
- 请求调页:只通过响应缺页中断调入需要的页,也即只调入发生缺页时所需的页
- 进程开始运行时会有很多缺页,对外存I/O次数多,开销较大(一次I/O操作包括旋转等待时间和读写时间)
- 预先调页:在发生缺页需要调入某页时,一次调入该页以及相邻的几个页
- 提高调页的I/O效率
- 效率不能保证:额外装入的页可能没用
- 请求调页:只通过响应缺页中断调入需要的页,也即只调入发生缺页时所需的页
7.2.2放置策略
- 决定进程各部分驻留在内存的哪个位置
- 纯段式系统(动态分区,涉及外碎片、压缩操作等)
- 最佳适配、首先适配、......
- 纯段式或段页式系统
- 地址转换、内存存取原理相通
7.2.3替换策略
- 需要调入页而内存已满时,决定置换(淘汰)内存中的某些页框
- 经常要进行替换(为提高并发程度,操作系统总是载入尽量多的进程)
- 不是所有内存中的页都可以被调换:
- 锁定帧:操作系统内核、关键控制结构、I/O缓冲区等
- 驻留集策略决定了不同的替换范围:被替换的页框局限在本进程,或允许在其他进程
基本替换算法
- 最优算法(OPT)
- 淘汰“未来不再使用”或“还要最长时间才会使用”的那个页框
- 效果最佳,实现困难(实际执行难以预知)
- 可用作其他算法的性能评价依据
- 最近最少使用算法(LRU)
- 淘汰内存中最近最少使用的页框
- 性能接近最佳算法(局部性原理的合理近似)
- 示例:一个进程有5个页,系统规定进程最多占三个页框
![image]()
- LRU的实现
- 需要记录页框使用时间的先后关系,开销高昂
- 链表:每次内存访问后在链表中找到对应的页框,把它移到表头,因此表尾的就是最久未使用的
- 硬件移位计数器:每个页框关联一个计数器,每次访问该页框,计数器就加1
- 每次内存访问后将当前计数器的值写到响应的页表表现里,计数器的值每隔一段时间右移一位
- 缺页时,计数器值最小即为最近最少使用
- 需要记录页框使用时间的先后关系,开销高昂
- 先进先出算法FIFO
- 淘汰内存中的最“早”页
- 实现简单
- 可通过链表来表示各页的建立时间先后,新页添加到表尾,表头是最“早”页
- 性能较差
- 较早调入的页可能是经常被访问的页,这些页在FIFO算法下被反复调入和调出
- Belady现象:在分页式虚拟存储器管理中,缺页置换算法采用FIFO算法时,如果对一个进程未分配它所要求的全部页框,有时就会出现分配的页框数增多但缺页率反而提高的异常现象
![image]()
FIFO算法与LRU算法比较
- FIFO性能较差
- LRU能识别出2和5是最常用的页
![image]()
时钟算法(Clock)
- LRU性能近似OPT,但是实现开销大
- Clock性能近似LRU,而且实现开销小
- 环形链表实现算法
- 环形链表头尾相邻,因此只需要移动一个指针
- 每页关联一使用位(use bit)R
- 在页首次被装入时和发生缺页后被访问时,置R为1
- 在替换算法扫描后,置R为0
- 当需要置换页时,从指针所在的当前位置开始扫描整个缓冲区,选择遇到的第一个使用位为0的帧进行替换
- 示意图
![image]()
Clock与FIFO、LRU比较
- *号表示R=1,箭头表示指针
- Clock通过设置R位保护了常用的页
![image]()
7.2.4驻留集管理
- 给每个进程分配多少页框,以及如何动态调整各进程的页框数(内存)?
- 驻留集指虚拟页式存储管理中给进程分配的物理页框的集合
- 驻留集的大小即该集合的页框元素个数
- 每个进程的驻留集越小,则同时驻留内存的进程就越多,CPU利用率就越高
- 进程的驻留集过小,则缺页率高,调页的开销大
- 进程的驻留集大小达到一定数目之后,再给它分配更多页框,缺页率不再明显下降
管理策略
- 固定分配:在执行过程中进程的驻留集大小固定
- 各个进程的驻留集大小在进程创建时决定,可根据进程类型,或由程序员、系统管理员决定
- 替换页面时从各自驻留集中选择
- 可变分配:在执行过程中进程的驻留集大小可变
- 可根据缺页率动态调整,性能较好
- 需要操作系统对活动进程的行为进行评估,增加开销
替换范围
- 缺页发生时从在内存中的哪些页框进行替换?
- 全局替换:内存中任意非锁定页框均可以被替换
- 局部替换:被替换的页局限在缺页进程的驻留集
- 容易进行性能分析
- 性能不一定比全局替换好
组合策略
| 全局替换 | 局部替换 | |
|---|---|---|
| 固定分配 | 无此方案 | 进程开始前需预先分配页框数量:过多影响并发水平,过少使缺页率过高 |
| 可变分配 | 最容易实现的组合,被许多操作系统采用(如Unix),主要问题:如何决定哪个进程的页将被替换,不利优化(“损人利己”) | 试图客服全局替换的问题,可能是最佳组合(windows NT采用) |
可变分配+局部替换
- 具体做法:
- 进程加载进进程时,给它分配一定数量的页框;采用请求调页或预先调页填满这些页框
- 缺页时,从缺页进程本身的驻留集中选择替换一页
- 定期重新评估进程的驻留集大小,并相应增加或减少,以提高系统整体性能
- 比简单的全局替换复杂(基于对进程未来请求的估计改变驻留集大小),但性能要好
- 问题:如何调整驻留集大小?
- 答:工作集策略是一种方法
工作集
- 1968年由P.Denning提出
- 引入工作集的目的是依据进程在过去的一段时间内访问的页面来调整驻留集的大小
- 工作集是一个进程执行过程中某段时间内所访问的页的集合,可用一个二元函数W(y,△)表示:
- t是执行时刻
- △是一个虚拟时间段,成为窗口大小,它采用“虚拟时间”单位(即实际执行时间,阻塞不计时),可用执行的指令数目或处理器执行的时间来计算
- 工作集是在[t-△,t]虚拟时间段内所访问的页的集合,|W(t,△)|指工作集的大小,即页数目
![image]()
- 工作集大小的变化
- 进程开始执行时,随着访问新页逐步增多
- 当内存访问的局部性区域的位置大致稳定时,工作集大小也大致稳定
- 局部性区域的位置改变时,工作集快速扩张和收缩过渡到下一个稳定值
![image]()
- 工作集的性质
- 随△单调递增:
- 工作集大小范围
- 随△单调递增:
- 工作集策略
- 利用工作集来进行驻留集调整的策略
- 记录一个进程的工作集变化
- 定期删除驻留集中不在工作集中的页
- 总是让驻留集包含工作集(不能包含时则增大驻留集)
- 存在问题:
- 工作集的过去变化必须能预示工作集的将来(大小或组成页均可能会改变)
- 记录每个进程的工作集变化所要求的开销太大
- 对工作集窗口大小△的最优值难以确定,且通常该值是不断变化的
- 利用工作集来进行驻留集调整的策略
- 工作集策略的接近策略
- 缺页率算法(PPF):跟踪缺页率而不是工作集的变化
- 设定缺页率高/低阈值,缺页率高/低与相对应阈值时,增大/减小驻留集大小
- 主要缺点:在局部性阶段的过渡期间效果不好
- 可变间隔采样工作集(VSWS)策略
- 通过增加采样频率来解决PPF算法的缺点
- 驱动参数:采样区间的最大/最小宽度M/L(为异常条件提供边界保护)、采样实例间允许发生的缺页中断数目Q(使能正常激活采样)
- 策略:
- 采样间隔达到L时挂起进程并扫描使用位
- 若在采样间隔<L时发生了Q次缺页中断
- 采样间隔<M,则一直等待
- 采样间隔≥M,则扫描使用位
- 缺页率算法(PPF):跟踪缺页率而不是工作集的变化
清除策略
- 决定何时将已修改页调出到外存上
- 有两种常用的清除策略:
- 请求清除:该页被置换之前才调出,即把清除推迟到最后一刻
- 调入所缺页之前还要调出已修改页,缺页进程的等待时间较长
- 预先清除
- 若这批调出外存中的页中的多数在被置换之前还要被再次修改,则意义不大,形成不必要的开销
- 请求清除:该页被置换之前才调出,即把清除推迟到最后一刻
负载控制
- 决定内存中同时驻留的进程数目(即多道程序系统的并发水平)
- 过少,则通常所有进程都可能处于阻塞状态,从而CPU空闲时间太多
- 过多,则每个进程的驻留集太小,因此缺页频繁发生,导致“抖动”现象
![image]()
- 负载控制策略
- 基础工作集策略的算法(如缺页率PPF等)
- 它们隐含负载控制策略,只有那些驻留集足够大的进程才能运行,从而实现对负载的自动和动态控制
- “L=S判据”策略
- 让缺页的平均间隔时间(是指真实时间而不是虚拟时间)等于对这次缺页的处理事件,研究表明这时CPU的利用率达到最大
- “50%判据”策略:让外存交换设备保持50%利用率,这时CPU也达到最高的利用率
- 基础工作集策略的算法(如缺页率PPF等)
- 加载控制策略
- 基于Clock替换算法的加载控制策略
- 定义一个轮转计数,描述轮转的速率(即扫描环形页面链的速率)
- 当轮转计数小于一定的阈值时,表明缺页较少或存在较多不常使用的页,可提高系统负载
- 当轮转计数大于某阈值时,表明系统的并发水平过高,需降低系统负载
- 基于Clock替换算法的加载控制策略
- 加载控制的实施
- 当系统并发水平过高时(根据前述加载控制策略判定),需要降低系统负载
- 操作系统不能完全控制进程的创建,但可通过进程挂起(中程调度)来减少驻留内存的进程数目。
- 即需要减少驻留内存的进程数目时,可以将部分进程挂起并全部换出到外存上。如低优先级的、缺页率高的、驻留集最小的、页最多的,等等












浙公网安备 33010602011771号