存储系统
一句话模型
存储系统用多层次的容量、速度和成本折中,把 CPU 产生的地址和数据请求,最终转换成对某个存储介质的访问;局部性让高速的小容量层有效,映射和替换机制负责在层之间搬运数据。
三层递进
本板块的图谱遵循同一条学习路径:
- 简单:只看主要模块和上下层关系,先回答“存储系统有哪些层”。
- 中等:加入一次访问的主干流程,回答“地址和数据怎样在层之间流动”。
- 复杂:叠加异常分支、操作系统参与、文件系统和持久化 I/O,回答“不同 miss 发生后谁负责、状态如何改变”。
后续新增的子模块也遵循这个约定:先给模块总览,再逐步展开地址字段、策略、状态和边界条件。
简单图谱:存储层次
这张图先建立“谁和谁相邻”的地图。越靠近 CPU,访问通常越快、容量越小、单位成本越高;越靠近外存,容量越大但延迟越高。
# 存储系统
## CPU 可见的访问路径
- 虚拟地址
- MMU:地址翻译与保护
- TLB:缓存页表项
- Cache:缓存主存块
- 主存:DRAM 页面与内核数据
## 数据保存的介质
- 外存:SSD / HDD
- 文件系统:把块组织成文件和目录
- 交换区:缺页时的后备存储
## 每层都在解决的问题
- Cache:如何利用时间局部性和空间局部性降低平均访问时间
- 虚拟存储:如何让进程拥有独立、连续且大于物理内存的地址空间
- 文件系统:如何为持久化数据提供命名、组织和保护
- 磁盘调度:如何降低寻道与旋转带来的 I/O 延迟
对应的基础知识:
中等图谱:一次访问如何完成
主干问题是:CPU 给出一个虚拟地址后,数据怎样被找到;如果当前层没有,下一步由谁决定?
最小路径
- 指令产生虚拟地址
VA = VPN + offset。 - MMU 先查 TLB;命中后得到物理页框号
PPN,拼出物理地址PA = PPN + offset。 - Cache 用
PA(具体实现也可能使用 VIPT 等变体)拆分标记、组号和块内偏移。 - Cache 命中,直接把数据返回 CPU。
一次 miss 如何展开
- TLB 未命中:硬件或操作系统按体系结构查页表;页表项无效时触发缺页异常。
- Cache 未命中:按映射方式定位主存块,必要时依据替换策略淘汰旧块,再把整块装入 Cache。
- 缺页:操作系统从可执行文件或交换区换入页面;内存不足时先置换页面,更新页表和 TLB,再重新执行访问。
- 持久化写入:文件系统把文件偏移映射到磁盘/SSD 块,设备控制器和 DMA 完成介质 I/O。
复杂图谱:从虚拟地址到持久化 I/O
这张图在中等图谱上继续叠加三类细节:地址翻译的页表分支、Cache 的命中/填充分支,以及缺页后由操作系统和文件系统驱动的外存访问。
阅读时可以沿三条路径追踪:
- 命中路径:CPU → TLB → Cache → 数据返回。
- 容量 miss 路径:TLB miss → 页表;Cache miss → 主存块填充。
- 持久化路径:缺页或文件读写 → 文件系统 → 块设备 → SSD/HDD → DMA/中断通知。
子模块图谱:Cache 内部
整块存储系统建立后,再单独放大 Cache 这个高频子模块。它把“地址如何定位”和“未命中后如何处理”拆开,便于继续添加具体计算题中的位数和替换策略。
Cache 子图的阅读顺序是:物理地址拆分 → 依据映射方式定位候选行 → 比较 Tag 和 Valid → 命中返回或 miss → 按替换策略装入 → 按写策略更新下层。
子模块图谱:虚拟存储器内部
再看一个由硬件和操作系统共同完成的子模块。它把“地址翻译成功”和“页面尚未驻留”两条路径分开,突出页表有效位是从正常访问转入缺页处理的决策点。
虚拟存储子图的阅读顺序是:虚拟地址拆分 → 查询 TLB → 未命中时遍历页表 → 检查 Valid → 有效时拼出物理地址,无效时进入缺页异常 → 选择空闲页框或置换页面 → 从后备存储换入并更新页表/TLB → 重新执行访存。
关键问题
为什么要分层?
单一存储器无法同时满足低延迟、大容量和低成本。分层把高频数据放在更快的层,把容量压力推向更慢的层;局部性是这种折中的前提。
Cache 和虚拟存储解决的是同一个问题吗?
它们都利用局部性,但管理对象不同:Cache 搬运主存块,主要由硬件透明管理;虚拟存储搬运页面,由操作系统参与并提供进程隔离、保护和换入换出。
地址翻译和数据访问谁负责?
操作系统创建并维护页表,MMU 执行地址翻译;地址翻译得到的物理地址随后交给 Cache/主存路径完成数据访问。不要把“维护页表”和“查页表”混为一谈。
地址翻译和数据访问的流程是什么?
一次读操作可以沿着下面的顺序追踪:
- 形成虚拟地址:CPU 根据指令得到
VA = VPN + offset,其中offset是页内偏移。 - 翻译页面号:MMU 先用
VPN查询 TLB。命中时直接得到PPN;未命中时查页表,若页表项有效则把映射结果写入 TLB。 - 处理缺页分支:若页表项无效,MMU 触发缺页异常,操作系统从可执行文件或交换区换入页面,必要时置换一个物理页框,更新页表后重新执行这次访问。
- 拼接物理地址:
PPN与原来的offset拼成PA = PPN + offset。地址翻译只改变页号,页内偏移保持不变。 - 访问 Cache:Cache 根据物理地址拆分出的
Tag / Index / Block Offset定位候选行;Tag 相等且 Valid 有效时命中,直接返回数据。 - 处理 Cache miss:未命中时访问主存,把包含目标字的整个主存块装入 Cache;若需要淘汰旧块,则先依据替换策略选择牺牲行,再按写策略处理被替换数据。
- 返回数据:Cache 或主存将目标字返回 CPU;如果是写操作,还要根据写直达/写回等策略更新下层。
因此,地址翻译解决“这个虚拟地址对应哪个物理页框”,数据访问解决“物理地址所在的数据块在哪里”;前者主要由 MMU、TLB 和页表完成,后者主要由 Cache 和主存完成。
旁路清单
主干建立后,再展开这些容易在真题中组合出现的细节:
- Cache 的直接映射、全相联、组相联,以及 LRU / FIFO 等替换策略
- 写直达、写回、写分配与一致性问题
- 多级页表、TLB 有效位/脏位/访问位和页面置换算法
- SSD 的页、块、垃圾回收、磨损均衡与闪存写入限制
- HDD 的寻道时间、旋转延迟、传输时间和 SCAN/C-SCAN 调度
- 文件系统的索引分配、空闲空间管理、挂载和 VFS