Skip to content

虚拟内存

程序使用的内存地址和机器的物理内存地址是不同的,程序生成的内存地址会自动转换成机器地址。机器对应的地址不一定位于物理内存中,可能位于磁盘上。虚拟内存的目的是让程序认为它拥有连续的内存空间,而实际上这些空间可能分散在物理内存和磁盘上。 进程执行过程中,并不需要把进程所有数据都加载到物理内存中,其中在程序运行过程中任何时候都在内存中的部分,被定义成进程的常驻集(resident set)。

虚拟内存可行的基本原理是局部性原理

系统抖动

是指由于频繁的页面置换导致系统性能下降的现象。系统抖动通常发生在物理内存不足以容纳所有活跃进程的常驻集时,操作系统不断地将页面从磁盘交换到内存中,导致大量的页面错误和上下文切换,从而使得系统响应变慢。

分页

页表结构

页表以页号为索引,存放每一页在物理内存中的位置(以页表项的形式)。页表项不仅包含页框的物理地址,还包括了修改位(M) 和是否在内存中的标记位(P)

页表项
图1: 典型的内存管理格式

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

多级页表
图2: 多级页表
多级页表
图3: 两级分页系统中的地址转换

页面置换

“置换策略”用户处理在必须读取一个新页时,应该置换内存中的哪一页。主要涉及

  • 给每个活动进程分配多少页框
  • 是从当前进程的常驻集换出一页,还是从其他进程的常驻集换出一页
  • 选择换出哪一页

页框锁定

内存中某些页框是被锁定的,不能被置换

页面置换算法

页面置换算法
图4: 页面置换算法
页面置换算法对比
图5: 页面置换算法对比
  • 最佳置换算法(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)

只有当一页被用于置换时才写回辅存

  • 预约式清除

在页面被置换之前就成批将其写回辅存,以减少缺页中断的次数