存储系统

从存储层次到一次虚拟地址访问,建立存储系统的主干和旁路。

一句话模型

存储系统用多层次的容量、速度和成本折中,把 CPU 产生的地址和数据请求,最终转换成对某个存储介质的访问;局部性让高速的小容量层有效,映射和替换机制负责在层之间搬运数据。

三层递进

本板块的图谱遵循同一条学习路径:

  1. 简单:只看主要模块和上下层关系,先回答“存储系统有哪些层”。
  2. 中等:加入一次访问的主干流程,回答“地址和数据怎样在层之间流动”。
  3. 复杂:叠加异常分支、操作系统参与、文件系统和持久化 I/O,回答“不同 miss 发生后谁负责、状态如何改变”。

后续新增的子模块也遵循这个约定:先给模块总览,再逐步展开地址字段、策略、状态和边界条件。

简单图谱:存储层次

这张图先建立“谁和谁相邻”的地图。越靠近 CPU,访问通常越快、容量越小、单位成本越高;越靠近外存,容量越大但延迟越高。

StorageHierarchyMapcpuCPU指令与数据请求trans地址翻译MMU + TLBcpu->transVAcache高速缓存Cache:主存块trans->cachePAmemory主存DRAM:页框cache->memorymiss:装入主存块persistent持久化存储SSD / HDD:块memory->persistent缺页 / 文件 I/Opersistent->memory换入 / 读块note靠近 CPU:快、贵、容量小远离 CPU:慢、便宜、容量大note->cache
# 存储系统

## CPU 可见的访问路径

- 虚拟地址
- MMU:地址翻译与保护
- TLB:缓存页表项
- Cache:缓存主存块
- 主存:DRAM 页面与内核数据

## 数据保存的介质

- 外存:SSD / HDD
- 文件系统:把块组织成文件和目录
- 交换区:缺页时的后备存储

## 每层都在解决的问题

- Cache:如何利用时间局部性和空间局部性降低平均访问时间
- 虚拟存储:如何让进程拥有独立、连续且大于物理内存的地址空间
- 文件系统:如何为持久化数据提供命名、组织和保护
- 磁盘调度:如何降低寻道与旋转带来的 I/O 延迟

对应的基础知识:

中等图谱:一次访问如何完成

主干问题是:CPU 给出一个虚拟地址后,数据怎样被找到;如果当前层没有,下一步由谁决定?

StorageAccessPathvaCPU 产生虚拟地址VA = VPN + offsettlb查 TLBva->tlbpa得到物理地址PA = PPN + offsettlb->pa命中pte查页表更新 TLBtlb->pte未命中cache查 Cache标记 / 组号 / 块内偏移pa->cachehitCache 命中数据返回 CPUcache->hit命中fillCache 未命中主存块填充与替换cache->fill未命中mem访问主存 DRAMfill->mempte->pa有效页表项fault页表项无效缺页异常pte->fault无效os操作系统换入页面必要时置换页面fault->osos->pte更新页表后重试diskSSD / HDD后备存储os->disk读入页面disk->os页面数据

最小路径

  1. 指令产生虚拟地址 VA = VPN + offset
  2. MMU 先查 TLB;命中后得到物理页框号 PPN,拼出物理地址 PA = PPN + offset
  3. Cache 用 PA(具体实现也可能使用 VIPT 等变体)拆分标记、组号和块内偏移。
  4. Cache 命中,直接把数据返回 CPU。

一次 miss 如何展开

  • TLB 未命中:硬件或操作系统按体系结构查页表;页表项无效时触发缺页异常。
  • Cache 未命中:按映射方式定位主存块,必要时依据替换策略淘汰旧块,再把整块装入 Cache。
  • 缺页:操作系统从可执行文件或交换区换入页面;内存不足时先置换页面,更新页表和 TLB,再重新执行访问。
  • 持久化写入:文件系统把文件偏移映射到磁盘/SSD 块,设备控制器和 DMA 完成介质 I/O。

复杂图谱:从虚拟地址到持久化 I/O

这张图在中等图谱上继续叠加三类细节:地址翻译的页表分支、Cache 的命中/填充分支,以及缺页后由操作系统和文件系统驱动的外存访问。

StorageSystemFullMapcluster_translation地址翻译cluster_fast硬件快速路径cluster_slow软件与持久化路径cpuCPU指令产生 VAtlbTLB缓存 VPN → PPNcpu->tlbVPN + offsetpage页表 / MMU权限与有效位tlb->page未命中:查页表pa物理地址 PAPPN + offsettlb->pa命中page->pa有效 PTEos操作系统缺页处理 / 页面置换page->os无效 PTE:缺页异常cacheCacheTag / Index / Offsetpa->cache查 Cachedram主存 DRAM物理页框 / 主存块cache->drammiss:填充主存块ret数据返回 CPUcache->ret命中dram->cache返回整块dram->ret访问完成os->page更新页表后重试os->dram分配页框 / 换入fs文件系统文件偏移 → 逻辑块os->fs定位映像/交换区dma设备控制器 + DMA块传输与中断fs->dma提交块 I/Odma->os中断 / DMA 完成diskSSD / HDD持久化块dma->disk读 / 写块disk->dma数据完成

阅读时可以沿三条路径追踪:

  • 命中路径:CPU → TLB → Cache → 数据返回。
  • 容量 miss 路径:TLB miss → 页表;Cache miss → 主存块填充。
  • 持久化路径:缺页或文件读写 → 文件系统 → 块设备 → SSD/HDD → DMA/中断通知。

子模块图谱:Cache 内部

整块存储系统建立后,再单独放大 Cache 这个高频子模块。它把“地址如何定位”和“未命中后如何处理”拆开,便于继续添加具体计算题中的位数和替换策略。

CacheInternalMapaddr物理地址Tag | Index | Block Offsetmap映射方式直接映射 / 全相联 / 组相联addr->maplocate定位候选 Cache 行Index 选组,Tag 比较map->locatevalidValid = 1 且 Tag 相等?locate->validhit命中按 Offset 取数据valid->hitmiss未命中选择牺牲行valid->missret返回 CPUhit->retreplace替换策略LRU / FIFO / 随机miss->replacelower访问主存装入一个主存块replace->lowerwriteback写策略写直达 / 写回写分配 / 非写分配writeback->retlower->writeback

Cache 子图的阅读顺序是:物理地址拆分 → 依据映射方式定位候选行 → 比较 Tag 和 Valid → 命中返回或 miss → 按替换策略装入 → 按写策略更新下层。

子模块图谱:虚拟存储器内部

再看一个由硬件和操作系统共同完成的子模块。它把“地址翻译成功”和“页面尚未驻留”两条路径分开,突出页表有效位是从正常访问转入缺页处理的决策点。

VirtualMemoryInternalMapva虚拟地址 VAVPN | Page Offsettlb查询 TLBVPN → PPNva->tlbpte遍历页表读取页表项 PTEtlb->pte未命中pa拼接物理地址 PAPPN | Page Offsettlb->pa命中validValid = 1?pte->validvalid->pa是:得到 PPNfault缺页异常陷入操作系统valid->faultaccess访问物理内存 / Cachepa->accessframe分配空闲页框?fault->framereplace页面置换选择牺牲页并写回frame->replaceswapin从程序映像或交换区换入目标页面frame->swapinreplace->swapinupdate更新页表与 TLB恢复进程并重试swapin->updateupdate->tlb重新访问

虚拟存储子图的阅读顺序是:虚拟地址拆分 → 查询 TLB → 未命中时遍历页表 → 检查 Valid → 有效时拼出物理地址,无效时进入缺页异常 → 选择空闲页框或置换页面 → 从后备存储换入并更新页表/TLB → 重新执行访存。

关键问题

为什么要分层?

单一存储器无法同时满足低延迟、大容量和低成本。分层把高频数据放在更快的层,把容量压力推向更慢的层;局部性是这种折中的前提。


Cache 和虚拟存储解决的是同一个问题吗?

它们都利用局部性,但管理对象不同:Cache 搬运主存块,主要由硬件透明管理;虚拟存储搬运页面,由操作系统参与并提供进程隔离、保护和换入换出。


地址翻译和数据访问谁负责?

操作系统创建并维护页表,MMU 执行地址翻译;地址翻译得到的物理地址随后交给 Cache/主存路径完成数据访问。不要把“维护页表”和“查页表”混为一谈。


地址翻译和数据访问的流程是什么?

一次读操作可以沿着下面的顺序追踪:

  1. 形成虚拟地址:CPU 根据指令得到 VA = VPN + offset,其中 offset 是页内偏移。
  2. 翻译页面号:MMU 先用 VPN 查询 TLB。命中时直接得到 PPN;未命中时查页表,若页表项有效则把映射结果写入 TLB。
  3. 处理缺页分支:若页表项无效,MMU 触发缺页异常,操作系统从可执行文件或交换区换入页面,必要时置换一个物理页框,更新页表后重新执行这次访问。
  4. 拼接物理地址PPN 与原来的 offset 拼成 PA = PPN + offset。地址翻译只改变页号,页内偏移保持不变。
  5. 访问 Cache:Cache 根据物理地址拆分出的 Tag / Index / Block Offset 定位候选行;Tag 相等且 Valid 有效时命中,直接返回数据。
  6. 处理 Cache miss:未命中时访问主存,把包含目标字的整个主存块装入 Cache;若需要淘汰旧块,则先依据替换策略选择牺牲行,再按写策略处理被替换数据。
  7. 返回数据:Cache 或主存将目标字返回 CPU;如果是写操作,还要根据写直达/写回等策略更新下层。

因此,地址翻译解决“这个虚拟地址对应哪个物理页框”数据访问解决“物理地址所在的数据块在哪里”;前者主要由 MMU、TLB 和页表完成,后者主要由 Cache 和主存完成。

旁路清单

主干建立后,再展开这些容易在真题中组合出现的细节:

  • Cache 的直接映射、全相联、组相联,以及 LRU / FIFO 等替换策略
  • 写直达、写回、写分配与一致性问题
  • 多级页表、TLB 有效位/脏位/访问位和页面置换算法
  • SSD 的页、块、垃圾回收、磨损均衡与闪存写入限制
  • HDD 的寻道时间、旋转延迟、传输时间和 SCAN/C-SCAN 调度
  • 文件系统的索引分配、空闲空间管理、挂载和 VFS

这些内容分别对应Cache 细节虚拟存储细节磁盘与 SSD操作系统文件系统页面。