DRAM刷新机制详解:集中式、分散式与异步式刷新

发布时间:2026/9/30 2:16:32

DRAM刷新机制详解:集中式、分散式与异步式刷新 翻计组的教材看到DRAM刷新这一节很多人第一反应是三个名词长得像、定义绕背完就忘。集中式刷新、分散式刷新、异步式刷新说到底就是在回答同一个问题动态存储器的电容会漏电一个刷新周期内必须把每一行都读出来重写一遍这128次、256次甚至8192次刷新操作究竟该怎么塞进正常读写的时间缝隙里。这道题在408里考过在期末卷上更是常客但真正把它讲透的资料不多大部分只给了定义和一张对比表没告诉你为什么会有这三种分法、每个数字是怎么算出来的。我在做存储扩展实验和给同学讲题的过程中把这块内容反复梳理过几遍也踩过不少概念上的坑比如把分散式和异步式混为一谈、算死时间时忘了乘行数。这篇就把DRAM刷新的来龙去脉、参数推导、实现逻辑和常见坑一次性讲清楚不管你是刚学计组的新手还是在准备考试和课程设计看完都能自己动手推一遍。1. 内容整体设计与思路拆解1.1 先搞清楚刷新到底在刷什么动态随机存储器用一个小电容加一个晶体管来存一个比特电容上有电荷表示1没电荷表示0。问题在于这个电容不是理想器件电荷会通过绝缘层慢慢泄漏时间一长原本的1就被读成了0。工程上给出的容忍时间通常是2ms或者64ms也就是说每一行存储单元必须在这个时间窗口内被完整读一遍再写回去把电荷补齐。这个动作就叫刷新。刷新和重写听起来像其实不是一回事重写是破坏性读出之后的恢复读一次就得马上写回刷新是周期性的、按行进行的统一维护不需要外部给列地址行地址由芯片内部的刷新计数器自己产生。理解这一点很重要因为后面三种刷新方式的差异本质上是这128次按行操作在时间轴上怎么排布的差异而不是操作本身有什么不同。1.2 三种刷新方式在平衡同一对矛盾任何刷新策略都要处理一对矛盾刷新要占用时间读写也要占用时间但存储器同一时刻只能干一件事。集中式刷新选择把刷新攒起来在刷新周期的末尾一口气刷完所有行好处是平时的读写节奏完全不受干扰坏处是那段时间存储器和死机一样CPU只能干等。分散式刷新反过来把刷新拆散到每个存取周期里读写和刷新交替进行好处是没有集中的空白期坏处是每个存取周期都被拉长了系统整体速度直接打折。异步式刷新是折中方案既不像集中式那样攒一大块也不像分散式那样每次都搭进去半个周期而是按刷新周期除以行数算出一个固定间隔每隔这么久插一次刷新。三种方式没有谁绝对更好选哪种取决于系统更在乎峰值响应、平均吞吐还是控制复杂度。1.3 本地模型机课设里它处在什么位置很多学校的计组课设会要求做基本模型机用到的是静态存储器或者寄存器堆本身不需要刷新所以不少同学会疑惑学这玩意儿到底用在哪。我个人的理解是刷新这套逻辑虽然不一定直接落在模型机的数据通路上但它训练的是时序资源分配的思维。你在课设里要给取指、译码、执行分配节拍要考虑哪些操作能并行、哪些必须串行这和刷新调度的思路是一模一样的。而且一旦课设要求做存储容量扩展或者老师追问为什么这边不用考虑刷新、那边必须考虑你能不能答上来直接体现你对存储器层次的理解深度。把三种刷新方式吃透答这类追问会轻松很多。2. 核心细节解析与实操要点2.1 集中式刷新把账攒到最后一起还集中式刷新的做法很直接在一个刷新周期内前一段时间正常读写到了末尾拿出连续的一整块时间把所有行依次刷新一遍。假设芯片有128行每刷新一行需要一个存取周期存取周期取0.5微秒那么这一整块时间就是128乘以0.5等于64微秒。在这64微秒里存储器不响应任何读写请求这段空白期业内叫死时间也叫访存死区。它的占比是64微秒除以2000微秒也就是3.2%。这个数字看着不大但如果你是做实时控制的系统一次要停64微秒可能就丢帧了。集中式刷新的优点是控制逻辑极其简单只需要一个计数器和一个到点就刷的状态机不需要在每次读写时都判断要不要插刷新硬件成本低。所以早期一些对峰值延迟不敏感、但对成本敏感的机器会用它。这里有个容易忽略的细节刷新一行只给行地址不给列地址芯片内部会把整行的数据读出并放大再写回所以刷新一个存取周期就够不需要乘列数。2.2 分散式刷新每个周期都搭一把手分散式刷新走的是另一个极端它把刷新打散到每一次访问里。典型实现是把一个工作周期劈成两半前半段用来读或者写后半段用来刷新一行于是存取周期变成了原来读写周期的两倍。比如原来读写一次要0.5微秒现在整个周期变成1微秒其中0.5微秒读写字0.5微秒刷新。这样做的好处是没有集中的死时间存储器的响应看起来是连续的CPU不需要特意为刷新让路。代价也很明显系统速度掉了一半因为任何一次正常的读写都得陪着等一个刷新周期。而且这里有个关键点分散刷新的刷完所有行其实不需要超过一个刷新周期因为每个存取周期都刷一行128个存取周期就把128行刷完了128个周期是128微秒远小于2毫秒也就是说它的刷新频率其实远高于必要值属于过度刷新。理解了这一点你就明白为什么现代内存不用分散式刷新——它是在浪费带宽。2.3 异步式刷新按行平均分配时间片异步式刷新是前两者的折中也是实际系统里最常用的思路。它把整个刷新周期均匀切分给每一行刷新周期2毫秒共128行那么每隔2毫秒除以128也就是15.625微秒就安排刷新一行。这样每一行的刷新间隔都相等既不会像集中式那样攒出一大块死时间也不会像分散式那样每次读写都被拖累。每次刷新只占用0.5微秒占这15.625微秒的3.2%剩下的时间照常读写。这里有个细节值得强调异步式刷新总占用时间和集中式是一样的都是128乘以0.5等于64微秒区别只在于这64微秒是集中放还是分散放。很多人误以为异步式更省时间其实不是它省的是峰值阻塞时间不是总量。它的代价是控制逻辑更复杂需要一个定时器周期性地发出刷新请求还要处理刷新请求和CPU访存请求的优先级仲裁。一般做法是给刷新请求更高优先级或者在CPU不访存的间隙插入刷新这叫透明刷新。2.4 三个参数决定了所有计算所有刷新相关的计算题本质上都围绕三个量转刷新周期、芯片行数、存取周期。刷新周期由器件工艺决定老式芯片是2毫秒现代DDR系列普遍是64毫秒有的还支持温度补偿的动态调整。行数取决于芯片容量和组织方式比如128乘128的芯片是7位行地址、7位列地址行数就是128。存取周期是一次完整读写或一次刷新所需的时间通常在题目里直接给出比如0.5微秒。只要这三个量确定了三种方式的所有时间参数都能推出来。我的习惯是先算一个基准量行数乘以存取周期得到一次完整刷新的总开销再算刷新周期除以行数得到异步刷新的间隔。这两个数一出来集中式的死时间、异步式的间隔、分散式的周期长度就全有了。3. 实操过程与核心环节实现3.1 参数推导以128×128芯片为例完整算一遍设芯片容量是128乘128即128行、128列存取周期为0.5微秒刷新周期为2毫秒。先算一次完整刷新的总开销128行乘以0.5微秒等于64微秒。这就是无论哪种方式都得付出的刷新总量。集中式刷新下这64微秒集中在每个2毫秒的末尾死时间占比64除以2000等于3.2%。分散式刷新下每个存取周期被拉长为1微秒读写0.5微秒加刷新0.5微秒正常读写的有效速度减半但刷新本身不需要额外的集中空白期。异步式刷新下刷新间隔等于2毫秒除以128等于15.625微秒每次刷新占0.5微秒占比3.2%和集中式的总量一致只是分布均匀。如果换成现代内存8192行、刷新周期64毫秒那么刷新间隔就是64毫秒除以8192约等于7.8125微秒这就是DDR里常说的tREFIDDR4手册里写的7.8微秒就是这么来的。你看公式没变只是参数换了。3.2 时间轴推演三种方式画在同一条线上把三种方式放在同一条时间轴上差异一眼可见。集中式的时间轴是读写读写读写……然后刷刷刷刷刷前面很密末尾一段完全空白。异步式是读写读写刷读写读写刷刷新均匀地插在读写之间每个刷新点只有很短一截。分散式是读刷读刷读刷每个周期都被等分成两半节奏最规整但每一拍都比别人长。如果你在纸上画这三条轴会立刻明白为什么异步式最受欢迎它把死时间打碎成不阻塞视野的小点对上层软件几乎是透明的。这里分享一个画图小技巧用不同颜色的方块表示读写时间和刷新时间横向按时间比例画比死记文字定义直观十倍。考试里遇到分析题脑子里有这张图答题就不会乱。3.3 刷新控制器的逻辑实现刷新控制器核心就两样东西一个刷新计数器和一个定时器。刷新计数器保存当前要刷新的行号每次刷新后加一溢出后归零。定时器从刷新间隔倒计时到零发出刷新请求。下面这段Verilog示意代码只保留主干方便理解时序逻辑实际工程里还要加上仲裁和状态机。// 异步刷新逻辑简化示意 reg [12:0] refresh_row; // 行地址8192行需要13位 reg [15:0] refresh_timer; // 刷新间隔定时器 wire refresh_req (refresh_timer 16d0); always (posedge clk) begin if (refresh_req) begin refresh_row refresh_row 1b1; // 行地址递增 refresh_timer REFRESH_INTERVAL; // 重装定时器 end else begin refresh_timer refresh_timer - 1b1; end end拿到刷新请求后控制器要做仲裁如果当前没有读写请求直接插刷新如果有正在进行的读写等它完成再插或者打断低优先级的操作。这一步就是所谓透明刷新和非透明刷新的分界。非透明刷新会强制占用总线CPU性能会受一点影响透明刷新则尽量在CPU不需要访存的时候插进去比如CPU正在执行内部运算时缺点是控制逻辑更复杂需要判断当前是否处在可以插入的窗口。3.4 刷新与访存冲突怎么处理实际系统里刷新请求和CPU读写请求会撞车必须定优先级。常见的策略是刷新优先因为漏刷会导致数据丢失而CPU读写晚几个周期影响有限。但刷新优先也有代价如果CPU正好在做高速突发传输频繁被打断会降低吞吐。所以高端内存控制器通常用信用机制或者批量刷新来平衡平时按tREFI均匀刷新遇到长时间空闲就提前刷掉一些行把刷新额度攒起来等CPU忙的时候少插刷新。这个思路其实和异步式刷新想解决的问题一脉相承都是把不得不做的时间开销挪到最不碍事的位置。理解了这一层你再看内存控制器的手册那些看起来莫名其妙的刷新策略就有了解释。4. 常见问题与排查技巧实录4.1 概念混淆高发区速查表这块内容最容易出错的就是概念辨析我整理了一张速查表把常见混淆点和判定方法列出来做题和复习时对着看效率很高。易混点常见错误理解正确理解刷新与重写把刷新当成重写刷新按行周期进行行地址内部产生重写是破坏性读出后的恢复分散式与异步式认为两者一样分散式每周期都刷存取周期翻倍异步式按固定间隔刷存取周期不变异步式更省时间认为异步总开销小异步与集中总开销相同省的是峰值阻塞时间刷新地址认为要给行列地址刷新只需行地址整行同时刷新刷新周期固定认为所有芯片都是2ms现代DDR多为64ms且随温度动态调整死时间计算只算一个存取周期必须乘行数即行数乘以存取周期提示不同教材对分散式和异步式的措辞略有差异考试务必以本校指定教材的定义为准。唐朔飞版本对两者的区分就是我上面写的白中英版本表述略有不同提前翻一下目录确认别在考场上按错的版本答题。4.2 计算题里最常踩的三个坑第一个坑是死时间忘记乘行数。集中式刷新的死时间是行数乘以存取周期不是单个存取周期很多人一激动就写0.5微秒直接丢一半分。第二个坑是把分散式的存取周期算成原来的三倍。分散式是读写加刷新两段所以是两倍除非题目明确说刷新要占两个时钟那就是三倍一切以题面为准。第三个坑是单位换算。刷新周期2毫秒换成2000微秒64毫秒换成64000微秒很多同学直接按2和64算结果比例差了三个数量级。我的建议是先把所有时间统一到微秒或纳秒再动笔算完检查一遍量级比如死时间占比应该在百分之几这个量级如果算出来是百分之几百那肯定是哪里错了。4.3 工程实现中的几个实操心得第一定时器重装值不要用整周期边界留一点余量因为刷新请求从产生到真正执行还有仲裁延迟卡得太死可能超期。第二刷新计数器的位宽一定要够8192行需要13位用12位就会在第4096行之后绕回导致后面一半行永远刷不到这种bug非常隐蔽现象是系统跑几个小时才出错。第三调试刷新逻辑时可以先把刷新周期缩短到几微秒让它快速暴露问题验证通过再改回正常值。第四用逻辑分析仪抓刷新请求信号和读写信号的时序关系比盯着代码推测靠谱得多我吃过这个亏代码看着没问题实际抓波形发现仲裁状态机有个分支没覆盖导致刷新偶尔被吞掉。5. 三种方式的横向对比与选型建议5.1 一张表看清取舍把三种方式的关键指标放在一起选择的逻辑就清楚了。对比维度集中式刷新分散式刷新异步式刷新刷新时间分布集中在周期末尾每个存取周期按固定间隔均匀分布死时间特征集中长无集中死时间分散短存取周期变化不变变为两倍不变控制复杂度低低较高对系统速度影响峰值受影响整体吞吐下降影响最小典型应用早期低成本系统少数特定场合现代主流内存从表里能看出一个规律越往异步式走控制越复杂但系统时间和带宽的综合表现越好。这也解释了为什么存储器技术演进的方向是控制逻辑越来越重、时间调度越来越精细化。5.2 现代内存为什么往按需刷新走现代DDR系列基本采用异步式刷新的框架但在此基础上做了不少优化。比如把刷新分成细粒度的按行刷新减少单次刷新的阻塞再比如利用温度传感器动态调整刷新周期温度高时缩短、温度低时拉长因为电容漏电速度对温度敏感。这些优化的共同点是把一刀切的固定策略换成按需分配的自适应策略。回到计组的学习上我觉得这块内容的价值不只是记住三种方式的定义而是体会一种思维资源紧张时怎么把一个不得不做的大开销拆成小片塞进空闲的缝隙里。这种思路在流水线调度、缓存替换、内存带宽分配里反复出现是贯穿整个计算机体系结构的一条主线。我个人在实际做实验和复习这块内容时的体会是别一上来就背表格先拿一张纸把128行、0.5微秒、2毫秒这三个数写下来自己动手把三种方式的时间轴画一遍把64微秒和15.625微秒这两个关键数字推出来。推过一遍之后那张对比表你根本不用背因为你已经知道每个格子里的结论是从哪来的。如果后面还打算深入可以顺着异步刷新往下看内存控制器的刷新调度还有按需刷新、温度补偿刷新这些工程话题它们其实就是异步刷新在真实芯片里的落地版本。
延伸阅读

更多相关文章

2026/9/30 2:16:32

Windows单网卡双IP路由配置实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 2:16:32

Opik Prompt Playground:不写代码,也能像做实验一样调提示词

如果你正在开发基于大语言模型的应用,大概率会遇到这样的场景:为了让模型输出更符合预期,你反复修改提示词,然后写一段脚本调用 API,把结果打印出来,再手动对比。改了几版之后,你已经记不清哪一…

2026/9/30 2:11:32

BepInEx插件框架零基础5分钟上手

BepInEx插件框架零基础5分钟上手 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx 是一个给 Unity Mono、Unity IL2CPP 和 .NET 游戏装插件的框架,把模组能力挂进…

2026/9/30 3:21:36

Ubuntu 软件安装避坑指南:apt、deb、Snap 与源码编译

1. 为什么“装个软件”这件小事,在 Ubuntu 上能难倒一大批人我见过太多刚转到 Ubuntu 的人,第一反应都是抱着 Windows 的思维习惯:去浏览器搜“某某软件下载”,点进去找一个 exe 或者 dmg 文件,然后双击、下一步、完成…

2026/9/30 3:21:36

CKA备考:彻底理清ClusterRole与ClusterRoleBinding权限配置

CKA倒计时第24天,今天把RBAC里最容易混淆的一组概念彻底理清:ClusterRole和ClusterRoleBinding。为什么单独拿一天来写这对组合?因为CKA考试里权限相关题目几乎必考,而且大概率不是单纯考Role,而是考集群级授权。我考前…

2026/9/30 3:21:36

VMware安装Ubuntu 22.04完整指南:从激活到开发环境搭建

1. 为什么非得在VMware里装Ubuntu?——从“能跑”到“好用”的真实分水岭你搜“VMware安装Ubuntu”,大概率不是为了凑个Linux界面截图交差,而是真要干活:写Python脚本调试环境、跑Docker容器做微服务测试、搭本地GitLab练DevOps、…

2026/9/30 3:21:36

Docker host网络模式避坑指南:3大坑与4个核心要点全解析

Docker的host网络模式,听名字挺直白,就是把容器直接塞进宿主机的网络栈里。很多新手第一次用的时候,总觉得它会比bridge高级,结果一上手就被各种诡异问题打懵。我今天把最常见的3个坑和4个核心要点一次说清楚,也算给自…

2026/9/30 3:21:36

Linux 文件传输实战:scp、rsync、netcat 三大工具对比与脚本

在两台 Linux 机器之间传文件,这个需求听着基础,真做起来门道不少。绝大多数人最先想到的是 scp,一条命令就能把文件推到另一台机器上;可当你需要同步几十 GB 的目录、或者机器之间只有临时网络环境、再或者 SSH 服务没开而你也没…

2026/9/30 3:16:35

漫无目的刷算法题:从简单题开始,反而成长更快

看到这个标题的时候我乐了。这不就是我的日常吗——晚上九点半洗完澡坐电脑前,本来只想看一眼明天的天气,结果鬼使神差打开算法题库,随手点开一道“简单”,就开始刷了。没有计划表,没有目标清单,纯粹是想动…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑