💾
“计算机是怎样一层层搭起来的?”系列 · 3/4
如果 SSD 能永久保存数据,为什么程序运行时还需要内存?如果内存比 SSD 快,为什么又不能直接把所有东西都放进内存?再往上,CPU 内部为什么还要塞进寄存器和多级 Cache?

一、一个看似合理、实际上做不到的梦想

理想中的存储器应该同时满足:
  • 极快;
  • 极大;
  • 极便宜;
  • 断电不丢数据;
  • 功耗低;
  • 寿命长;
  • 能直接贴在 CPU 旁边。
问题是,现实中的存储技术无法同时把这些目标做到最好。
因此现代计算机没有寻找一种“万能存储器”,而是采用另一种办法:
把很多不同性质的存储器叠在一起。
这就是存储层级。

二、从 CPU 往外走,存储通常越来越大,也越来越慢

可以把常见层级粗略画成:
越靠近 CPU 的层级通常越追求低延迟和高带宽,但容量更小、单位成本更高。
越往下,容量通常越大、保存时间越长,但访问代价也更高。

三、寄存器:CPU 手边真正“正在用”的数据

寄存器位于处理器内部,是程序执行过程中最直接的工作位置之一。
很多机器指令直接对寄存器进行操作。
例如:
  • 两个寄存器相加;
  • 比较寄存器;
  • 保存地址;
  • 保存函数返回值;
  • 维护栈指针和程序计数等状态。
寄存器极快,但数量非常有限。
因此它适合保存“此刻马上要用”的数据,而不可能承担整个程序的存储任务。

四、Cache:为什么 CPU 不直接每次都去内存取?

处理器执行速度越来越高以后,一个严重问题出现了:
CPU 等内存,可能比真正做运算花的时间还多。
于是缓存被放在 CPU 与主存之间。
Cache 会保存近期很可能再次使用的数据和指令,让处理器尽量避免每次都访问更慢的主存。
现代 CPU 通常使用多级缓存,就是因为即使在 Cache 内部,也存在速度、容量和布线距离之间的权衡。

五、缓存为什么真的有用?——程序通常不是随机乱跳

Cache 能工作,依赖一个非常重要的经验规律:局部性
程序往往表现出两类局部性:
时间局部性:刚刚访问过的数据,很可能很快再次访问。
空间局部性:刚刚访问了某个地址附近的数据,接下来很可能继续访问附近位置。
例如遍历一个数组时,程序通常会连续访问相邻元素。
所以硬件不需要“猜中整个未来”,只要利用程序在局部范围内的规律,就能让较小的高速缓存挡住大量对慢速存储的访问。

六、RAM:为什么它比硬盘更像程序的“工作台”?

内存容量远大于 CPU Cache,因此可以容纳正在运行的程序、数据结构、堆、栈、文件缓存等。
CPU 通过内存系统访问这些内容。
常见主存使用 DRAM,它提供了很好的容量与速度平衡,但属于易失性存储:断电后内容不能继续可靠保存。
这就是为什么:
RAM 适合“工作”,不适合“归档”。
关机以后我们仍然需要保留系统和文件,于是必须继续向更下层走。

七、SSD:为什么它能断电保存,却仍然不能替代 RAM?

SSD 使用非易失性闪存保存数据。
与机械硬盘相比,它没有机械磁头寻道,因此在随机访问、体积、抗震等方面具有明显优势。
但 SSD 与 RAM 仍然不是同一种角色。
RAM 面向处理器正在运行的工作集,需要极低访问延迟和高频读写;SSD 更强调大容量非易失保存。
同时,操作系统访问 SSD 通常还要经过存储控制器、协议栈、文件系统等层次。
所以即使今天 SSD 已经很快,它依然不等价于“更便宜的内存”。

八、HDD 为什么还没有消失?

机械硬盘的工作原理决定了它在随机访问上很难与 SSD 竞争。
但它依然拥有重要优势:在很多大容量场景里,单位容量成本有吸引力。
于是 HDD 仍常见于:
  • 大容量资料存储;
  • NAS;
  • 备份;
  • 冷数据;
  • 对极低随机延迟要求不高的场景。
技术进步并不总是“新东西彻底消灭旧东西”。
更多时候,是旧技术退到自己仍然最划算的位置。

九、所谓“内存”和“存储”为什么总让人混淆?

日常语言里,“内存”这个词经常被混用。
但在 PC 语境中,通常应该区分:
  • RAM / 主存:运行程序时的高速工作区;
  • SSD / HDD 存储:断电后继续保存文件和程序的长期空间。
所以“16 GB 内存 + 1 TB SSD”里的两个容量不能简单相加成“1016 GB”。
它们属于不同层级,服务不同任务。
手机上的“12 GB + 512 GB”本质上也是同一个区别:前者通常指运行内存,后者指非易失性存储容量。

十、虚拟内存:16 GB RAM 为什么有时能运行需要更多空间的程序?

操作系统会给进程提供一个抽象出来的虚拟地址空间
程序看到的地址,并不等于某个固定的物理内存芯片位置。
操作系统和硬件的内存管理机制可以把虚拟地址映射到物理内存页;在需要时,还可能把暂时不用的一部分内容换出到磁盘上的页面文件或交换空间。
但必须注意:
虚拟内存不是把 SSD 魔法般变成了真正的 RAM。
一旦程序频繁把数据在内存和磁盘之间来回换入换出,性能可能急剧下降。
虚拟内存解决的是地址空间管理、隔离与容量弹性,而不是抹平所有硬件速度差异。

十一、文件缓存又在制造另一种“错觉”

如果一个文件刚被读取过,操作系统往往会把相关数据暂时留在 RAM 中。
下一次程序再次访问它时,系统可能直接从内存提供,而不必重新读取 SSD 或 HDD。
于是用户会觉得:
“第二次怎么突然快了?”
这并不是硬盘突然变快,而是更快的上层存储替下层存储挡住了请求。
从 CPU Cache 到操作系统文件缓存,其实一直在重复同一个思想。

十二、现代计算机真正想制造的是一种幻觉

从程序员视角,我们希望:
我有一个又快、又大、又可靠的统一存储空间。
现实硬件做不到。
于是系统通过寄存器、缓存、主存、虚拟内存、文件缓存和长期存储层层合作,让大多数时候的体验尽量接近这个理想。
这可以概括成:

十三、但谁在管理这些层级?

到这里,一个新的角色越来越明显。
程序不应该自己决定:
  • 哪一页内存给谁;
  • 哪个文件放在哪里;
  • 哪个进程先运行;
  • 哪个设备可以访问;
  • 哪个程序有权限读取某个目录。
否则每个应用都必须自己管理整台计算机,而且彼此极易冲突。
因此硬件之上还需要一个统一管理者。
下一篇,就轮到操作系统登场。

系列导航

上一篇:一台计算机究竟由什么组成?——从 CPU 到主板的完整硬件地图
第 3 篇(本文):计算机为什么需要这么多种“记忆”?——从寄存器到硬盘
下一篇:没有操作系统,电脑还能运行吗?——操作系统究竟替我们做了什么
没有操作系统,电脑还能运行吗?——操作系统究竟替我们做了什么一台计算机究竟由什么组成?——从 CPU 到主板的完整硬件地图
Loading...