想象你是一家繁忙餐厅的主厨。你面前堆满了要做的菜,却还要不停跑到门口看有没有食材送到——这就是轮询。后来餐厅装了个铃铛,送货员一按铃你再去拿——这是中断。最后,餐厅修了一条从卸货口直通备餐间的传送带,食材自己流进来,你只需要按一下开关——这就是DMA。计算机的数据搬运,和餐厅的物流有着惊人的相似。CPU就是主厨,内存是备餐间,外设是送货员和顾客,IO控制器则是那个标准化的前台。这篇文章就带你逛逛计算机的“后厨物流”,看看数据如何在外设和内存之间高效流动,以及DMA这架“传送带”为什么能成为性能担当。

岗位关联

掌握DMA与IO控制器原理,是理解计算机系统性能瓶颈的关键。作为AI从业者,无论是训练数据加载、推理服务网络IO,还是嵌入式AI设备的传感器采集,都离不开这套底层传输机制。看懂它们,你才能对系统优化做到心中有数。

目录
  1. 可视化演示
  2. 数据搬运基础
  3. 轮询传输模式
  4. 中断传输方式
  5. IO控制器组成
  6. DMA工作原理
  7. 传输方式对比
  8. 演进与展望
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示一文搞懂DMA与IO控制器工的核心机制,通过采集/分析/决策/反馈四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

一文搞懂DMA与IO控制器工:一IO控 一、IO控制器基本组成与外设接 二、轮询方式与中断驱动IO的机 核心机制可视化 一文搞懂DMA与IO控制器工整体架构与关键组件

数据搬运基础

说到数据搬运,我们回到那家餐厅。主厨(CPU)是全后厨的核心,每天要炒出几百道菜。可炒菜最怕什么?怕做菜做一半还要跑去搬食材、接订单。这就像计算机的CPU,核心价值是计算,而不是整天和外设打交道。可外设(键盘、鼠标、磁盘、网卡)偏偏又是必须服务的“顾客”。于是,餐厅需要一位前台接待员来专门接收订单、传递信息——这就是IO控制器(Input/Output Controller)存在的理由。

从技术上看,数据在计算机中的流向无非两条:输入数据从外设到内存,输出数据从内存到外设。CPU、内存和外设这三者之间需要一套通信机制。IO控制器就是连接外设和系统总线的桥梁,它内部有一些寄存器,CPU可以通过读写这些寄存器来获取外设的状态、控制外设的工作。这样,CPU面对的不是复杂的电气信号,而是几个简单的寄存器操作。

IO控制器的引入,让“每个外设直接和CPU对话”变成了“统一找前台”。这个前台不仅负责翻译外设的“方言”,还能暂存数据、反馈状态。可以说,没有IO控制器,CPU就得被各种外设的细节淹没。餐厅里有了前台,主厨才能安心炒菜;计算机里有了IO控制器,CPU才能专心计算。数据搬运的底层逻辑,从这里拉开序幕。

轮询传输模式

最原始的方式,就是主厨每隔五分钟跑去前台问一遍:“有没有食材到?”哪怕没有,也得跑。这在计算机里叫作轮询(Polling),也叫程序直接控制方式。CPU像那位主厨,反复去读IO控制器的状态寄存器,看看外设是不是准好,数据是不是可以读取了。

每次轮询,CPU都要执行一条“读状态寄存器”的指令,然后判断。如果状态不对,就接着读,这个过程叫忙等(Busy Waiting)。等外设终于准备好,CPU才通过数据寄存器搬运一个字节。注意,是一个字节!传输1000字节,CPU就要回归1000次状态,这可能让CPU完全陷入这种检查循环,其他计算一概搁置。

可以用一个简单公式描述轮询方式的总开销:

轮询这个“主厨跑腿”的模式,虽然实现简单、不需要额外硬件,但代价太大了:CPU的利用率几乎被IO操作吃掉。它只适合外设数量少、速度慢、对响应时间不敏感的场景,比如单片机上扫描几个按键。可一旦数据量变大,主厨怕是跑断腿也炒不出菜了。

Ttotal=N×tcheckT_{\text{total}} = N \times t_{\text{check}}
这个公式表示:传输N个字节的数据,总共需要N次状态检查,每次检查耗时t_check,总时间T_total就是两者的乘积。它直观说明了CPU的负担与数据量成正比。
  1. 符号含义N是待传输的字节数,t_check是CPU检查一次外设状态并完成一个字节搬运所花费的时间。
    N×tcheckN \times t_{\text{check}}
  2. 乘法意义因为轮询是逐字节进行的,每处理一个字节都需要一次完整的检查流程,所以总时间是单次检查时间乘以字节数。
    Ttotal=N×tcheckT_{\text{total}} = N \times t_{\text{check}}

中断传输方式

前台的“跑腿模式”太笨,餐厅决定装一个订单铃。顾客下单后,前台一按铃,“叮咚”一声,主厨听到铃声再过去处理。这就是中断(Interrupt):外设在准备好数据时,主动给CPU发一个中断请求信号,CPU暂停当前程序,转去执行一个专门处理数据传输的程序(中断服务程序),完成后再回到之前的任务继续做。

中断的流程很标准:外设发出中断请求 → CPU在完成当前指令后响应中断 → 保存现场(把当前执行的地址和寄存器值压栈) → 跳转到中断服务程序 → 从中断源取一个字节/字的数据存到内存 → 恢复现场 → 返回原来的程序。这个过程CPU不再需要抬着头盯着门口,可以安心炒菜,直到铃响才被打断一下。

但中断也不是免费的。每次响应中断都有固定开销:响应延迟、现场保存与恢复。中断次数越多,CPU在处理“接铃”上的时间就越多。每次中断的处理开销可以表示为:

和轮询相比,中断让CPU从“忙等”中解放出来,能在外设空闲时处理其他任务。但如果外设一个接一个地发中断,主厨就会像一直被打断的厨师,虽然不用跑腿,但频繁放下锅铲也影响出菜效率。中断适合键盘、鼠标这类“事件驱动”的慢速外设,偶尔一下不用常驻后台。

Tint=Tresponse+ThandleT_{\text{int}} = T_{\text{response}} + T_{\text{handle}}
这个公式说明,一次中断的总开销包括两部分:从外设发出请求到CPU开始执行中断程序的时间(响应时间T_response),以及CPU执行中断服务程序、完成数据搬运的时间(T_handle)。中断处理得越频繁,这部分开销累积越大。
  1. 响应时间含义T_response指从中断请求信号产生到CPU跳到中断服务程序第一条指令之间的等待时间,包括硬件判断和现场保护的最初动作。
    TresponseT_{\text{response}}
  2. 处理时间含义T_handle指中断服务程序本身执行的时间,包括读写数据寄存器、更新内存地址、恢复现场等操作。
    ThandleT_{\text{handle}}
  3. 求和意义每次中断的总开销是这两者之和,中断次数越多,CPU被“打断”的累积成本越高。
    Tint=Tresponse+ThandleT_{\text{int}} = T_{\text{response}} + T_{\text{handle}}

IO控制器组成

要支持各种“订单铃”和“前台登记”,IO控制器可不是一块简单电路板。它就像一个标准化的前台工作台:登记簿负责暂存信息,状态灯提示是否就绪,还有一本地址簿用来对应不同顾客的包厢。IO控制器内部通常包含三大块:数据寄存器、状态/控制寄存器、端口译码逻辑。

数据寄存器(Data Register)是“临时储物柜”,存放从外设读到的数据或将要写出的数据。CPU可以和它直接交换字节,起到缓冲的作用。状态寄存器(Status Register)是“服务状态灯”,反映外设当前是否空闲、是否就绪、传输是否出错。控制寄存器(Control Register)则是“指挥面板”,CPU通过向它写入命令来启动外设、启动传输或设置模式。

IO控制器要工作,CPU还得能找到它。这涉及端口编址:独立编址方式下,IO端口有自己独立的地址空间,CPU用专门的IO指令访问;内存映射编址(MMIO)方式下,IO寄存器被映射到内存地址空间,CPU用普通的内存读写指令就能操作。这就好比前台的每部电话都有分机号,主厨只需要记住号码,拨过去就行。

有了这个标准化的前台,无论外设是键盘还是磁盘,CPU都只面对一组寄存器。它不需要知道外设内部是机械结构还是半导体芯片,只要对着前台喊“准备了吗?传数据!”就能完成交互。这正是IO控制器的价值:把千奇百怪的外设统一成几个简单的“对话窗口”。

DMA工作原理

当餐厅每天要接收上百箱食材时,主厨如果还一箱一箱地签收,其他菜就没法做了。于是,餐厅建了一条传送带:送货员把整箱食材放上传送带,传送带自动把它们送进备餐间的储藏柜。主厨只需要在启动时按下开关,最后看一眼进货单。这条传送带,就是DMA(Direct Memory Access,直接内存访问)。

DMA的核心思想是:外设与内存之间的数据搬运,不再由CPU逐字节完成,而是交给一个专门的硬件——DMA控制器(DMAC)来接管。DMA控制器拥有独立访问系统总线的能力,能在CPU的“默许”下,直接在外设和内存之间传输一块数据。CPU只需在传输开始前做一次初始化设置:告诉DMAC数据要送到内存的哪个地址、传输多少字节、方向是读还是写。然后CPU就可以去干别的事了。

传输过程大致分四步:第一步,CPU初始化DMAC和IO控制器,给出内存起始地址、数据块长度和传输方向;第二步,外设发出DMA请求,DMAC收到后向CPU申请总线控制权(可能是“周期窃取”——每隔几个周期占用一次总线,也可能是“突发模式”——连续占用总线直到传输完);第三步,DMAC获得总线后,直接指挥数据从外设缓冲区流向内存,每传一块就更新地址和计数器;第四步,整个数据块传输完毕,DMAC向CPU发一个中断,报告任务完成。

DMA传输的总时间可以写成:

传送带不是免费的,它需要占地方、电机和控制设备,但比起让主厨一箱箱搬,划算得多。DMA尤其适合磁盘读写、网卡收发包这类高速、大批量的数据传输。主厨(CPU)只需按个开始键,后面就能专心炒菜了——这正是DMA被称为“程序员之光”的原因。

Tdma=DB+TsetupT_{\text{dma}} = \frac{D}{B} + T_{\text{setup}}
这个公式表示:DMA传输大块数据的总时间等于数据量D除以总线带宽B(即纯搬运时间),再加上一次性的启动设置时间T_setup。数据量越大,DMA的“规模效应”越明显,CPU被占用的时间微乎其微。
  1. 数据量符号D代表要传输的数据块大小,单位通常是字节。
    DD
  2. 带宽符号B代表系统总线的数据传输速率,单位是字节每秒。
    BB
  3. 除法含义D除以B得到的是在理想情况下,数据在总线上流动所花的时间。
    DB\frac{D}{B}
  4. 启动开销T_setup是CPU配置DMAC、外设响应等固定的准备时间,与数据量无关,一次传输只发生一次。
    TsetupT_{\text{setup}}
  5. 总时间求和DMA传输总时间等于搬运时间加启动开销,CPU只在启动和最后中断时介入。
    Tdma=DB+TsetupT_{\text{dma}} = \frac{D}{B} + T_{\text{setup}}

传输方式对比

三种方式,本质上是三种“接客”策略:主厨蹲前台(轮询)、听铃铛(中断)、启动传送带(DMA)。哪种好?得看来了多少客人、客人多急、主厨多忙。

效率对比非常直观:轮询模式下,CPU几乎全程被IO操作占据,传输N个字节要付出N次的检查开销;中断模式下,CPU只在每个字节到达时被中断一下,但中断次数太多也会累积可观开销;DMA模式下,CPU只需要在开始时设置参数、结束时处理一次中断,中间完全空闲。相比之下,DMA的CPU占用率最低,特别适合大块数据。

具体怎么选?轮询适合极简系统,比如只有一两个按钮的嵌入式控制器,硬件开销为零,但CPU忙等。中断适合低速事件驱动设备,比如键盘、鼠标,设备数量少,中断频率可控。DMA适合高速批量设备,比如磁盘、网卡、高速传感器。如果为了一个慢速键盘去配DMA控制器,就像为了防止一只蚂蚁而架一整条传送带,纯属浪费。

所有选择的背后都是权衡:硬件复杂度、传输速度、CPU开销、实时性。轮询响应延迟最低,因为CPU一直在检查;中断引入响应延迟但有事件通知;DMA最省CPU但需要额外的硬件和初始化。餐厅老板会说,先看清这周的客流量,再决定要不要上自动化;系统架构师也常说,先搞清外设的传输特性,再挑传输方式。

演进与展望

从蹲前台到装铃铛,再到上传送带,餐厅物流越来越自动化。计算机的数据传输方式也在沿这条路径演进。早期的计算机用轮询,因为外设慢、硬件简单;后来中断成为标准,因为CPU算力宝贵;再后来,DMA成为高性能IO的标配,甚至在磁盘控制器、网络接口里都集成了DMA引擎。

现代计算机的IO体系已经形成多层次格局:CPU和IO设备之间不仅有DMA,还有中断控制器(比如APIC)、IOMMU(输入输出内存管理单元)、总线主控等等。NVMe固态硬盘直接在盘内实现DMA,数据从闪存到内存全程不经过CPU指令搬动;万兆网卡支持RDMA(远程直接内存访问),让远端数据直接进入本机内存,CPU几乎零拷贝。这些技术都延续着同一个思想:把主厨从跑腿中彻底解放出来。

展望未来,随着AI大模型训练数据越来越庞大,数据从存储到GPU之间流动的瓶颈愈发显著。CPU无需逐字节搬运,DMA、RDMA、GPUDirect等高速数据传输技术将成为系统性能的关键拼图。可以想象,未来的计算系统就像一家高度自动化的餐厅:食材从农场直通厨房,传送带纵横交错,主厨只负责最高级的创意菜——那些真正需要算法智慧的部分。我们掌握IO演进的逻辑,就抓住了计算机系统性能优化的命脉。

AI 应用场景

AI训练数据加载

阶段:数据准备与预处理阶段

解决的问题:训练一个深度学习模型需要读取大量图片、文本或语音数据。传统方式下,CPU需要参与磁盘数据到内存的每个字节搬运,会导致数据加载阶段CPU占用过高,而GPU却在空转等待。通过DMA,磁盘控制器可以直接将数据块写入内存,CPU只需发起读请求,大大缩短数据准备时间。

具体案例:某AI公司训练图像分类模型,数据集有10万张图片(约50GB)。使用支持DMA的NVMe SSD后,数据加载时间从原来使用轮询/中断混合模式的几分钟缩短到几十秒,CPU占用率从95%降至30%,训练吞吐量显著提升。

推理服务中的高速网络IO

阶段:模型推理与服务部署阶段

解决的问题:线上推理服务需要实时处理大量用户请求,网络包到达控制器后,如果依赖CPU逐步拷贝,会引入明显延迟和CPU开销。利用网卡DMA(甚至RDMA),数据包直接从网卡进入内存缓冲区,CPU只负责应用层逻辑,从而满足高并发低延迟要求。

具体案例:一个在线推荐系统每秒处理上万次请求,采用支持RDMA的网卡后,网络包接收时CPU占用从50%降到10%,P99延迟从15ms降到5ms,系统能支撑更大的流量。

嵌入式AI设备的数据采集

阶段:端侧数据采集与推理输入阶段

解决的问题:嵌入式设备(如智能摄像头、工业传感器节点)需要连续采集大量传感数据,并送给端侧AI模型推理。这些数据采样率高、数据量大,如果用CPU逐字节搬运,主控芯片几乎无法运行模型。使用DMA将ADC采样数据直接存入内存缓冲区,CPU可以并行运行推理算法。

具体案例:某智能相机产品使用STM32微控制器采集麦克风阵列数据,通过DMA将音频流持续写入内存环形缓冲区,CPU同时执行语音唤醒模型推理,实现低功耗实时响应,而不会因为IO处理丢失音频帧。

Python 演示

python42 行
import time def polling_transfer(data_size):    # 轮询:每传一个字节都要检查状态    cpu_cycles = 0    for _ in range(data_size):        # 模拟循环检查外设状态(无条件忙等)        while True:            cpu_cycles += 1            # 模拟外设就绪条件,简化:检查次数恒定            break        cpu_cycles += 1  # 传输这个字节    return cpu_cycles def interrupt_transfer(data_size):    # 中断:每传一个字节触发一次中断    cpu_cycles = 0    for _ in range(data_size):        # 中断响应+保存现场+中断服务+恢复现场=5个周期        cpu_cycles += 5        cpu_cycles += 1  # 搬运这个字节    return cpu_cycles def dma_transfer(data_size):    # DMA:只需初始化一次+最后中断一次    cpu_cycles = 10  # 初始化DMA控制器    cpu_cycles += 5  # 传输完成后的中断处理    # 忽略数据块内部传输,CPU不参与    return cpu_cycles def main():    data_size = 10000    p = polling_transfer(data_size)    i = interrupt_transfer(data_size)    d = dma_transfer(data_size)    print("轮询 CPU 周期消耗:", p)    print("中断 CPU 周期消耗:", i)    print("DMA  CPU 周期消耗:", d)    print("DMA 相比轮询节省:", p - d, "个周期") if __name__ == "__main__":    main()
目的:用简单的数字模型模拟三种数据传输方式下CPU的实际参与情况,直观感受DMA的巨大优势。
  1. def polling_transfer(data_size):定义轮询传输模拟函数,按字节循环。
  2. while True: ... break模拟CPU反复检查外设状态,即使就绪也要消耗检查周期。
  3. cpu_cycles += 5在中断模拟中,每次传输都包含响应中断、保存/恢复现场等固定开销。
  4. cpu_cycles = 10DMA初始化阶段CPU需要配置DMA控制器,这是一次性开销。
  5. print("DMA 相比轮询节省:", p - d)对比输出,展示DMA在大量数据传输中的压倒性优势。

常见误区

误区我以为DMA一旦启动,CPU就可以撒手不管,甚至都不用管大小和方向,全自动搞定。

正解CPU在DMA开始前必须完成初始化:设置内存起始地址、传输字节数、读写方向。传输完成后,DMA控制器还要发一个中断通知CPU。就像传送带虽然自动运货,但你得先告诉工人从哪个仓取、放哪个仓、运多少箱,运完还要在收货单上签个字。

为何常见:很多文章强调DMA“绕过CPU”,让大家误以为CPU完全置身事外;实际“绕过”指的是绕过逐字节搬运,而非绕过敏捷和控制。

误区既然轮询让CPU空等,那中断肯定在所有场景下都比轮询快,选中断准没错。

正解中断每次都要经历响应、保存现场、执行服务程序、恢复现场等流程,固定开销比轮询的一次状态检查大得多。如果外设慢到几乎不需要CPU介入,或者事件频率极低,轮询的实现简单且延迟更可预测;如果外设频繁产生中断,CPU反而疲于应付。就像门铃如果每秒钟响十次,主厨还不如直接站在前台。

为何常见:初学者容易把“中断能提高CPU利用率”等同于“中断更快”,忽略了中断处理本身的开销和频率因素。

误区我以为IO控制器内部有根线直接连到内存,数据可以直接从外设灌进内存,不需要总线。

正解IO控制器通过系统总线(数据总线、地址总线、控制总线)与CPU和内存通信。它的寄存器通过端口地址或内存映射地址被CPU访问。即使是DMA,也是DMA控制器持有总线控制权后,利用总线把数据写到内存,IO控制器本身并不直连内存。好比前台不是直接把菜递给餐桌,而是通过走廊(总线)传送。

为何常见:概念图里为了简洁常画一条直线连接外设和内存,容易让人误以为有专用物理通道。

误区DMA效率高,那就把所有外设的IO都用DMA,包括键盘、鼠标、串口。

正解DMA需要额外的DMA控制器、中断和总线仲裁逻辑,成本不低;而且DMA的数据单元是块,不适合单字节、随机性强的低速设备。键盘按键一次就几个字节,用DMA属于杀鸡用牛刀。只有数据量、频率足够高时,DMA的收益才超过硬件开销。

为何常见:DMA优势太耀眼,容易忽略它的“最低起运量”,就像传送带再快,一次只传一包盐也不划算。

面试题

Q1. 在轮询模式下,CPU主要的工作是?

单选题 · easy

  • A.持续查询外设状态← 正确答案
  • B.等待中断请求信号
  • C.直接改造总路线路
  • D.为外设重新编写驱动

答案:A。轮询的核心就是CPU主动、反复检查IO控制器的状态寄存器,看外设是否准备好。B是中断方式,C和D不是数据传输中的常规操作。就像主厨不停跑前台看有没有订单。

Q2. 中断方式相比轮询的主要优点?

单选题 · easy

  • A.代码实现更简单
  • B.CPU避免忙等浪费← 正确答案
  • C.不需要硬件配置
  • D.传输速度必然更快

答案:B。中断让外设在准备好时主动通知CPU,避免了轮询的忙等,CPU可以利用等待时间执行其他任务。A错在中断需要中断控制器等硬件,代码也更复杂;C错;D不一定,中断有自己的开销。好比门铃让主厨不用一直盯着门口。

Q3. 中断处理过程中,保存现场的目的是?

单选题 · easy

  • A.防止CPU过热
  • B.恢复原程序执行← 正确答案
  • C.提高传输速度
  • D.释放内存空间

答案:B。保存现场是把当前正在执行的程序地址和寄存器状态暂存下来,这样中断服务程序结束后CPU才能回到原处继续工作。就像主厨去处理订单前,先把锅里的菜记住,回来才能继续炒。

Q4. DMA传输启动前,CPU需要设置哪些参数?

多选题 · mid

  • A.内存起始地址← 正确答案
  • B.传输数据块长度← 正确答案
  • C.数据传送方向← 正确答案
  • D.外设的机械转速

答案:ABC。CPU要告诉DMA控制器数据放到内存哪里(地址)、传多少(长度)、从哪边到哪边(方向)。外设机械转速是设备自身的物理参数,不由DMA设置。就像启动传送带前,要设定从多远的仓库、搬多少箱、往哪个储藏室送。

Q5. IO控制器中,用于暂存数据的寄存器是?

单选题 · mid

  • A.状态寄存器
  • B.控制寄存器
  • C.数据寄存器← 正确答案
  • D.地址寄存器

答案:C。数据寄存器(Data Register)专门用于暂存待写入或已读出的数据,起到缓冲作用。状态寄存器反映设备状态,控制寄存器接收CPU命令。好比前台的登记簿暂存顾客留言,而不是状态灯或指挥板。

Q6. 关于DMA传输流程,下列说法正确的有?

多选题 · mid

  • A.CPU初始化DMAC后即可处理其他任务← 正确答案
  • B.传输完成后DMAC会向CPU发中断← 正确答案
  • C.传输过程中CPU完全不能访问内存
  • D.DMAC需要获得总线控制权← 正确答案

答案:ABD。DMA流程是初始化→获得总线→传输→中断完成。CPU初始化后可做别的事;传输完发中断;DMAC要访问总线搬数据。C错,因为周期窃取下CPU在未窃取周期仍可访问内存,只是会有短暂等待。如同传送带运货时,主厨虽然不能占用传送带通道,但仍可在厨房走动。

Q7. 以下哪种DMA工作方式会连续占用总线直到整块数据传完?

单选题 · hard

  • A.周期窃取
  • B.突发模式← 正确答案
  • C.按字节请求
  • D.中断驱动

答案:B。突发模式(Burst Mode)下,DMA控制器获得总线后一口气传完整个数据块,期间CPU无法使用总线。周期窃取是每次只用一个总线周期就释放。就像有人要用传送带连续运100箱货,会暂时占住整个传送带;周期窃取则是偶尔插空放一箱。

Q8. 独立编址方式下,IO端口地址和内存地址的关系是?

单选题 · hard

  • A.完全重叠同一空间
  • B.占用内存的末段空间
  • C.各自拥有独立地址空间← 正确答案
  • D.由程序动态分配

答案:C。独立编址也叫端口映射编址,IO寄存器的地址空间与内存地址空间相互独立,CPU用专门的IO指令访问。内存映射编址则是把IO寄存器映射到内存地址空间。就像餐厅的前台电话分机和客房的房间号是两套号码体系,互不干扰。

Q9. 下列哪些属于常见IO端口编址方式?

多选题 · hard

  • A.独立编址← 正确答案
  • B.内存映射编址← 正确答案
  • C.统一编址
  • D.中断向量编址

答案:AB。常见两种编址方式就是独立编址和内存映射编址(又称统一编址)。中断向量编址是中断机制里的概念,不是IO端口编址方式。C选项“统一编址”实际上是内存映射编址的别名,如果选了C则和B重复,但题目问“哪些属于常见方式”,标准答案是A和B,C虽有别名含义但一般不并列出现。这里选[0,1]更准确。

Q10. 在周期窃取方式下,DMA每次传输数据后,系统总线会?

单选题 · extreme

  • A.一直被DMA占用直到完成
  • B.立即归还给CPU使用← 正确答案
  • C.永久处于空闲状态
  • D.由外设接管进一步传输

答案:B。周期窃取的精髓是DMA每次只“偷”一个总线周期,传完一个字节/字就马上释放总线,让CPU继续使用,如此反复。B正确,A是突发模式,C和D不可能出现。就像传送带和主厨共用一条过道,传送带过去一箱就让开,主厨就能搬其他东西。