
1. 项目概述从“易失”到“稳定”DRAM刷新的核心逻辑在计算机系统里内存是CPU的“工作台”所有正在运行的程序和数据都要先搬到这个台面上才能被快速处理。而构成这个工作台最主要、最普遍的“板材”就是动态随机存取存储器也就是我们常说的DRAM。和它的“兄弟”静态RAMSRAM不同DRAM的存储单元结构极其简单一个晶体管加一个电容就能存一位数据1或0这种设计带来了高集成度和低成本的优势让我们能用几百块钱就买到16GB甚至32GB的内存条。但天下没有免费的午餐这个精巧设计也带来了一个与生俱来的“阿喀琉斯之踵”电容会漏电。电容里存储的电荷会随着时间慢慢泄漏导致电压下降原本代表的“1”可能就变成了“0”数据就丢失了。为了防止这种“失忆”我们必须定期给这些电容“充电”也就是刷新Refresh。这个“定期”非常严格行业标准是每64毫秒ms必须对内存中的所有行Row完成一次完整的刷新操作。听起来很简单不就是定时充电吗但当你考虑到现代一根DDR4内存条可能有数十亿个存储单元组织成数万个行而内存控制器还要同时处理CPU源源不断的读写请求时如何安排这个“充电”日程表就成了一门平衡性能、功耗和复杂性的艺术。今天我们就深入DRAM的内部拆解集中刷新、分散刷新和异步刷新这三种经典策略看看工程师们是如何在“保持记忆”和“高效工作”之间走钢丝的。2. DRAM刷新机制的核心原理与约束条件要理解三种刷新方式的优劣我们必须先回到DRAM存储单元本身和它工作的硬约束上。这就像你要管理一个超大型停车场内存阵列每个车位存储单元里的车电荷会慢慢漏气你必须每隔64ms就巡逻一遍给所有车胎打一次气刷新。但巡逻车内存控制器只有一辆而且车主CPU还时不时要进来停车或开车读写操作。2.1 存储单元结构为何非刷新不可一个DRAM存储单元的核心是一个MOSFET晶体管和一个寄生电容。字线Word Line控制晶体管的开关位线Bit Line用于读写数据。当写入“1”时位线电压对电容充电写入“0”时电容放电。读取时打开晶体管电容上的电荷会共享到位线上通过灵敏放大器Sense Amplifier检测电压变化来判断是1还是0关键在于这个读取过程是破坏性的读取后电容上的电荷会改变所以灵敏放大器在判断后必须立即将数据写回这其实完成了一次对该单元的刷新。问题在于即使不进行任何读写电容的电荷也会通过晶体管的漏电流等途径缓慢泄漏。典型的数据保持时间Retention Time可能在几十毫秒量级。为了保证在最恶劣条件下高温、工艺偏差数据也不出错JEDEC固态技术协会制定了严格的规范每64ms必须对所有行进行一次刷新。这个64ms周期称为刷新间隔Refresh Interval, tREFI。2.2 刷新操作的具体过程不仅仅是个“充电”动作刷新不是简单地对电容通电。一次标准的刷新操作对象是一行Row的所有存储单元。其过程可以分解为几个精确的时序步骤行激活Activate内存控制器发出刷新命令DRAM芯片内部的行地址生成器RAS Only Refresh或控制器提供行地址选中特定行。该行的字线电压升高打开这一行所有单元的晶体管。灵敏放大器放大与重写这一行所有单元电容上的电荷被共享到各自的位线上。灵敏放大器会检测并放大位线上的微小电压差将其恢复为全幅度的逻辑电平“1”或“0”并立即将这个确定的值重新写回电容中。这个过程完全恢复了电容的电荷。预充电Precharge完成重写后该行被关闭字线电压拉低位线被预充电到一个基准电压为下一次操作做准备。整个刷新操作消耗的时间是固定的由DRAM的时序参数决定主要包括tRFCRefresh Cycle Time。对于DDR4内存tRFC通常在350-550纳秒ns之间这个时间内被刷新的整个存储体Bank是无法进行正常读写操作的。这就是刷新带来性能损失的根本原因。2.3 核心矛盾与设计目标由此我们可以提炼出刷新机制设计的核心矛盾约束必须在tREFI(64ms) 内完成所有N行例如8192行的刷新。代价每次刷新一个行会使对应的Bank“忙碌”tRFC时间。目标在满足硬约束的前提下如何安排这N次刷新操作以最小化对正常内存访问性能的影响降低平均访问延迟避免长时阻塞同时可能兼顾功耗控制。三种刷新方式就是针对这个调度问题的三种不同策略。3. 方案一集中刷新——简单粗暴的“闭关修炼”集中刷新Burst Refresh是最容易理解的策略。它的思路是把所有麻烦事集中到一起解决在每一个64ms的刷新周期内划出一段连续的时间在这段时间里什么都不干专心致志地把所有行一口气全部刷新完。3.1 工作原理与时序图景假设一个DRAM芯片有8192行tRFC为350ns。采用集中刷新策略时在每一个64ms的周期末尾或开头会划出一段“刷新窗口”。在这段窗口内内存控制器连续发出8192个刷新命令。总耗时 行数 ×tRFC 8192 × 350ns ≈ 2.87ms。在这约2.87ms的时间内内存控制器无法处理任何CPU的读写请求内存处于完全不可用的状态。这就像图书馆内存在每个月的最后一天64ms周期末闭馆2.87ms管理员内存控制器飞奔着把所有书架行整理、维护一遍。其余61.13ms的时间图书馆则完全开放高效接待读者CPU。3.2 优势与适用场景分析集中刷新的最大优势在于设计简单控制逻辑极其容易实现。在早期CPU速度相对较慢、内存访问不那么频繁的时代这种方式的缺点并不突出。其控制状态机只需要两种状态“正常访问模式”和“集中刷新模式”切换逻辑清晰。此外在某些对最大连续可用时间有要求的特殊实时系统中集中刷新可能反而有优势。因为系统可以明确知道那一段“死区时间”2.87ms会在何时出现从而可以在软件层面进行精确的任务调度避开这段不可用区间确保关键任务在长达61ms的连续时间内拥有确定性的内存访问延迟。3.3 致命缺陷与实际问题然而在现代高性能计算系统中集中刷新的缺点是无法接受的“死区”时间过长2.87ms对于一颗主频3GHz的CPU来说意味着超过800万个时钟周期被浪费。在此期间所有需要访问内存的指令、DMA传输都会被挂起导致CPU流水线停滞、I/O性能骤降系统会出现明显的卡顿。违背现代系统设计原则现代处理器和操作系统追求的是低延迟、高响应度。这种周期性的、长时间的系统级阻塞是灾难性的会严重劣化用户体验和整体吞吐量。功耗峰值短时间内连续进行大量刷新操作会导致电流急剧上升产生显著的功耗和电流峰值IR Drop对电源完整性设计提出挑战也可能加剧芯片局部发热。因此集中刷新在当代的通用计算机PC、服务器内存系统中已被淘汰仅在某些对成本极度敏感或具有特殊时序要求的嵌入式控制器中可能还有所见。注意在模拟或学习DRAM原理时集中刷新是最容易用硬件描述语言如Verilog建模实现的方式因为它状态少。但在实际产品选型或系统性能评估时必须意识到其带来的长阻塞风险。4. 方案二分散刷新——化整为零的“细水长流”为了解决集中刷新带来的长时阻塞问题分散刷新Distributed Refresh采用了完全相反的思路把一次大的“闭关”打散成无数个微小的“休息”把刷新操作均匀地分散到整个64ms周期中去。4.1 工作原理与调度算法继续使用之前的例子8192行64ms刷新周期。分散刷新要求在每个tREFI周期内必须完成所有行的刷新。因此相邻两次刷新命令的间隔时间是固定的。计算方式刷新间隔 tREFI/ 行数 64ms / 8192 ≈ 7.8μs。这意味着内存控制器需要每隔大约7.8微秒就插入一个刷新命令刷新一行。在64ms内正好完成8192次刷新。这种调度就像图书馆安排了一个机器人管理员它每隔7.8微秒就暂停一下手头接待读者的工作花350ns去整理一行书架然后立刻继续工作。从宏观上看图书馆始终处于“营业”状态没有明显的闭馆时间。4.2 性能优势与影响量化分散刷新彻底消除了集中刷新那种长的“死区”将刷新带来的性能惩罚均匀地“摊销”到了整个时间段内。对于CPU来说内存访问延迟的增加是微小且均匀的平均来看每7.8μs会遇到一个350ns的阻塞窗口。这相当于将内存的可用带宽降低了大约tRFC / (tREFI/行数) 350ns / 7.8μs ≈ 4.5%。虽然仍有性能损失但这种损失是平滑、可预测的不会引起系统级的剧烈卡顿。CPU的流水线和其他访存请求只需要等待这个很短的刷新周期结束即可现代处理器的乱序执行引擎可以很好地容忍这种微小停顿。4.3 实现复杂性与潜在挑战分散刷新在性能上优势明显但其实现复杂度高于集中刷新精确的定时器内存控制器需要维护一个高精度的定时器确保每7.8μs准时发出刷新命令不能过早或过晚。过早会浪费带宽过晚则可能违反64ms完成所有刷新的硬性规定导致数据丢失。命令调度仲裁刷新命令与正常的读写命令ACT, READ, WRITE, PRE共享命令总线。控制器需要一个仲裁器来决定在每个命令周期是发送刷新命令还是正常访问命令。通常采用优先级策略确保刷新命令的间隔得到保证同时在刷新命令到来时如果正在处理一个长突发传输可能需要插入等待。功耗表现由于刷新操作被均匀分散电流变化相对平稳避免了大的峰值电流有利于电源网络设计和热管理。实操心得在编写内存控制器仿真模型或学习相关算法时实现分散刷新的关键是一个自由运行的计数器。计数器以内存时钟驱动每计数到(tREFI / 行数) / 时钟周期这个值时就置起一个“刷新请求”标志。命令调度器看到这个标志会在当前命令总线空闲或当前操作告一段落时优先插入一个刷新命令。完成后清零标志计数器重新开始计时。要特别注意计数器复位和边界条件的处理防止累积误差导致长期来看刷新行数不足。5. 方案三异步刷新——见缝插针的“机会主义者”异步刷新Asynchronous Refresh有时也称为“自适应刷新”或“机会刷新”是一种更智能、更激进的策略。它不像分散刷新那样“刻板地”定时刷新而是试图利用内存总线空闲的“机会窗口”来执行刷新操作。5.1 核心思想与触发机制异步刷新的核心原则是只要保证64ms内刷完所有行刷新命令不必按固定时间间隔发出而是尽可能在系统不访问内存的时候进行。其触发机制通常是基于内存空闲检测。内存控制器会持续监测命令总线和地址总线的活动状态。当检测到一段时间内没有新的读写命令到来即内存处于空闲或低负载状态时控制器就会判断此时是一个“机会窗口”然后插入一个或多个刷新命令。例如当CPU正在执行大量寄存器操作或缓存命中率极高的密集计算时访存请求会很少此时就会产生大量的机会窗口用于刷新。5.2 性能收益与理论最佳情况在理想情况下异步刷新可以将刷新带来的性能影响降到最低。如果系统内存访问存在明显的“潮汐现象”——即繁忙时段和空闲时段交替出现——那么所有刷新操作都可以被安排到空闲时段完成。在繁忙时段内存带宽100%用于数据处理没有任何刷新开销。这相当于实现了“零开销”刷新当然前提是空闲时段足够完成所有必要的刷新。这就像图书馆的机器人管理员变得非常聪明它只在没有读者咨询的时候才去整理书架。如果读者络绎不绝它就专心服务一旦出现空闲它立刻见缝插针地工作。5.3 实现难点与风险控制然而异步刷新是实现难度最高、风险最大的一种策略“刷新债务”风险这是最大的挑战。如果系统持续高负载长时间没有空闲窗口刷新命令就无法发出。控制器必须记录一个“待刷新行计数器”和一个“最后期限计时器”。当空闲窗口迟迟不来而最后期限某行必须在64ms内被刷新临近时控制器将被迫在活跃时段插入刷新命令此时的行为会退化为类似分散刷新甚至更糟因为可能集中补刷多行。如果设计不当在最坏情况下可能导致数据丢失。预测算法复杂度高级的异步刷新控制器可能会尝试预测未来的内存空闲期或者与操作系统调度器协作在任务切换等已知的空闲点进行刷新。这大大增加了硬件和软硬件协同设计的复杂度。验证与测试困难由于刷新时机不确定其行为是动态的、与负载强相关的。要全面验证在各种极端负载场景下控制器都能保证不违反64ms的刷新限制需要极其复杂的验证环境和测试向量。功耗管理将刷新集中在空闲期执行可能导致空闲期的功耗并不低这不利于移动设备等对功耗敏感场景的节能管理。因此纯粹的、激进的异步刷新在实际的商用DRAM控制器如CPU内的内存控制器中并不常见。更常见的是一种混合策略以分散刷新为“保底”机制确保每隔一个最大时间间隔必须刷新同时结合机会刷新。例如JEDEC标准定义的“自动刷新”命令通常由控制器以近似分散刷新的方式发出但一些控制器会在总线空闲时将多个刷新命令“背靠背”发出提前完成一部分刷新任务从而在后续的繁忙时段获得更长的连续可用时间这可以看作是一种温和的异步刷新优化。6. 三种刷新方式的对比与选型考量为了更直观地理解三种方式的区别我们可以从多个维度进行对比特性维度集中刷新 (Burst)分散刷新 (Distributed)异步刷新 (Asynchronous)核心策略周期末/初集中完成所有刷新将刷新均匀分散到整个周期利用内存空闲期进行刷新性能影响产生长的“死区”阻塞严重性能抖动大性能影响均匀、微小延迟增加可预测理想情况下影响最小但最坏情况可能退化实现复杂度非常简单中等需精确定时和仲裁非常复杂需空闲检测、债务管理功耗特征刷新期功耗峰值高功耗平稳功耗与负载相关可能空闲期功耗高数据安全性高刷新周期明确高刷新周期明确有风险依赖控制器设计保证适用场景早期内存、简单控制器、特殊实时系统现代通用计算机的主流标准方式研究领域、特定优化型控制器常与分散式结合对访问延迟周期性地产生极高延迟均匀增加少量固定延迟通常延迟最低但可能有不可预测的延迟尖峰选型深度解析 对于现代计算机系统从手机到数据中心服务器分散刷新是事实上的标准和基线。所有符合JEDEC标准的DDR SDRAM内存条其默认的自动刷新模式就是分散刷新。内存控制器以tREFI为周期平均地发出刷新命令。那么集中和异步是否就毫无价值了呢并非如此。集中刷新的价值在于其极简的实现模型。在学习计算机组成原理、进行FPGA原型开发或设计极低成本的嵌入式内存控制器时集中刷新是一个很好的起点。它帮助你理解刷新这个基本概念而不用一开始就陷入复杂的调度逻辑。异步刷新代表了性能优化的前沿方向。尽管纯异步刷新风险高但其思想被广泛吸收。例如在服务器领域有一种称为“刷新省电”的功能就是在预测到内存将进入低功耗状态时提前进行一批刷新从而延长低功耗状态的驻留时间。这本质上是异步刷新思想在功耗管理上的应用。再比如一些研究中的内存控制器会与操作系统协同在进程切换或CPU进入低功耗C-State时批量执行刷新操作。实操心得在仿真与调试中的观察在利用SystemVerilog等工具对内存控制器进行仿真时你可以清晰地观察到三种策略的波形差异。集中刷新会在长段时间内命令总线只有连续的“REF”命令分散刷新则是每隔一个固定间隔如7.8us出现一个“REF”脉冲像时钟一样规律而异步刷新的波形则显得“杂乱无章”“REF”命令成群地出现在读写命令的间隙中。调试异步刷新控制器时最关键的是设计一个能产生持续高压力的访存序列测试用例观察“待刷新行计数器”是否会被逼到极限以及控制器强制插入刷新的机制是否正常工作。这往往是设计中最容易出错的角落。7. 深入实践现代DRAM刷新技术的演进与挑战了解了三种基本方式后我们还需要将视野扩展到更前沿的实践因为DRAM的刷新问题随着容量增长而日益严峻。7.1 刷新开销的放大与“刷新惩罚”随着DRAM容量从GB级向TB级迈进芯片内部的行数N急剧增加。虽然tREFI仍是64ms但需要刷新的行数变多了。这意味着在分散刷新模式下刷新命令的间隔tREFI/N会变短。例如对于容量更大的内存颗粒行数可能达到16384甚至32768刷新间隔会缩短到3.9μs或更短。刷新命令占用的时间比例(tRFC * N) / tREFI在增大导致可用带宽的损失从早期的~2%逐渐增加到超过8%这在数据中心等对带宽极度敏感的场景中已成为不可忽视的“刷新惩罚”。7.2 高级刷新管理技术为了应对挑战业界发展出了更精细的刷新管理技术智能刷新并非所有存储单元的数据保持时间都是64ms。工艺的微缩导致单元间性能差异变大有些“体质好”的单元能保持数据数百毫秒而“体质差”的单元可能只能保持几十毫秒。智能刷新技术试图监测或预测不同行的保持时间对“体质差”的行进行更频繁的刷新如32ms一次对“体质好”的行则降低刷新频率如128ms一次。这能在保证可靠性的前提下显著减少总刷新次数。这项技术需要芯片内部集成监测电路并增加了控制复杂度。刷新调度优化这是异步刷新思想的深化。内存控制器不仅看总线空闲还会结合内存访问的地址局部性。如果知道接下来一段时间CPU将频繁访问Bank A那么控制器可以优先刷新其他空闲的BankBank B, C, D...。现代内存控制器通常有多个Bank可以并行处理读写和刷新不同Bank间优秀的调度算法能最大化重叠这些操作隐藏刷新延迟。Fine-Granularity RefreshJEDEC在DDR5标准中引入了更细粒度的刷新模式。除了标准的64ms刷新所有行还可以选择32ms刷新一半的行例如奇数行下一个32ms刷新另一半偶数行。这样每次刷新操作影响的行数减半tRFC时间也可能更短从而进一步平滑性能影响。7.3 系统级协同优化刷新不仅仅是内存控制器的责任现代操作系统和应用程序也能间接影响刷新效率。内存电源管理当系统进入休眠或部分内存通道空闲时操作系统可以指示内存控制器进入自刷新模式。在此模式下DRAM芯片内部自己生成刷新时序完全不需要外部控制器干预功耗极低。这是另一种形式的“集中”但低功耗的刷新。负载均衡如果操作系统或虚拟机监控器能感知内存刷新带来的周期性延迟理论上可以尝试将关键任务或实时线程的调度避开内存控制器最可能插入刷新命令的时间点在分散刷新下这是有规律的。但这需要硬件暴露更详细的时序信息目前还不是主流做法。理解DRAM的刷新从三种基本方式入门最终要看到的是一个在可靠性、性能、功耗和成本之间持续进行多维优化的动态战场。它不是一个枯燥的定时任务而是计算机体系结构中一个体现硬件与软件、标准与创新、约束与妥协的经典案例。下次当你为自己的电脑选购内存条看到CL值、频率之外的那些tRFC、tREFI参数时或许能更深刻地体会到每一个纳秒的背后都有一场精密的调度战争。