Appearance
虚拟内存
程序使用的内存地址和机器的物理内存地址是不同的,程序生成的内存地址会自动转换成机器地址。机器对应的地址不一定位于物理内存中,可能位于磁盘上。虚拟内存的目的是让程序认为它拥有连续的内存空间,而实际上这些空间可能分散在物理内存和磁盘上。 进程执行过程中,并不需要把进程所有数据都加载到物理内存中,其中在程序运行过程中任何时候都在内存中的部分,被定义成进程的常驻集(resident set)。
虚拟内存可行的基本原理是局部性原理
系统抖动
是指由于频繁的页面置换导致系统性能下降的现象。系统抖动通常发生在物理内存不足以容纳所有活跃进程的常驻集时,操作系统不断地将页面从磁盘交换到内存中,导致大量的页面错误和上下文切换,从而使得系统响应变慢。
分页
页表结构
页表以页号为索引,存放每一页在物理内存中的位置(以页表项的形式)。页表项不仅包含页框的物理地址,还包括了修改位(M) 和是否在内存中的标记位(P)

犹豫页表本身比较大,无法全部都放入实存中,所以页表本身也是位于虚拟内 存中的,而且页表可以组织成多级结构。


页面置换
“置换策略”用户处理在必须读取一个新页时,应该置换内存中的哪一页。主要涉及
- 给每个活动进程分配多少页框
- 是从当前进程的常驻集换出一页,还是从其他进程的常驻集换出一页
- 选择换出哪一页
页框锁定
内存中某些页框是被锁定的,不能被置换
页面置换算法


- 最佳置换算法(OPT)
- 选择将来最长时间不被使用的页面进行置换
- OPT可以导致最少得缺页中断,不过需要知道未来的访问模式,实际不可行
- 最近最少使用(LRU)
- 先进先出(FIFO)
- 选择最早进入内存的页面进行置换
- 简单易实现,但可能不是最优的、
- 时钟算法(Clock)
- 类似于FIFO,把内存看做一个循环缓冲区,但使用一个指针来循环检查页面
- 每次检查时,如果页面被访问过,则清除其访问位并继续;如果未被访问,则进行置换
图6: 时钟算法
驻留集管理
分配策略
- 固定分配
- 每个进程被分配固定数量的页框
- 简单易实现,但可能导致内存利用率低
- 动态分配(可变分配)
- 根据进程的需求动态调整页框数量
- 可以提高内存利用率,但实现复杂
置换范围
- 局部置换
- 只在当前进程的常驻集内进行置换
- 可以减少其他进程的干扰,但可能导致频繁的页面置换
- 全局置换
- 可以在所有进程的常驻集内进行置换
- 可以提高整体系统性能,但可能导致某些进程的性能下降
驻留集合管理
项目 | 局部置换 | 全局置换 |
---|---|---|
固定分配 | 页面分配少,缺页率高,页面分配多,活跃进程少,处理器浪费在进程切换上 | 不可能 |
可变分配 | 复杂,所需要实时评估驻留集大小,常用的算法是“工作集策略” | 无法准确确定应该选择置换哪个进程的哪一页是合适的,有可能被置换出的页马上回被访问到 |
工作集策略
有点类似于滑动窗口,通过统计窗口时间内的页面访问情况来决定驻留集的大小。工作集是指在某个时间段内被访问的页面集合。工作集策略会根据进程的实际需求动态调整驻留集的大小,以减少缺页中断。
工作集策略的实现
PFF算法,以及其改进版本 VSWS(Variable Size Working Set)策略
- PFF(Page Fault Frequency)算法
- 通过监控页面错误频率来调整驻留集大小
- 如果页面错误频率过高,增加驻留集大小;如果过低,减少驻留集大小
- VSWS(Variable Size Working Set)策略
- 基于PFF算法,进一步优化工作集的大小
- 通过动态调整工作集的大小来适应进程的实际需求
- 可以更好地平衡内存利用率和缺页中断率
清除策略
清除策略是指在内存不足时,如何选择哪些页面进行置换以释放内存空间。常见的清除策略包括:
- 请求式清除(Demand Paging)
只有当一页被用于置换时才写回辅存
- 预约式清除
在页面被置换之前就成批将其写回辅存,以减少缺页中断的次数