尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DMA方式核心考点拆解:程序查询、中断与周期挪用一次讲清

DMA方式核心考点拆解:程序查询、中断与周期挪用一次讲清 作为一名考过研、后来又带过几届学生复习408的老学长我可以很肯定地说一句话计算机组成原理里“I/O设备与主机进行信息传送的控制方式”这一节DMA方式是性价比极高又极其容易丢分的一个考点了。翻开王道或者唐朔飞的教材那几页讲程序查询、中断、DMA的文字看着都认识但一做题就原形毕露——尤其是DMA请求频率的计算、DMA与中断的区别、周期挪用和停止CPU访问的辨析错误率常年居高不下。这篇文章我就把DMA方式从头到尾拆一遍。不念教材不堆概念直接讲清楚“DMA到底解决了什么问题”“它内部是怎么工作的”“408真题怎么考它”以及“复习时该怎么下手”。不管你是正在备考408的考研党还是期末被组成原理折磨的本科生又或者是想补一下系统基础的自学者这篇文章都适合你。读完你应该能做到遇到DMA的选择题秒排除干扰项遇到计算题能稳扎稳打把步骤写全。1. 为什么需要DMA程序查询和中断方式到底卡在哪里要理解DMA得先搞清楚它出现之前的世界是什么样的。I/O设备要和主机交换数据本质上就两个问题第一CPU怎么知道设备有没有准备好第二数据从设备到主存或反向这条路谁来搬。1.1 程序查询方式CPU像个盯梢保安最早的方式是程序查询。CPU执行一段循环程序不停去读外设接口里的状态寄存器看设备是不是准备好了。设备没准备好就继续查设备准备就绪了CPU就执行一条数据传送指令把数据从设备接口搬到寄存器再搬到主存里。这个方式的问题极其明显整个轮询过程CPU被独占。假设一个轮询循环需要3~5条指令每条指令平均2个时钟周期一次轮询就要吃掉将近10个周期。如果CPU在2GHz主频下每秒钟能轮询200万次但实际外设可能每秒钟就要传几十万甚至上百万次数据——CPU几乎什么都干不了光顾着盯梢了。1.2 中断方式改善有限依然被高频打断后来有了中断方式。外设准备好之后主动向CPU发出中断请求CPU停下当前程序保存断点和现场跳到中断服务程序里把数据搬走再恢复现场返回原程序。相比程序查询CPU不用再死等了。但中断方式有个核心硬伤每传送一个字或字节都要完整执行一次“请求→响应→保存现场→搬运→恢复现场→返回”的流程。一次中断响应和处理算上保存现场、识别中断源、执行服务程序、恢复现场轻轻松松几十个甚至上百个时钟周期。数据量小还好说一旦面对高速块设备比如磁盘、网卡中断频率高到CPU根本扛不住。我给大家算一笔账。假设一次中断处理需要100个时钟周期CPU主频2GHz外设以1MB/s的速率传送数据每次中断搬运4字节。那么每秒需要25万次中断光中断处理就要2500万个时钟周期约占CPU时间的1.25%。表面看还能接受但如果外设速率提升到100MB/s呢每秒2500万次中断CPU就要付出2.5亿个时钟周期占比直接飙到125%——已经超过CPU全部算力了。1.3 DMA的出发点把“搬砖”外包给专用硬件所以问题就很清晰了不管是程序查询还是中断数据搬运这个动作都是CPU亲手完成的。这就像一个大厨炒菜菜切好了、配料备好了结果每一盘菜出锅都要他自己端到桌子上。端一两盘没事端一百盘就分身乏术了。DMA方式的核心思想就是把“端菜”这个重复劳动外包给专门的硬件——DMA控制器。CPU只需要在开始的时候告诉DMA控制器“从哪搬、搬到哪、搬多少”然后该干嘛干嘛去。搬运过程中CPU完全不需要碰数据。等DMA控制器搬完一整块数据再发一个中断通知CPU“活干完了你来看看结果”。一句话总结程序查询和中断是以CPU为中心每一份数据都流经CPUDMA是以DMA控制器为中心数据在外设和主存之间直接流动CPU只管开头和结尾。2. DMA的核心机制CPU只当指挥官不当搬运工DMA能省下CPU核心在于它改变了一条数据通路。搞清楚这条通路DMA的一大半概念题你都不会再错。2.1 数据通路绕过CPU的中转中断方式下数据从外设接口来到CPU的寄存器再从寄存器写入主存。这中间CPU的寄存器是必经之地数据进出都要占用CPU的执行时间。DMA方式下数据通路变成了这样输入时外设接口 → DMA控制器的数据寄存器 → 系统总线 → 主存输出时主存 → 系统总线 → DMA控制器的数据寄存器 → 外设接口注意数据从头到尾没有经过CPU内部的通用寄存器。CPU在里面扮演的角色只是在预处理阶段写几个寄存器来完成初始化配置之后整个数据块传送过程CPU可以去做自己的事具体能做什么取决于采用哪种传送方式。这就是判断一个系统“是不是DMA方式”的最直观标准。408曾经在选择题里出现过一个干扰项“DMA方式传送数据时需要CPU执行数据传送指令。”这句话是错的真DMA根本不需要CPU执行传送指令。2.2 三种传送方式停止CPU访问、周期挪用、交替分时DMA拿到总线控制权之后怎么和CPU协调使用总线是一个必须解决的问题。教材上给出了三种方案448考研真题在选择题里特别喜欢拿它们的区别做文章大家务必对照记清楚。传送方式总线使用策略对CPU的影响控制复杂度适用场景停止CPU访问DMA独占总线连续传送完整个数据块才释放CPU完全无法访问主存可能停摆最简单高速块设备、CPU有Cache或可等待的场合周期挪用DMA只在CPU不用总线的周期“见缝插针”每挪一个周期搬一个数据CPU偶尔慢一拍基本无感知中等通用计算机中最常见交替分时总线时间固定分片CPU和DMA轮流使用CPU几乎无感知最复杂高速外设与CPU速度匹配的专用系统停止CPU访问这种方式逻辑最简单。DMA控制器申请总线成功后就把总线牢牢攥在手里直到整块数据传送完毕才交还。优点是控制简单、传送连续高效缺点是如果CPU没有Cache取指令都得访存总线被占就等于CPU原地发呆。所以这种方式的代价是CPU大量空闲。周期挪用是408最常考的一种。它的思路是CPU执行指令时并不是每个时钟周期都需要访问主存——比如指令在Cache里命中或者ALU在做纯计算——这时候总线实际上是空闲的。DMA控制器就在这些空闲间隙里“偷”一个总线周期来完成一次数据传送。如果DMA要传送数据时总线恰好被CPU占着DMA就强制CPU暂停一个周期让总线先给自己用。这种方式对CPU的拖累远小于停止CPU访问但代价是DMA每传一个字都要和CPU“抢”一次总线控制逻辑复杂一些。交替分时是一种更“公平”的方案。它将一个机器周期分成两个时间片前半段给CPU后半段给DMA两者交替使用总线互不干扰。硬件调度最复杂CPU感知最轻但要求CPU和外设的速度能很好地匹配所以通用计算机中不常用。做题的时候记住一个排序就够了对CPU运行的干扰程度停止CPU访问 周期挪用 交替分时传送速率和控制灵活性往往相反交替分时最好但硬件成本也最高。3. DMA控制器的组成与一次完整传送流程DMA不是魔法它是一块实实在在的硬件。这块硬件的内部结构就是DMA相关寄存器题的出题源头。3.1 DMA控制器里藏着哪些寄存器一个典型的DMA控制器至少包含以下几类关键寄存器具体名称不同教材可能略有出入但功能一一对应主存地址寄存器MAR存放数据要写入的主存首地址每传送一个数据单元后自动加1。它是DMA“知道往哪搬”的依据。数据寄存器DR暂时缓存外设和主存之间流通的数据起缓冲作用。它的存在是为了协调外设和总线数据宽度不一致的问题。字计数器WC记录还剩多少个数据单元没传送每传送一个就减1减到0表示整块数据传送完毕。控制/状态寄存器CR存放传送方向读/写、传送单位、中断允许标志等控制信息CPU通过写这个寄存器来“指挥”DMA。设备地址寄存器DAR指定与哪个外设打交道。这一项有些教材归入接口逻辑里但概念上要清楚。这里我强调一个很容易混的点DMA控制器里的主存地址寄存器里放的是主存地址不是外设地址。外设地址由设备选择逻辑处理不要在上考场的时候把这两个搞混。3.2 一次DMA传送的四个阶段完整的一次DMA传送可以拆成四个阶段这是整个DMA流程题的主干骨架。第一阶段预处理CPU负责。CPU执行一段I/O指令把主存缓冲区首地址写入MAR、把传送的字节数或字数写入WC、把传送方向和设备编号写入CR最后启动外设。第二阶段数据传送DMA控制器负责。外设准备好一个数据单元后向DMA控制器发出DMA请求信号DMA控制器收到后向总线仲裁器申请总线使用权获准后DMA控制器控制总线让数据在外设接口和主存之间走一个来回。每传完一个数据单元MAR加1、WC减1。重复这个过程直到WC减到0。第三阶段传送完毕检测DMA控制器负责。当WC减到0DMA控制器知道整块数据传完了产生一个“传送结束”的信号。第四阶段后处理CPU负责。DMA控制器向CPU发出中断请求CPU响应中断进入中断服务程序完成数据校验、处理传送过程中可能出现的错误、决定是否安排下一次DMA传送等善后工作。这四个阶段里考生最容易犯的错就是把“DMA请求”和“中断请求”当成一回事。实际上它们出现在完全不同的环节DMA请求是外设发给DMA控制器的含义是“我这里有一个数据要传了”总线请求是DMA控制器发给总线仲裁器的含义是“我要用一下总线来搬数据”中断请求是DMA控制器在整块数据传送结束后发给CPU的含义是“任务完成了请来验收”。三种请求分别发生在“搬运中”“搬运前的总线申请”“搬运完成之后”。选择题里如果出现“数据传送过程中CPU会收到中断请求”这种说法直接判断为错误。3.3 DMA与中断的关系靠中断开始也靠中断结束很多人问DMA到底是不是中断的一种答案是不完全是但它们有明确的分工关系。DMA的预处理通常由程序方式触发也可以理解为一个广义的“启动”过程数据传送过程中完全不依赖中断数据传送完成之后DMA又必须借助一次中断来通知CPU做善后。所以准确的说法是DMA以中断开始、以中断结束但中间的搬砖过程对中断免疫。这也是DMA和中断方式最本质的差异所在。中断方式每传一个数据单元就要中断CPU一次DMA传送一个数据块才中断一次。假设一块有1024个字中断方式就要打断CPU 1024次DMA只打断两次——一次启动一次收尾。4. 408怎么考DMA经典计算、常见误区与新题型趋势前面那些概念是地基现在聊最实际的408真题里DMA到底以什么形态出现。我翻了近几年统考真题和各大辅导书上的热门模拟题DMA的考查基本集中在三类带数字的性能计算、概念辨析选择、综合应用分析。4.1 经典计算题DMA请求频率与CPU性能损耗这是DMA分值最高、失分也最多的题型全国平均正确率常年不高。我先给一个最典型的清晰版本大家感受一下套路**例题**主机采用DMA方式从外设接收数据外设的数据传输率为8MB/sDMA每次传送16位数据。CPU时钟频率为500MHz每次DMA传送需要占用4个CPU时钟周期。忽略其他开销DMA传送一共占CPU时间的比例是多少解法拆成三步走算每秒DMA请求次数。传输率8MB/s每次传送16位也就是2字节所以每秒请求次数 8MB / 2B 4M次/秒。这里的M按10^6算还是按2^20算题目如果没明示标准做法是按10^6处理但要注意看清题干。算每秒因DMA损失的时钟周期数。每次传送占用4个周期每秒总损耗 4M × 4 16M个时钟周期。求占CPU时间的比例。CPU主频500MHz占比 16M / 500M 3.2%。这题的陷阱在单位换算和计算顺序。有的题目会把外设传输率写成“120MB/s”“每次DMA传送一个4B的字”我自己当年做的时候最容易错的就是忘了把MB换算成字字节数直接把传输率当成请求次数用。4.2 进阶计算涉及块的请求次数与握手开销还有一类更综合的题目会把磁盘参数、块大小、响应时间和DMA传送速率搅在一起考。典型结构是这样**例题**某磁盘转速7200转/分每转一圈可读出64个扇区每个扇区512B磁盘接口以DMA方式每次从缓冲区读出4个扇区的数据后申请一次DMA传送。CPU每次响应DMA请求需要5μs握手时间其余时间DMA占用总线传送数据DMA数据传送速率为56MB/s。试问磁盘每秒向CPU发出多少次DMA请求CPU用于处理DMA请求的时间占比是多少这题得先算磁盘持续传输率7200转/分120转/秒每圈数据量64×512B32KB所以持续传输率120×32KB/s3840KB/s。每秒DMA请求次数 3840KB/s ÷ (4×512B) 3840KB ÷ 2KB 1920次/秒。每次DMA传送的数据量是2KBDMA本身占用总线的时间 2KB ÷ 56MB/s≈35.7μs。CPU花在“响应DMA请求”上的时间占比 1920次 × 5μs / 1s 9.6ms/s ≈ 0.96%。这道题的考点很隐蔽它区分了“CPU响应DMA请求的握手时间”和“DMA传送本身占用总线的时间”两个概念。前者是CPU的开销后者是总线资源的占用不算CPU时间。很多考生把两者混在一起算得出一个高出好几倍的错误答案。看到这类题先问自己一句“这个时间花在CPU上还是花在总线上”分清楚之后再动笔。4.3 概念辨析选择题的常见误区DMA的选择题每年花样翻新但错误选项的设置套路非常固定我把高频坑给大家列一下“DMA方式传送过程中不需要CPU参与。”错。数据搬运不需要CPU但预处理和后处理都需要CPU执行程序。“DMA方式每传送一个数据就向CPU发出一次中断请求。”错。中断是整块传送结束后才发出的不是在每个数据单元传送过程中。“DMA方式只能用于块设备不能用于字符设备。”错。字符设备比如声卡同样可以用DMA只是块设备更适合体现DMA的优势。“周期挪用方式下DMA每传送一个数据都会占用一个总线周期。”对。这是周期挪用的正确定义。“DMA传送过程中CPU完全停止工作。”错。只有“停止CPU访问”方式下CPU才会因无法访存而停摆周期挪用和交替分时都不会让CPU完全停下来。“DMA数据传送速度快因为DMA比中断方式优先。”这个说法不严谨。DMA快在“数据不经过CPU搬运”和优先级是两码事。还有一类特别刁钻的题干“当DMA控制器与CPU同时申请总线时为什么通常让DMA优先”答案的核心就一句话**CPU等待一个总线周期最多只是慢一拍而高速外设如果不能在规定时间内完成数据传送后续数据可能来不及接收导致数据丢失甚至覆盖错误。**这个点背后的逻辑是“谁等得起谁靠边”408近几年特别喜欢在选择题里拿这个做大文章。4.4 综合题新趋势DMA开始和Cache、多设备“合流”了2024年统考第45题出来后很多辅导老师都在强调一件事DMA的考查已经不只是孤立的计算了而是开始结合中断向量、异常处理、总线仲裁甚至Cache一致性这些机制出综合题。举个很典型的扩展方向外设通过DMA向主存写入数据后如果Cache里还留着旧数据CPU后续读Cache就会拿到过期值造成数据不一致。现代计算机解决这个问题要么让DMA数据也经过Cache并维护一致性要么在DMA写入后对相应Cache行做失效处理。408大纲没有要求大家深入设计细节但选择题的某个选项完全可能以“DMA方式下需要考虑Cache与主存的一致性问题”的正确表述出现。另一个方向是把多个DMA设备放在同一道题里要求分析总线仲裁优先级。比如显示器需要定时刷新数据如果迟到会导致画面撕裂优先级应该高磁盘吞吐量大但可以稍微等待优先级次之。这种“实时性越强优先级越高”的推理逻辑比死记硬背重要得多。5. 备考DMA的实操路线教材搭配、对比记忆与自检最后这部分我把自己带学生复习DMA时用过的一套方法论整理出来都是踩过坑之后沉淀下来的东西。5.1 三种控制方式的对比表亲手填一遍不要直接背教材上的总结表找一张白纸把程序查询方式、中断方式、DMA方式按照这六个维度自己填一遍谁启动传送、传送单位是什么、CPU参与程度、响应时机、硬件复杂度、适用设备类型。填不出来的格子才是你真正需要回去翻书的地方。填完之后你的参考标准大致是这样对比维度程序查询方式中断方式DMA方式传送单位字/字节字/字节块CPU参与全程参与轮询和数据搬运每次响应中断搬运一个数据只参与预处理和后处理传送过程中CPU状态被完全占用被打断但断点后还能继续原来的程序大多数时间无需介入硬件开销无额外硬件中断逻辑简单DMA控制器较复杂适用场景低速简单设备中低速设备、数据量适中高速块设备如磁盘、网卡这张表填完概念题的正确率基本就有保证了。5.2 唐朔飞看原理王道刷题型复习资料搭配上我的建议是第一遍学原理以唐朔飞《计算机组成原理》为主重点看DMA控制器硬件结构和传送流程那两节把“四个阶段”的每一步对应到寄存器变化上第二遍刷题以王道为主把书里I/O控制方式这一章的题目全部吃透尤其是计算题的步骤要落实到草稿纸上不能只看答案解析。如果你时间特别紧只够看一个版本那优先王道但遇到“DMA为什么优先”这种硬核原理题时还是要回唐朔飞的教材翻一下硬件细节不然选择题换个说法就翻车。5.3 自测清单考前30分钟用考试前冲刺阶段不用再刷大量的题了拿下面这份自检清单过一遍答得上来就基本稳了DMA控制器里负责记录主存地址并自动加1的寄存器叫什么每传送一个数据单元字计数器是加1还是减1什么时候产生结束信号停止CPU访问和周期挪用的根本区别是什么整个数据块传送完成后DMA向谁发出什么请求CPU此时要做什么为什么DMA请求的优先级通常高于CPU访存请求一次完整的DMA传送哪些阶段由CPU执行程序完成哪些阶段由DMA硬件完成这六个问题如果你能不看笔记用三分钟以内说清楚DMA这部分的把握就相当可以了。5.4 关于错题复盘的一个建议最后分享一个小习惯我在带复习的时候一直让学生把所有DMA错题做三栏标记——“错在哪一步概念/计算/读题”、“正确思路一句话”、“需要回炉的知识点”。比如一道计算题错了如果标记是“计算MB和M次没换算清楚”那就只需要加强单位换算练习如果标记是“概念把整块结束中断当成每个数据都有中断”那就要回去重看流程四阶段。这样做的好处是你不会在同一个坑里反复掉进去。我见过太多学生一周内同一道DMA计算题错三遍每次都说是“粗心”——其实根本不是粗心是流程没有建模清楚。把每一步写成文字流程DMA的计算题就是小学算术。DMA这个知识点在408里只是I/O章节的一小段但它背后的思想特别值钱能交给专用硬件做的重复劳动就不要让通用CPU去扛。这个思路往前推一步是通道、I/O处理器往后推一步是网卡的DMA环形队列、NVMe的PCIe队列机制、GPU的异步拷贝甚至RDMA远程直接内存访问——全是“搬数据不占CPU”这条路的徒子徒孙。把这个点想透了你收获的绝对不止一道选择题的分值。
返回列表