主存基础: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 和主存之间再插一层高速缓冲,以及这层缓冲到底凭什么能显著改善平均访问性能。

参考资源