主存基础:RAM、ROM 与内存芯片组织
上一篇已经从整体上讲了存储层次,知道主存在整个系统中处于一个非常关键的位置:它比 Cache 大得多,又比外存快得多,是程序运行时最主要的工作区。
接下来要进一步回答的问题是:
主存本身到底是什么,它有哪些基本类型,又是怎样从芯片层面组织起来的?
理解这些内容,并不是为了以后手工焊内存条,而是为了真正明白:CPU 所访问的“内存”并不是一个抽象大盒子,而是由具体的存储器件、地址结构和读写机制构成的硬件系统。
一、主存在计算机系统里扮演什么角色
主存,也就是通常说的内存,是当前正在运行程序的主要驻留位置。
它保存的典型内容包括:
- 程序代码;
- 全局数据;
- 堆上的动态分配对象;
- 栈上的局部变量与调用信息;
- 各种运行时状态。
从 CPU 视角看,主存的作用是:
提供一个容量远大于寄存器和 Cache、但又足够快到能支撑程序运行的数据存放空间。
所以主存是 CPU 和外部持久化存储之间最重要的一层运行时缓冲区。
二、RAM 和 ROM 分别是什么
主存相关内容里最常见的两个缩写就是 RAM 和 ROM。
1. RAM
RAM 指随机存取存储器,它的核心特点是:
- 可以读,也可以写;
- 通常掉电后内容会丢失;
- 是程序运行时的主要工作内存。
这里的“随机存取”不是“随便乱存”的意思,而是指:
- 任意地址位置的访问时间大致相近;
- 不像磁带那样必须按顺序移动到目标位置才能读写。
2. ROM
ROM 指只读存储器,更强调内容相对固定、掉电后仍能保留。
它常用于保存:
- 启动代码;
- 固件;
- 某些硬件初始化程序;
- 不经常改动的底层控制信息。
所以 RAM 和 ROM 的差别,不只是“能不能写”,更是“用途和角色不同”。
三、为什么程序运行主要依赖 RAM,而不是 ROM
因为程序运行过程中需要不断改变状态。
例如:
- 变量值会变化;
- 栈帧会增长和回收;
- 堆对象会分配和释放;
- I/O 缓冲区内容会更新。
这些都要求存储介质具备快速可写能力,所以运行时主工作区必须依赖 RAM。
ROM 更适合保存相对稳定、启动时必须存在的内容,而不是承载程序的大量动态行为。
四、RAM 内部又为什么会分不同类型
因为即使在“可读可写的主存”内部,不同实现方式也会带来不同的速度、容量和成本特征。
最常见的两类是:
- SRAM;
- DRAM。
它们都属于 RAM,但设计目标和使用位置很不一样。
五、SRAM 和 DRAM 的核心区别是什么
1. SRAM
静态随机存储器,特点通常是:
- 速度更快;
- 结构相对更复杂;
- 单位容量成本更高;
- 一般不需要像 DRAM 那样周期性刷新。
所以 SRAM 常被用在容量较小但速度要求极高的位置,例如 Cache。
2. DRAM
动态随机存储器,特点通常是:
- 单位容量成本更低;
- 更容易做大容量;
- 访问速度通常慢于 SRAM;
- 需要周期性刷新保存数据。
因此 DRAM 更适合作为主存的主要实现形式。
所以两者的关系不是“谁先进谁落后”,而是:
SRAM 更适合快但小的层级,DRAM 更适合大而相对便宜的层级。
六、为什么 DRAM 需要刷新
可以先抓住一个直觉:
- DRAM 的存储方式决定了每个单元保存电荷的能力不是永久稳定的;
- 时间一长,信息会衰减;
- 所以系统必须定期把数据重新读出并恢复写回。
这就是刷新机制。
从工程角度看,这意味着 DRAM 虽然适合大容量,但管理上会比 SRAM 多一层动态维护成本。
也正因为如此,主存访问不像很多人想象的那样只是“读一下某个地址”,背后其实涉及行列寻址、刷新和时序控制等一整套机制。
七、什么叫内存芯片组织
主存并不是一个单独、无限展开的平面,而是由一个个存储芯片组合起来的。
每个芯片通常只能提供:
- 某个固定字长;
- 某个固定容量;
- 某种固定的读写接口。
而系统真正需要的是:
- 更大的总容量;
- 合适的数据位宽;
- 能按字节、按字、按块被 CPU 访问。
所以必须通过芯片组织把多个小存储芯片拼成系统需要的主存结构。
八、为什么要区分“按位扩展”和“按字扩展”
虽然这里不需要一开始就做复杂硬件题,但至少要建立这个基本直觉。
1. 按位扩展
当单个芯片的数据位宽不够时,可以多个芯片并行工作,拼出更宽的数据总线。
2. 按字扩展
当单个芯片容量不够时,可以通过增加地址范围来扩展可存储的字数。
所以芯片组织本质上是在解决两个问题:
- 一次能读写多宽;
- 一共能存多少。
理解这一点后,很多主存结构题就不再只是公式题,而能看成真实硬件拼装问题。
九、地址线、数据线和控制线分别在做什么
主存和 CPU 交互时,通常离不开三类基本信号通路:
1. 地址线
告诉主存“要访问哪个位置”。
2. 数据线
负责真正传输读出的数据或待写入的数据。
3. 控制线
告诉主存当前是读还是写,以及其他时序相关控制信息。
这三类信号通路非常重要,因为它们揭示了主存访问的本质:
CPU 并不是“知道某个值自然就在那”,而是通过地址选中位置,再通过控制和数据通路完成实际交换。
十、主存为什么既重要又常常成为性能瓶颈
虽然主存已经比外存快很多,但对 CPU 来说仍然不够快。
这意味着:
- 主存是必不可少的工作层;
- 但主存访问延迟仍然足以拖慢高性能 CPU;
- 于是 Cache 和预取机制才会变得如此重要。
所以主存在系统中的角色有点矛盾:
- 没它不行;
- 但单靠它又跟不上 CPU。
这也是主存为何总是夹在“必须依赖”和“必须被加速”之间。
十一、从工程角度看,这部分知识有什么价值
理解主存基础,会帮助你更自然地理解很多真实系统现象:
- 为什么内存容量不足会频繁换页和抖动;
- 为什么大对象、碎片化和访问模式会影响程序表现;
- 为什么 Cache 命中和主存访问差距会拉大性能;
- 为什么数据库、缓存系统和高性能服务都非常关心内存使用方式。
即使平时不做硬件,也会不断受这层机制影响。
十二、学习这一部分最容易踩的坑
1. 把 RAM 和 ROM 只看成“一个能写一个不能写”
更关键的是它们分别服务于不同系统角色。
2. 以为主存就是一整块统一介质
实际上它是由具体芯片和总线接口组织出来的硬件系统。
3. 忽略 SRAM 和 DRAM 的分工差异
这两者在存储层次里承担的是不同位置的职责。
总结
主存是计算机运行时最关键的工作存储层。真正值得先建立起来的,是这些认识:
- 主存承担着保存程序运行时代码和数据的核心职责;
- RAM 适合动态运行环境,ROM 更适合保存相对固定的底层内容;
- SRAM 更快更贵,适合 Cache;DRAM 更便宜更大,适合主存;
- 主存不是抽象盒子,而是由芯片、总线和控制机制组织起来的硬件系统;
- 主存既是程序运行的基础,又是 CPU 性能必须持续努力掩盖的延迟来源之一。
把这一篇理解透之后,下一步再看 Cache 基础时,就会更容易明白:为什么系统非要在 CPU 和主存之间再插一层高速缓冲,以及这层缓冲到底凭什么能显著改善平均访问性能。
参考资源:
- 《计算机组成与设计:硬件/软件接口》
- 《深入理解计算机系统》
- Wikipedia - Random-access memory
- Wikipedia - Dynamic random-access memory