第 8 章 · 主存与虚拟存储器

主存怎么造(DRAM)+ 主存不够怎么办(虚拟内存)——存储层次思想在「主存-磁盘」尺度的复刻,OS 内存管理的硬件底座。

8.1 SRAM vs DRAM

SRAMDRAM
存储单元6 个晶体管(触发器)1 晶体管 + 1 电容
刷新不需要要周期刷新(电容漏电)
速度快(纳秒级)
密度/成本低/贵高/便宜
用途Cache(第 7 章)主存

注意:DRAM 电容漏电,必须每隔几十毫秒刷新一次(重写所有行)否则数据消失。刷新占用访存带宽——这是「DRAM 延迟不稳定、比 SRAM 慢一个量级」的物理根源,也是 Cache 必须存在的原因(第 7 章内存墙)。

8.2 DRAM 的组织与访存

DRAM 是二维阵列,地址拆成行地址+列地址,RAS/CAS 两根选通分时复用同一组地址线(省引脚):

访存流程:先 RAS 选行(整行读入行缓冲/感测放大器)
          再 CAS 选列(从行缓冲里挑出目标单元)

行缓冲命中(row buffer hit):连续访问同一行(空间局部性)就快,跨行要重新激活、慢得多。SDRAM/DDR 的「DDR」= 时钟上下沿都传数据,带宽翻倍。

对比:DRAM 的行/列组织是空间局部性的硬件体现——顺序访问数组=同一行连续列、快;随机访问=频繁换行、慢。从寄存器到磁盘,每层都奖励顺序、惩罚随机。

8.3 虚拟内存:把磁盘当主存用

每个进程看到一个独立、连续、比物理内存大的虚拟地址空间,由 MMU+OS 翻译成物理地址。

  • 分页:地址空间切成固定页(page,通常 4KB),物理内存切成等大页框(frame),映射存页表(page table)
  • 页表项(PTE):物理页框号、有效位、dirty 位、访问位(替换用)、权限位(读/写/执行)。
虚拟地址 = 虚拟页号 VPN | 页内偏移 offset
              │ 查页表(MMU + TLB)
              ▼
物理地址 = 物理页框号 PFN | 页内偏移 offset(不变)
  • 缺页(page fault):访问的页不在内存(有效位=0),触发异常,OS 从磁盘换入(第 9 章中断/DMA 联动)。
  • 页置换:物理内存满时 OS 按 LRU/时钟踢一个页——第 7.4 节 Cache 替换的放大版。

注意:虚拟内存给每进程「独占整块内存」的错觉,是进程隔离与安全的硬件基石——一进程的虚拟地址只有经自己页表才能落物理地址。这也是野指针访问非法地址 → SIGSEGV 的机制:MMU 发现无映射/无权限,触发缺页/保护异常,内核发段错误。

8.4 TLB:页表的 Cache

查页表本身要访存(多级页表多次访存),慢。TLB(快表) 是「VPN→PFN」专用 Cache:

CPU 发虚拟地址 ──▶ 先查 TLB(快,命中则直接得物理地址)
                    │ 未命中 ──▶ 查页表(慢)──▶ 装入 TLB

对比:TLB 之于页表正如 Cache 之于主存——都是小快缓冲挡在大慢结构前,都靠局部性(TLB 命中靠时间局部性:反复访问同一批页)。「TLB 缺失→查页表→可能缺页→换页」是越来越慢的链条。

层次挡在谁之间缓冲什么缺失代价
CacheCPU ↔ 主存内存块主存延迟
TLBMMU ↔ 页表页表项页表访存
页表进程 ↔ 物理内存虚拟↔物理映射缺页(磁盘!)

8.5 与操作系统 / 各章衔接

  • OS 第 6 章(内存管理):页表、缺页、页置换是 OS 内存管理的硬件基础——OS 管「页表内容/置换策略/缺页处理」,硬件管「MMU 翻译/TLB/权限检查」。
  • OS 第 7 章(文件/设备)mmap 把文件映射进虚拟地址空间 = 让文件页按需换入,虚拟内存思想在文件 I/O 的复用。
  • 第 9 章:缺页 = 异常→中断服务→磁盘 DMA 读入→恢复进程,串起中断与 DMA。
  • C/Javamalloc/new 分配的是虚拟地址,物理页到真正读写才分配(惰性分配);Java GC、Python 引用计数都运行其上。