内存子系统:DRAM与SRAM的区别

聊内存子系统,咱们得从最基础的两种存储单元说起——DRAM和SRAM。这两个家伙,名字就差一个字母,但脾气秉性完全不同。

我刚开始做存储系统那会儿,总觉得DRAM和SRAM不就是快慢区别嘛。后来被项目狠狠教育了一回,才明白这里面门道深着呢。

DRAM vs SRAM:本质差异

先说说SRAM。它用6个晶体管存1个bit,说白了就是个触发器电路。只要不断电,数据就稳稳待在那儿,不需要任何额外操作。读写速度极快,一般能跑到几个纳秒级别。

DRAM就不同了。它用一个晶体管加一个电容来存1个bit。电容会漏电,所以得不停地刷新——嗯,这就是"动态"二字的由来。我见过不少新手工程师,第一次听到"刷新周期"这个概念时都懵了。

核心区别一句话总结:

  • SRAM:快,贵,容量小,不用刷新
  • DRAM:慢,便宜,容量大,需要定期刷新

你想想看,为什么CPU的一级缓存用SRAM?因为要快。为什么主存用DRAM?因为要便宜、要大容量。这个取舍,说白了就是成本和性能的博弈。

我在项目中遇到过一件事:有个同事非要用SRAM做嵌入式系统的主存,理由是"速度快"。结果呢?成本直接翻了三倍,板子面积也撑不住。后来换回DRAM,配合合理的缓存策略,性能反而更好了。所以啊,选型不能只看单点性能。

内存带宽计算

带宽这个词,大家都不陌生。但怎么算,很多人就含糊了。

内存带宽的公式其实很简单:

带宽 = 内存时钟频率 × 数据总线位宽 × 传输次数/时钟周期

举个例子。DDR4-3200,时钟频率1600MHz,但DDR是双倍数据率,所以有效频率是3200MHz。数据总线位宽一般是64位(8字节)。那么:

带宽 = 3200 MHz × 8 Bytes × 1 = 25.6 GB/s

等等,这里有个坑。很多人以为DDR就是"两倍速度",其实DDR的意思是每个时钟周期传输两次数据——上升沿一次,下降沿一次。所以传输次数是2。但公式里我写的是1,因为有效频率已经包含了这个2倍关系。

个人习惯:我一般直接用有效频率来算,省得绕晕。比如DDR4-3200,直接3200×8=25.6 GB/s,简单粗暴。

实际项目中,理论带宽永远跑不满。为什么?因为还有刷新开销、总线竞争、协议开销等等。我记得有一次做性能测试,理论带宽25.6 GB/s,实际只能跑到18 GB/s左右。嗯,70%的利用率已经算不错了。

内存延迟:CAS延迟与行激活延迟

带宽是吞吐量,延迟是响应时间。这两个指标,经常是矛盾的。

内存延迟主要看几个关键参数:

参数 全称 含义
CL CAS Latency 列地址选通延迟
tRCD RAS to CAS Delay 行激活到列选通延迟
tRP Row Precharge Time 行预充电时间
tRAS Row Active Time 行激活时间

CAS延迟(CL)是最常被提到的。它表示从发出列地址到数据开始返回之间的时钟周期数。CL值越小,延迟越低。比如CL=14和CL=16,差了两个时钟周期。

但别只看CL。我见过有人买内存只看CL,结果忽略了tRCD。实际上,tRCD也很关键——它表示行激活命令到列选通命令之间的延迟。

避坑指南:我曾经在优化数据库服务器时,换了低CL的内存条,结果性能提升微乎其微。后来才发现,瓶颈在tRCD上。因为数据库的访问模式是随机访问,频繁换行,tRCD的影响比CL更大。

行激活延迟,说白了就是打开一行需要多久。DRAM的结构像个网格,行地址先激活一行,然后列地址从这一行里选数据。如果每次访问都要换行,那行激活延迟就成了主要瓶颈。

为什么会这样?你想想看,DRAM内部是个二维矩阵。先选行(RAS),再选列(CAS)。如果连续访问同一行,那只需要一次行激活,后面都是列选通,快得很。但如果频繁换行,每次都要重新激活,延迟就上去了。

我建议你在做性能分析时,重点关注两个场景:

  • 顺序访问:带宽敏感,延迟影响小
  • 随机访问:延迟敏感,行激活开销大

很多优化手段,本质上都是在"顺序"和"随机"之间找平衡。比如预取、缓存行对齐、内存池化,都是为了减少随机访问带来的延迟惩罚。

知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以看到,DRAM和SRAM的差异,如何影响带宽和延迟,最终又怎么落到实际优化策略上。

内存子系统知识体系 SRAM 6T单元 · 静态 · 极快 · 贵 DRAM 1T1C单元 · 动态 · 需刷新 · 便宜 CPU缓存(L1/L2/L3) 主存(系统内存) 两大核心指标:带宽 vs 延迟 带宽计算 频率 × 位宽 × 传输次数 DDR4-3200 → 25.6 GB/s 延迟参数 CL · tRCD · tRP · tRAS 行激活延迟是关键瓶颈 优化策略:顺序访问 · 预取 · 缓存对齐 · 内存池化

这张图把本章内容串起来了。从SRAM和DRAM的选型开始,到带宽和延迟的计算,最后落到优化策略上。你可以在实际项目中,对照这张图来定位问题。

一个小技巧:做性能分析时,先判断你的应用是带宽敏感还是延迟敏感。如果是带宽敏感,优先优化数据布局和预取策略;如果是延迟敏感,那就得在内存选型和访问模式上下功夫。

好了,这一章的内容就到这里。内存子系统是个大话题,咱们后面还会深入聊。记住一句话:没有最好的内存,只有最合适的。


公众号:蓝海资料掘金营,微信deep3321