简介

  • 虚拟内存是一个概念,一个逻辑模型,是对主存的抽象
  • 虚拟内存这个概念在硬件软件侧都有涉及,此文对虚拟内存的介绍,会偏向我所认为的硬件侧的内容,至于偏软件层面的,在此不做详细介绍,到时可能会在介绍操作系统相关内容时补全
  • 理论基础: 程序的空间局部性原理

作用

  • 将主存视为辅存(磁盘)的缓存,在主存上只存储进程所需的数据,提高存储系统的性能
  • 依靠辅存,虚拟内存可以实现一个容量比物理内存的存储空间,允许运行一个所需内存比物理内存大的程序
  • 实现进程之间的内存隔离

与 Cache(高速缓冲存储器) 的异同

  1. 提高存储系统性能
  2. 理论基础: 程序的空间局部性原理

  1. Cache 主要处理 CPU 和主存之间的速度差异,虚拟内存聚焦在处理容量、存储安全层面等问题
  2. Cache 的管理由纯硬件完成,对程序是透明的,虚拟内存由硬件和软件(操作系统)完成,对程序做了隔离,并非完全透明
  3. 虚拟内存未命中的损失比 Cache 大(Cache 和虚拟内存在存储系统中的不同层次)

概念结构(部分)

部分概念理解参考: 分页存储概念清晰梳理(页面、页表、页表项、页面大小、页内地址等概念)

术语

  • MMU: Memory Management Unit 内存管理单元
  • TLB: Translation Look-aside Buffer 转译后备缓冲器 快表
  • PTE: Page Table Entry 页表项
  • PPN: Physical Page Number 物理页号
  • VPN: Virtual Page Number 虚拟页号
  • PPO: Physical Page Offset 物理页偏移
  • VPO: Virtual Page Offset 虚拟页偏移
  • PA: Physical Address 物理地址
  • VA: Virtual Address 虚拟地址
  • PP: Physical Page 物理页
  • VP: Virtual Page 虚拟页

结构

地址

  1. 物理地址(假设物理地址为 n 位)
    物理地址划分

  2. 虚拟地址(假设虚拟地址为 m 位)
    虚拟地址划分

地址空间是一个包含地址的有序集合,虚拟(逻辑)地址空间是系统分配给进程的运行内存空间,每个进程拥有一个独立的虚拟(逻辑)地址空间

  • 物理内存在逻辑模型上被分为了多个固定大小的数据块,每个块被称为帧(Frame)(有被翻译成页框的,我的理解是这种管理就像一样把内存划分开,所以称为 Frame), 在本文中统一称为页(Page)
    • 每个页对应的索引称为页号
    • 每个页内部的数据位置索引称为偏移量
  • 对应地,虚拟地址空间也被按页划分,每页的大小与物理页大小一致

页表

一个用于完成虚拟页到物理页映射的表格,表格中的每一项称为页表项(PTE)
页表

其中:

  • 虚拟页号顺序排列,可由页表首地址(页表(基址)寄存器存储)加上偏移量得到
  • 页表项内,物理页号可能为空(表示未填入),有效位为1时,表示该物理页有效; 为0时,表示该物理页无效,地址为空或有效位为0都会引发缺页中断

TLB

  • 本质为高速缓存,存储的是活跃的 PTE,输入虚拟页号,若 TLB 命中,直接返回对应的物理页号
    TLB

虚拟内存管理方式

段式管理

段地址

  • 程序按逻辑结构分段(代码段,数据段,堆栈段等),以段为单元来分配主存
  • 每个段内部大小动态灵活可变,有效利用空间,便于管理和共享
  • 存在外部碎片问题
  • 段表与页表结构类似,但段表内部会记录每个段的长度

页式管理

页地址

  • 以页为单元来分配主存
  • 每个页内部大小固定,简化分配管理
  • 存在内部碎片问题

段页式管理

段页式地址

  • 兼有段式管理和页式管理的特点
  • 需要多次查表寻址

工作流程

  • 一个简单直接的 CPU 物理寻址工作流程
    物理寻址

  • 虚拟内存工作流程
    虚拟寻址

详细一点:
虚拟寻址

  1. CPU 提供数据地址(VA)
  2. TLB 查询
    -. 命中(绿线)
    1. 返回物理页号(PPN)
      -. 未命中(红线)
    2. 向页表查询物理页号
    3. 主存返回页号(PPN),同时将 PTE 存入 TLB 中
  3. MMU 地址翻译/转换(PA),向主存查找数据
  4. 主存传输数据给 CPU

页面替换算法

在此简要列举几种算法,在介绍操作系统涉及时可能将展开介绍

  • 理想算法: 最优替换算法(OPT)
  • 先进先出(FIFO)
    • 改进: 第二次机会算法
  • 最近最少使用页面替换(LRU, Least Recently Used)
  • 最不经常使用页面替换(LFU, Least Frequently Used)
  • 最近没有使用页面替换(NRU, Not Recently Used)
  • 时钟算法