☰
深入理解DMA:周期窃取原理、中断对比与CPU利用率计算
2026/9/27 1:45:12 网站建设 项目流程

先声明一下,这篇文章只聊技术本身。DMA(直接存储器访问)是我复习408时觉得最“拧巴”的一个点,它既不像中断那样靠打断CPU来办事,又不完全脱离CPU存在,理解透了之后再看真题里的计算题,基本就是套公式。这篇文章我会把DMA的来龙去脉、控制器内部结构、和中断方式的区别、周期窃取原理,以及真题常考的计算套路全部拆开揉碎讲清楚,按考研复习的实际需求来写,适合正在啃王道或唐朔飞教材的考生参考。

1. 为什么要搞出DMA这个东西

1.1 程序中断方式的问题出在哪

在讲DMA之前,得先回顾一下I/O设备和主机之间信息传送的几种控制方式。按408大纲的顺序,依次是程序查询方式、程序中断方式、DMA方式,通道和I/O处理机一般了解即可。程序查询方式最简单,CPU不断轮询设备状态,一个字节一个字节地等,效率低到令人发指。程序中断方式改进了查询的忙等,设备准备好数据之后主动打个中断报告给CPU,CPU停下来处理一次数据传送,然后再回去干活。这对于中低速设备(比如键盘、打印机)来说是够用的。

但问题在于:程序中断方式每一次数据传送,CPU都要经历“保护现场→转中断服务程序→传送数据→恢复现场→返回断点”这一整套过程。哪怕速度再快,这些操作指令也都是要花时钟周期的。如果设备是高速设备,比如磁盘、网卡、显卡,每秒钟要传送几MB甚至几十GB的数据,每次都靠CPU中断来搬数据,CPU就会被彻底淹没在中断请求里,别说干别的活了,连处理中断本身都忙不过来。

举个例子感受一下。假设一块网卡每接收一个数据帧(约1500字节)就产生一次中断,网卡跑满千兆带宽时每秒大约接收8万个数据帧,也就是每秒8万次中断。一次中断从响应到返回大概要消耗几十甚至上百个时钟周期,CPU主频再高也扛不住这样的频率。所以必须有一种方式,让数据传送不经过CPU的“手把手”搬运,而是由外部设备直接和内存交换数据,这就是DMA存在的根本原因。

1.2 DMA方式的核心定位:CPU搭台,DMA唱戏

DMA的英文全称是Direct Memory Access,直接存储器访问。核心思想是:在DMA控制器(DMAC)的指挥下,I/O设备和主存之间直接建立数据通路,数据不经过CPU内部的通用寄存器,而是直接在主存和设备之间传输。CPU要做的事情,只是在传送开始前“搭个台子”——告诉DMA控制器数据从哪来、送到哪去、传多少字节;传送结束后“收个尾”——处理一下善后工作。至于中间那段大量的数据搬运过程,CPU完全可以撒手不管,去执行别的程序。

这么说可能还是有点抽象,拿搬家来类比一下就清楚了。程序中断方式就像你亲自帮朋友搬家,每一个箱子都要你亲手从一楼搬到五楼,搬完全部箱子你也累瘫了。DMA方式则像是你找了一个搬家公司,你只需要告诉搬家公司“东西在哪个房间、搬到哪个地址、一共多少件”,然后搬家公司自己派车派人搞定一切,你继续在家该干嘛干嘛,最后搬家公司搬完了给你打个电话说“完事了”。

这个类比基本抓住了DMA的精髓:CPU角色的转变,从“数据搬运工”变成了“项目管理者”。理解了这个定位,后面很多细节才能串起来。

2. DMA控制器的内部结构与一次传送的完整流程

2.1 控制器内部有哪些“器官”,各管什么

DMA之所以能脱离CPU独立搬运数据,是因为它自己有一套完整的“班子”。408考试不要求画出DMA控制器的完整电路图,但每个部件的功能必须搞清楚。DMA控制器的典型组成包括以下几个部分:

  • 主存地址寄存器(AR):存放DMA传送过程中要访问的主存地址。传送一个数据后自动加1或减1,相当于一个自动走路的指针,告诉控制器下一个数据放哪。
  • 传送字节计数器(WC):记录还需要传送多少个字节(或字)。每传送一个数据减1,减到0说明传送完毕,这时候控制器会向CPU发出中断请求,通知CPU活干完了。
  • 设备地址寄存器(DAR):存放I/O设备的设备码或设备内部缓冲区地址,用来指明数据从哪个设备来、或者要送到哪个设备去。
  • 控制逻辑电路:DMA控制器的“大脑”,负责协调各个部件,管理DMA请求信号、总线请求、总线允许等控制信号。
  • 数据缓冲寄存器:数据传送的中转站。外设和主存的速度不匹配,需要一个临时缓冲,先由外设把数据送入DMA控制器的缓冲寄存器,再由缓冲寄存器写入主存,反之亦然。

这些部件各司其职,配合起来完成一次完整的数据传送。特别要注意的是,DMA控制器往往还包含中断机构,用于传送结束时向CPU发中断请求。但这个中断请求和程序中断方式里的中断请求性质完全不同,后面会专门对比。

2.2 一次DMA传送的三段式流程

一次DMA传送过程可以清晰地分为三个阶段:传送前预处理、数据传送、传送后处理。这三个阶段分别在什么时间发生、由谁执行,是判断题和选择题的高频考点。

第一阶段:预处理(CPU执行程序完成)

CPU在执行主程序时遇到需要传送数据的指令,会先向DMA控制器写入以下信息:设备地址(哪个外设)、主存起始地址(数据从主存哪个位置开始读,或写到主存哪个位置)、传送字节数(一共要搬多少数据)、操作命令(是“外设→内存”还是“内存→外设”)。另外还要启动设备。这个阶段由CPU完成,占用CPU时间。

第二阶段:数据传送(DMA控制器控制完成)

设备准备好一个数据后,向DMA控制器发DMA请求;DMA控制器接到请求后,向CPU发出总线请求,申请使用系统总线;CPU在合适的时机让出总线使用权,DMA控制器获得总线后,直接控制外设和主存之间的数据交换。每传送一个数据,主存地址寄存器加1、字节计数器减1,然后释放总线,把总线还给CPU。这个过程循环进行,直到字节计数器减到0。

这个阶段的重点在于:数据从I/O设备到主存的过程中,全程没有CPU参与,CPU甚至不知道总线已经被DMA控制器借走过。总线控制权的交接都是硬件自动完成的。

第三阶段:传送后处理(CPU执行中断服务程序完成)

当字节计数器减到0时,DMA控制器通过中断机构向CPU发出中断请求,CPU响应后执行中断服务程序,做善后工作。善后工作包括:检查传送过程是否出错(比如校验错误)、判断传送结果、处理缓冲区数据、决定是否继续传送下一批数据等。

三道工序的分工必须记牢:预处理和后处理是CPU干的,中间大批量数据传送是DMA控制器干的。考试如果问“DMA方式中,CPU需要做什么”,答案就是预处理和后处理;如果问“数据传送阶段CPU是否可以执行原程序”,答案是肯定的。

3. DMA方式与程序中断方式的对比辨析

3.1 相同之处:都是外设“呼叫”CPU

先看相同点。程序中断方式和DMA方式,从宏观角度看都是I/O设备主动寻求CPU的介入,都是硬件工作方式,都在一定程度上实现了CPU和外设的并行工作。两种方式在传送结束后都需要向CPU发中断请求,这个中断请求的目的都是让CPU来处理善后或者响应外设的需求。

数据传送结束后,DMA控制器发出的中断请求,本质上就是一种程序中断,CPU会通过中断响应流程转去执行对应的中断服务程序。所以不要以为DMA方式和程序中断方式完全不沾边——DMA方式里包含了中断机制,只不过中断在DMA里只出现在传送开始前和结束后,不参与数据传送过程本身。

3.2 核心区别:数据搬运这条路到底谁在走

两者的关键区别可以从多个维度来对照,我整理成了一张表,复习时直接背:

对比维度程序中断方式DMA方式
数据传送主体CPU(执行中断服务程序)DMA控制器(硬件控制)
数据通路CPU内部寄存器→主存(经过CPU)外设↔主存(直接,不经过CPU)
传送单位通常一次传送一个字节/字数据块(连续一批数据)
响应时机指令执行完才能响应中断总线空闲或CPU访存间隙响应
CPU暂停程度需要保护断点与现场,暂停当前程序周期窃取,CPU可继续执行程序
适用设备中低速设备(键盘、打印机)高速设备(磁盘、网卡、显卡)
中断请求的作用请求CPU传送数据请求CPU做善后处理或报告完成
并行性外设与CPU部分并行外设与CPU高度并行,仅传完才打断CPU

最容易踩的坑是误以为“DMA方式不需要中断”。准确的说法是:DMA的数据传送阶段不需要CPU参与,由DMA控制器抢占总线、直接搬运数据;但在传送开始前的初始化和结束后的善后处理,仍然需要CPU介入,这个介入方式就是程序中断。考试喜欢在这个点上设置判断题,比如“DMA方式传送数据时,CPU完全不参与,所以DMA不需要中断机制”——这句话是错的,因为传送完后中断还是要的。

3.3 选型依据:什么样的设备该用DMA

判断一种设备该用哪种控制方式,核心就看两个指标:数据传送速率和单位数据量。键盘、鼠标这类设备,数据率极低,一个字节一个字节慢慢来,程序中断方式就够用了;如果强制用DMA,反而会增加控制器的硬件复杂度,性价比极低。磁盘、网卡这种按块(扇区、帧)成批传输且速率极高的设备,中断方式根本喂不饱,必须用DMA。

从考点角度看,选择题经常给出设备名称让你选控制方式,判断依据就是“是否高速、是否块传输”。记住一条主线:速度越快的设备,越需要减少CPU介入,也就越适合DMA。

4. 周期窃取原理与DMA的三种工作方式

4.1 “周期窃取”到底窃的是什么周期

DMA控制器要传送数据,必须使用系统总线来访问主存。可问题是,在单总线结构的计算机中,系统总线通常由CPU占用,CPU每时每刻都在取指令、读操作数、写结果,总线基本闲不下来。DMA控制器要使用总线,就得想办法从“CPU的访问周期”里挤时间。这个挤的过程,就叫周期窃取或周期挪用。

要理解周期窃取,必须先想明白一个问题:CPU访问主存是不是连续的、每一拍都在用总线?答案是否定的。CPU在执行指令的过程中,并不是每个时钟周期都需要访问总线。比如CPU内部进行算术运算时,可能连续好多个时钟周期都不需要访存,这时总线实际上是空闲的。DMA控制器就可以利用这些CPU不用总线的间隙,悄悄插入自己的访存操作,把数据传了。典型的CPU访存时序是:一个指令周期中包含若干个机器周期,机器周期中又包含时钟周期,其中只有取指阶段和读操作数阶段会真正使用总线,其他阶段总线是空闲的,这就给DMA提供了可乘之机。

4.2 三种工作方式的对比

根据DMA控制器占用总线策略的不同,DMA有三种工作方式:

第一种:停止CPU访问主存

DMA控制器获得总线后,在传送一批数据期间,一直占用总线不放,CPU在这段时间内完全无法访问主存,只能等待。对于高速设备或批量数据传送(比如整块磁盘数据读入内存),这种方式最简单、控制逻辑最好实现,但代价是CPU长时间处于“饥饿”状态,主存被DMA独占。好处是传送效率最高,坏处是CPU和DMA不能很好地并行工作。

第二种:周期挪用(周期窃取)

DMA控制器只在CPU不访问主存的间隙,插入一次或几次访存操作,传送一个或几个数据,然后立刻释放总线,让CPU继续正常访存。每次挪用一个存储周期,传送完一个数据就还给总线。这种方式实现了CPU和DMA分时共享主存,双方都有访存机会,控制逻辑比第一种要复杂一点点,但并行效果很好。考试常考的“DMA方式的主要特点是周期挪用”,指的就是这种方式。

第三种:交替访存

这种方式把CPU的访存周期分成两个时间段,一半固定给CPU用,一半固定给DMA用,两者严格交替。这种方式控制逻辑最复杂,但对于CPU和DMA来说都是“固定节奏”,不需要等待,也不存在互相抢占的问题。这种方式常用于CPU时钟周期足够短、存储周期足够长的场景。

实际考试中,三种方式的选择题目比较多出现在概念辨析上。必须分清:停止CPU访存方式最粗暴、CPU利用率最低;周期挪用方式均衡、常见;交替访存方式最精致、硬件最复杂。

4.3 周期窃取和CPU暂停法的区别与联系

很多同学会混淆“周期窃取”和“停止CPU访问主存”这两个概念,觉得都是DMA抢总线,有什么区别?区别在于抢完之后CPU的状态:

  • 停止CPU访问主存(CPU暂停法):DMA占用总线期间,CPU完全无法访存,要等DMA全部传送完毕,CPU才能重新获得总线。CPU的工作被整体暂停。
  • 周期窃取(周期挪用):DMA只在CPU不访存的周期插入访存,或者在CPU访存周期之间“插空”,CPU的访存动作不被打断,只是被延后或穿插进行。CPU的工作基本连续运行。

打个比方:CPU暂停法像是一个人正在餐厅吃饭,DMA直接把整个餐厅包场了,你只能在外面排队等;周期窃取则像是DMA趁你放下筷子喝水的间隙,快速从餐桌上取走一道菜,等你拿起筷子时菜已经被拿走了,但你嘴巴基本没闲着。这个类比虽然不太雅,但很形象。

4.4 为什么DMA中断的响应时机比普通中断更特殊

还有一点值得单独说:CPU对DMA请求的响应时机,与对程序中断请求的响应时机不同。程序中断方式的响应条件是“当前指令执行完毕”,而DMA请求的响应条件则是“当前机器周期(总线周期)结束”。原因在于DMA请求不要求CPU停下程序去执行什么服务程序,只需要让出一次总线访问权,等总线周期一结束就能交接。

这个区别在选择题里出现过多次。记住口诀:“指令结束响应中断,机器周期结束响应DMA”。

5. 408真题视角:DMA计算题的通用破题套路

5.1 计算题的经典模型:磁盘、网卡、串口怎么出题

DMA计算题是408真题的常客,19年之前的经典老题和近些年的新题都考过相关计算。这类题目通常给出设备的技术参数(比如磁盘转速、扇区大小、传输速率),要求计算DMA方式下的传送时间、CPU占用率、或者比较DMA与中断方式的性能差异。

题目模型主要有三类:磁盘读/写一个扇区、网卡接收一个数据帧、串口/ADC采样一批数据。模型本质上都一样,就是设备每准备好一批数据,触发一次DMA请求;DMA占用一次总线完成一个存储周期内的数据传送;CPU在其余时间可以继续执行程序。

这个数学模型的关键变量有三个:设备两次DMA请求之间的时间间隔(设备准备时间)、一次DMA请求占用总线的时长(通常等于一个存储周期)、总线上传送的数据量。搞懂这三个变量之间的关系,DMA计算题基本就解开了。

5.2 CPU占用率:一个万能的推导公式

DMA方式下,CPU的利用率怎么计算?我们先推导通用公式,再套例题。

设外设每两次DMA请求之间的时间间隔为T,DMA每次请求占用总线(执行一个存储周期)的时间为t。那么在一个请求周期T内,总线被DMA占用的比例就是t/T,这段时间内CPU无法访存;其余时间T-t,CPU可以正常访存和工作。因此CPU的利用率可以近似为:

[ CPU利用率 = \frac{T - t}{T} \times 100% ]

如果一次DMA请求传送了多个数据、占用了多个存储周期,那t就是n乘以单个存储周期的时间。

这个公式的本质含义是:CPU除了被DMA“挪用”的那段时间,其余时间都在干活,而且DMA传送数据本身是不占CPU执行时间的。

举一个具体的例题,这个数据是我根据408真题常见参数自拟的,和某些真题的参数不完全一致,但解题套路完全一致:某磁盘平均转速为7200转/分,每转读取一个扇区(扇区大小512B)。若采用DMA方式读取磁盘扇区,每次DMA请求占用一个存储周期(存储周期设为400ns),每次传送一个字(4B)。求CPU的利用率。

先算设备准备一个扇区数据的时间间隔T。磁盘每转一圈读取一个扇区,7200转/分=120转/秒,所以每圈耗时约1/120秒≈8.33ms。也就是说,每隔T=8.33ms,磁盘准备好512B数据,发一次DMA请求。

再算一次DMA请求需要传送的数据量。一次DMA请求传送512B=128个字(每个字4B),每次传送一个字占用一个存储周期400ns,所以一次DMA请求总共需要占用128×400ns=51.2μs的时间。

代入公式:CPU利用率=(T-t)/T=(8.33ms-51.2μs)/8.33ms≈99.4%。也就是说,在这种配置下,CPU几乎全程都在干活,只有0.6%的时间被DMA借用了一小段总线。

这个计算方法要特别注意单位换算,μs和ms之间是千倍关系。很多同学算错就是因为单位没有统一。

5.3 对比题:DMA方式为什么比中断方式快

真题常考的计算对比是:同样传送一批数据,用程序中断方式和DMA方式,CPU花费的时间各是多少。对比的关键点在于:程序中断方式每传送一个数据(通常一个字或几个字节)都要进一次中断服务程序,每一次中断都要执行完整的保护和恢复现场指令;而DMA方式是把这一批数据在连续几个存储周期内“偷偷”传完,CPU几乎不用额外花时间。

继续沿用上面的数据:传送512B=128个字。程序中断方式每传一个字需要一次中断服务,假设每次中断服务程序需执行20条指令、每条指令平均4个时钟周期、CPU主频为1GHz,那么每传一个字需耗时20×4×1ns=80ns,128个字共需约10.24μs。而DMA方式下设备准备数据的时间约8.33ms,DMA期间CPU只是被挪用了51.2μs的总线时间。虽然中断方式的80ns×128看起来不大,但如果传送频率高、数据量大,中断方式累加起来会让CPU几乎无法做其他工作,DMA的优越性就体现在“把CPU从高频中断中解放出来”。

另外还有一个考点:程序中断方式传数据必须要CPU执行指令,DMA方式传数据是硬件自动完成的。前者对CPU是“真占用”,后者对CPU是“暂借总线不占执行时间”。

6. 备考规划与常见误区清单

6.1 教材和网课怎么配合用

复习DMA这一块,我建议的顺序是这样的:

第一遍打基础,以王道单科书为主,把概念流程过一遍,重点搞清楚三件事:DMA控制器有哪些部件、传送过程分几个阶段、周期窃取是怎么回事。这一遍不用抠计算题细节,先把概念串起来。

第二遍做区分,回到唐朔飞的教材,把程序中断方式和DMA方式放在一起对照着看。唐老师的书里对DMA控制器各部件之间的信号线、时序关系讲得更细,如果看不懂信号线,略过即可,不影响考试。

第三遍刷计算题,打开王道书后面的练习题和历年真题汇编,集中做DMA相关的计算题。做题时先独立列公式再计算,对答案时重点看不一致的地方——绝大多数计算错误都出在单位换算上。

网课方面,王道咸鱼老师的组成原理课程讲DMA的段落可以反复看两遍,尤其是周期窃取的动画演示,比自己啃书直观得多。如果你报了其他机构的课,只要老师能把“CPU让出总线”的过程讲明白就行,不用贪多。

6.2 我踩过的坑和同学们的常见错误

第一次做DMA计算题时,我把“DMA传送完一批数据才发一次中断”误记为“每传一个数据发一次中断”,导致后面所有计算全错。这个错误在考生中相当普遍,必须强调:DMA是传完一块数据,中断一次,不是传一个字节中断一次。程序中断方式才是每传一个数据中断一次。这个区别是DMA效率高的核心原因,记不住这个,后面做题全完。

第二坑是总线周期的单位。存储周期、存取周期、总线周期这些概念容易混。DMA计算题里通常给的是存储周期,表示CPU和DMA每次访存所需的时间。但有些题目会改成给总线时钟频率,比如总线频率100MHz,那一个总线周期就是10ns,需要灵活换算。

第三坑是“DMA方式不需要程序”的误解。DMA确实不需要像程序中断那样执行中断服务程序来搬数据,但DMA控制器本身是硬件,传送前CPU的程序还是要设置参数,传送后CPU的程序还是要处理中断。所以严格来说,DMA并不是完全抛弃程序,只是抛弃了“搬数据”那一段程序。

第四坑是周期窃取和CPU暂停法的混淆。很多同学看到“DMA请求”“总线占用”就默认是CPU暂停,忽略了周期窃取才是DMA最典型的工作方式。408大纲中强调的“周期窃取”是重点中的重点,一旦题目问“DMA方式的特点”,要先想到周期窃取,再想到DMA不需要CPU干预搬运数据。

6.3 哪些知识点在真题里出现频率最高

根据我对历年真题和模拟题的梳理,DMA考点的出题优先级大概是这样的:

最高频(年年可能出):DMA与程序中断方式对比、周期窃取特点、DMA传送过程三个阶段、CPU在DMA不同阶段的角色。

中频(隔年出现):DMA计算(如CPU利用率、传送时间)、DMA控制器组成部件功能、DMA请求与中断请求的区别。

低频(偶尔出现在选择判断):三种工作方式(停止CPU访存、周期挪用、交替访存)的具体区别、主存地址寄存器和字节计数器的初始值设置。

复习时把最高频和中频的知识点吃透,计算题至少刷完王道配套练习里的全部DMA题目,就足够应对考试了。如果时间充裕,可以把唐朔飞教材课后习题中关于I/O方式的简答题也刷一遍,对理解概念很有帮助。

7. 一道经典易错题的完整拆解(附加练习)

这里额外准备一道经典易错题,是我当年复习时做错过的,后来想明白了觉得特别有价值。题目如下:某计算机采用DMA方式从磁盘读取数据,已知磁盘每个扇区512字节,转速为7200转/分,每转输出一个扇区的数据。主存周期为500ns,DMA每次请求传送一个字(4字节)。求该DMA方式下,CPU被DMA挪用存储周期比例是多少?

第一步算设备准备间隔。每转输出一个扇区,转速7200转/分=120转/秒,每转耗时约8.33ms,所以每8.33ms产生一次DMA请求。

第二步算一次DMA请求需要传送多少个字。512B÷4B=128个字,每个字占一个存储周期,一次DMA请求共占用128个存储周期。

第三步算一次DMA请求占用的总时间:128×500ns=64000ns=64μs。

第四步求比例:64μs÷8330μs≈0.77%。

这就是CPU周期被挪用的比例,其余99.23%的存储周期CPU都可以正常使用。这类题的核心逻辑完全一致:先算间隔时间,再算一次DMA请求的总占用时长,两者一除就完了,没有任何复杂的计算,关键是理清数据关系。

我在实际备考中逐渐意识到,DMA这块知识点的难度不在于概念本身深奥,而在于它横跨了I/O系统和总线系统两个知识模块。前期复习总线时如果没把“总线仲裁”“总线周期”搞透,学到DMA周期窃取时就会觉得莫名其妙。所以我建议你把DMA放在总线那章学完后再深入学习,而不是按照教材的章节顺序直接跳到I/O系统去硬啃。先有总线基础,再学DMA,你会发现一切都顺理成章。另外,408大题里DMA出现的时候,经常是跟中断嵌套、缓存、磁盘性能计算混在一起出的,别只看单独的计算,一定要把数据通路图自己画一遍,画的过程中就能发现很多理解上的漏洞。这个方法,我用下来比单纯刷题效率高得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询