ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DMA方式详解:从工作原理到408考点,一次讲透

DMA方式详解:从工作原理到408考点,一次讲透 1. I/O设备与主机信息传送的控制方式全景1.1 为什么要单独聊DMA方式计算机408的计算机组成原理部分存储系统和I/O系统一直是两道硬菜。很多同学复习到I/O这一章时容易被程序查询方式、程序中断方式、DMA方式这三兄弟搞得晕头转向尤其是DMA方式名字高端、原理绕人、考点密集选择题和综合题都爱从这里出题。我先用一句话概括DMA方式的核心思想DMADirect Memory Access直接存储器存取是一种由专门的硬件——DMA控制器DMAC来负责外设与主存之间数据传送的控制方式传送过程中CPU不直接参与数据搬运只在传送开始前做准备工作、传送结束后做收尾处理。这句话几乎是整个考点的题眼。理解透它后面所有细节都能串起来。为什么需要DMA因为在DMA出现之前I/O设备与主存之间的数据传送要么靠CPU亲自搬运要么靠CPU在中断服务程序里搬运。你可以想象一下CPU是一家公司里唯一能做决策的老板程序查询方式就是老板每隔几秒就问一次员工“货到了吗”程序中断方式是员工到了货给老板打个电话老板放下手头工作亲自去搬货。这两种方式有个共同的问题——搬运数据这件事本身占用了CPU最宝贵的时间。早期的外设速度慢CPU等得起。但到了磁盘、显卡、网卡这种高速外设出现后如果每次传送一个字节都要CPU介入CPU基本就废了。举个直观的数字对比假设某设备的数据传输速率为10MB/sCPU主频为2GHz如果每个字节都要CPU执行几条指令来搬运每秒光搬运数据就要执行上千万条指令CPU哪还有精力干别的所以DMA方式登场了。它的本质是雇一个专职的搬运工DMAC老板只需要交代清楚“从哪搬、搬多少、搬到哪”然后放手让搬运工干活干完再汇报一声。1.2 考纲视角这个考点在408中的位置从408考纲来看I/O方式这一节几乎是每年必考。选择题经常考三种方式的对比、DMA与中断的区别、DMA传送流程中的细节判断。综合题偶尔会把DMA和Cache、主存带宽、磁盘读写时间结合起来命题考的是综合计算能力。近几年的命题趋势也非常明显题目越来越喜欢在“周期挪用”“DMA与中断的优先级”“DMA预处理和后处理由谁完成”这些细节上做文章。这些都是初学者最容易含糊的地方。所以这篇文章我打算把DMA方式的原理、流程、对比、考法一次讲透帮你把这部分的分拿稳。这一章的内容适合正在复习408的同学也适合刚学计算机组成原理的本科生。我会尽量把每个概念都讲得接地气一点把那些教材里一句话带过但实际上非常关键的细节摊开来说。2. DMA方式的工作原理与核心细节2.1 DMA方式的本质特征DMA方式的定义教材上是这样写的DMA方式是在外设与主存之间建立直接数据通路进行成块数据传送的控制方式。这句话信息量很大我拆开讲。先说“成块数据传送”。程序查询和程序中断方式本质上都是按字节或字为单位逐个传送的CPU搬运一个字节就要参与一次。DMA方式不一样它是一块一块地搬。一块可以是几十字节、几KB甚至更大。传送过程中CPU完全不用管由DMAC这个专职硬件独立完成。再说“直接数据通路”。在DMA方式下外设和主存之间不经过CPU内部寄存器中转而是通过系统总线直接交换数据。这就像修了一条从仓库到工厂的专用传送带不再需要老板一趟一趟开着叉车来回跑。整个DMA工作过程可以概括成三个阶段预处理阶段CPU向DMAC发送命令告诉它源地址、目标地址、传送字节数等参数然后启动DMA。数据传送阶段DMAC接管总线控制权在外设和主存之间直接搬运整块数据。这个阶段CPU不介入可以继续执行别的程序。后处理阶段数据块传完后DMAC向CPU发出中断请求CPU响应后做结束处理比如检查传送是否正确、决定是否继续下一轮传送。很多同学容易有一个误解以为DMA方式CPU从头到尾都不管。这个理解是错的。CPU管两头开始和结束中间那段最耗时的数据搬运完全交给DMAC。这个“两头管、中间放”的模式就是DMA的灵魂。2.2 DMAC内部有哪些部件要理解DMA怎么工作就得先搞清楚DMA控制器DMAC里有什么。DMAC是DMA方式的核心硬件一般会包含以下几个关键部件主存地址寄存器AR存放要访问的主存单元的地址。每传送一个数据AR内容自动加1指向下一个主存单元。这就是“计数器式寻址”的自动化版本。传送长度计数器WC记录还需要传送的字节数或字数。每传送一个数据WC减1减到0说明整块数据传完了。DMA控制逻辑管理DMA请求、总线请求、总线授权等控制信号是DMAC的“大脑中枢”。中断机构在整块数据传送完成后向CPU发出中断请求通知CPU来收尾。设备地址寄存器DAR存放I/O设备的设备码或设备内部缓冲区的地址。你不需要死记这些部件的英文缩写但要理解它们合在一起完成了一件什么事DMAC自己就能回答“数据从哪来、到哪去、还剩多少、什么时候结束”这四个问题。CPU只需要在开始前告诉它答案它就能自己执行完整趟运输。2.3 DMA方式的三种传送模式DMA在搬运数据时需要占用系统总线。但总线不只是给DMA用的CPU也要用总线取指令、访问数据。所以DMAC和CPU之间存在一个“总线使用权”的竞争问题。教材上一般讲三种工作模式第一种是CPU停止访问主存方式成组传送方式。传送一块数据期间DMAC完全接管总线CPU暂停对主存的访问。这种模式实现最简单控制逻辑也最简单但代价是传送期间CPU基本闲置。适合高速外设成批传送数据的场景。你可以理解成搬运工干活的时候老板坐在旁边干等什么事也做不了。第二种是周期挪用方式周期窃取方式。DMAC在CPU不访问主存的时候偷偷插入几个总线周期来传数据。CPU的正常工作基本不受影响。这种方式需要DMAC和CPU协调好总线的使用权硬件逻辑比第一种复杂但CPU利用率更高。这是408考试最常考的一种模式后面我会专门展开讲。第三种是交替访存方式。把一个存储周期分成两半前半周期给CPU后半周期给DMAC。双方轮流使用主存互不干扰。这种方式对硬件的时序要求最高实际中应用相对较少但选择题偶尔会考到它的名字和基本思想。三种模式的核心区别就一句话DMA传送数据时CPU能不能同时访问主存。能就是周期挪用或交替访存不能就是CPU停止访问方式。2.4 周期挪用模式的细节408最爱考周期挪用是三种模式里最需要抠细节的。它有两种常见的挪用时机一种是CPU正在访问主存时DMAC不能立刻获得总线使用权必须等CPU当前这个访存周期结束后DMAC才能插入一个周期。另一种是CPU暂时不访问主存比如正在执行不需要访存的指令时DMAC可以直接占用一个总线周期。不管哪种情况周期挪用都是“趁着CPU不用总线的间隙快速搬一个数据”。搬完一个数据DMAC马上释放总线把控制权还给CPU。所以整个传送过程是断断续续的——搬一会儿停一会儿再搬一会儿。周期挪用的优点很直观对CPU的打扰最小CPU几乎感觉不到DMA的存在。但它也有代价——每次挪用周期DMAC都要申请总线、获得授权、传送数据、释放总线这套开销是固定的。如果每次只搬一个字节额外的控制开销占比就很大效率反而不高。所以在实际系统中DMA传送往往以字4字节甚至更长的块为单位进行突发传送减少总线切换的次数。408选择题对周期挪用的常见考法有两种一种是问“周期挪用方式下DMA与CPU谁优先使用总线”答案是DMA优先。因为DMA传送有实时性要求比如磁盘数据如果不及时搬走缓冲区可能会被新数据覆盖造成数据丢失。另一种是问“周期挪用方式下DMA每传送一个数据会对CPU造成什么影响”答案是延长了CPU的指令执行周期。因为CPU在DMA挪用总线期间如果有访存需求就得等着。这种“等”不是被中断服务程序打断而是单纯地多等一个总线周期。2.5 DMA能传送哪些方向的数据DMA不只是把外设的数据搬到主存它支持三个方向外设到主存比如磁盘读出的数据直接写入内存缓冲区。主存到外设比如把内存中的数据直接送到磁盘或网卡发出。主存到主存比如内存中两个区域之间的快速拷贝。这种模式也叫存储区到存储区的传送。第三种方向单独提一下因为有些同学会忽略。在主存到主存的传送模式下源地址和目标地址都由主存地址寄存器AR给出DMAC相当于一个高速内存拷贝引擎。在DMA出现之前内存拷贝需要用CPU循环执行Load和Store指令一次拷一个字节。有了DMACPU只需要告诉DMAC源地址、目标地址和长度然后就可以去干别的了。实际应用中DMA主存到主存的传送不如前两种那么常用但理解这种模式能帮你加深对DMAC工作机制的理解——只要源地址、目标地址、长度这三个参数设定好DMAC可以搬运任意方向的数据。3. DMA方式与程序中断方式的核心差异3.1 两条关键脉络响应时机和数据传送单位DMA方式最容易被混淆的概念就是和程序中断方式的关系。很多初学者觉得DMA也涉及中断请求——后处理阶段确实要发中断——那DMA和程序中断是不是差不多本质区别非常大我用一张表给你看清楚对比维度程序中断方式DMA方式数据传送单位字节/字一次中断处理一个数据数据块一次DMA处理一整块响应时机指令执行周期结束CPU响应中断请求一个数据块传送结束DMAC发出中断请求CPU介入程度每个数据的传送都需要CPU执行中断服务程序CPU只在预处理和后处理阶段介入数据传送路径外设→CPU寄存器→主存外设→主存绕过CPU寄存器中断请求的目的请求CPU来搬运数据告诉CPU“数据搬完了你来收尾”优先级一般低于DMA高于程序中断适用场景低速设备、突发性事件处理高速设备、成块数据传送这张表基本涵盖了408选择题的高频考点。我重点讲其中最容易错的两个点。第一响应时机不一样。程序中断方式下CPU响应中断的时机是指令执行结束后的一个固定时刻然后进入中断服务程序。而DMA方式下DMAC发中断请求是在整块数据全部传送完之后。很多题目会在这里偷换概念说“DMA方式是在每个字节传送结束后请求中断”这是典型的错误表述。第二中断请求的目的不一样。程序中断方式的中断请求是外设在“需要CPU帮忙”的时候发出的。比如键盘按下一个键键盘缓冲区里有了一个字符这时候需要CPU来把这个字符读走。而DMA方式在数据传送阶段根本不需要CPU帮忙它发中断的唯一目的是通知CPU“DMA操作完成了该做收尾了”。如果你把这点理解透彻很多辨析题一眼就能看出答案。3.2 数据通路上的差异CPU为什么能省下来再看数据通路的差异。程序中断方式的数据流向是外设 → I/O接口 → CPU的数据寄存器 → CPU执行指令存到主存。每传送一个字节CPU至少要执行几条指令从I/O端口读数据、把数据写入主存、修改地址计数器、判断是否传完、循环回去。这几条指令虽然不多但架不住数据量大——上百万个字节就要执行上百万轮循环。DMA方式的数据流向是外设 → DMAC → 系统总线 → 主存。数据根本不经过CPU内部的寄存器。DMAC自己就能完成“读外设数据→写主存”的操作它内部有独立的地址寄存器和长度计数器不需要借助CPU的寄存器来临时存放数据。你可以把CPU想象成一个总经理程序中断方式是“所有包裹都要总经理亲手拆开、登记、再送进仓库”DMA方式是“总经理雇了一个仓库管理员所有包裹由管理员直接扫码入库只有整批货全部入库后管理员才向总经理汇报一次”。生产力差距就是这样拉开的。3.3 优先级关系DMA与中断谁先响应在同时存在DMA请求和中断请求的系统里优先级怎么排标准答案是DMA请求的优先级高于程序中断请求。原因前面提过DMA传送有时效性。外设的数据缓冲区是有限的如果CPU响应别的中断而耽误了DMA传送外设缓冲区里的数据可能会被新到达的数据覆盖导致数据丢失。而程序中断请求里的数据通常已经稳定地存放在缓冲区里晚一点处理不会丢。这个考点常结合多级中断系统出题。比如题目说“某系统有DMA请求和中断请求同时发生IRET中断级为3DMA控制器的优先级高于所有中断”问你系统会先响应谁答案一定是先响应DMA。如果这套逻辑没理清遇到中断嵌套和DMA组合的题目就很容易卡壳。3.4 DMAT传送完成后的“收尾中断”还会不会再来一次这里有一个很有意思的细节DMA传送结束后DMAC会向CPU发一个中断请求这个中断算不算程序中断答案是算的。DMA的后处理阶段本质上就是一次普通的中断请求和中断响应过程。只不过这个中断请求来自DMAC而且它的含义不是“请CPU来搬数据”而是“请CPU来检查结果、准备下一轮传送”。也就是说DMA方式内部其实是“DMA传送数据块 中断方式做后处理”的组合。教材里常说的“DMA方式与中断方式的结合”指的就是这个意思。这个细节408选择题考过多次表述上经常把“DMA方式完全不使用中断”当成正确选项这是明显的错误。4. DMA工作流程的完整拆解4.1 预处理阶段CPU做了什么预处理阶段是DMA传送的起点。在这个阶段CPU扮演的是“发号施令”的角色具体要做以下几件事CPU执行I/O指令向DMAC的设备地址寄存器写入外设的设备码告诉DMAC“这次你服务的是哪个设备”。CPU向DMAC的主存地址寄存器写入起始地址告诉DMAC“数据搬到主存的哪个位置”。如果是主存到外设的传送这里写入的是源数据的起始地址。CPU向DMAC的传送长度计数器写入要传送的字节数或字数告诉DMAC“总共要搬多少”。CPU向DMAC发出启动命令DMAC开始工作。这四个步骤本质上是CPU通过程序指令往DMAC的寄存器里填参数。很多教材会把“DMAC初始化”这个词挂在嘴边说的就是这件事。这里有个考点值得注意预处理阶段是在CPU执行程序的过程中完成的。也就是说CPU执行到一条专门的I/O指令时会停下来完成DMA的初始化然后继续执行后续指令。这个阶段不需要DMAC申请总线也不涉及总线仲裁因为数据传送还没开始。4.2 数据传送阶段DMAC如何接管总线预处理完成后DMAC就可以开始传送数据了。这个过程的核心是总线控制权的交接我按步骤拆解外设准备就绪向DMAC发出DMA请求信号。DMAC接到请求后通过总线请求信号BR向CPU申请总线控制权。CPU在当前总线周期结束后通过总线授权信号BG把总线控制权交给DMAC。DMAC获得总线控制权后向设备发出DMA应答信号同时开始控制数据传送。DMAC控制总线将外设数据写入主存或从主存读出数据送到外设每传送一个单位主存地址寄存器加1长度计数器减1。重复步骤5直到长度计数器减到0整块数据传送完毕。DMAC撤销总线请求信号把总线控制权还给CPU。第3步这个“当前总线周期结束后”的细节特别重要它意味着CPU不会在指令执行中途被DMA打断而是等当前访存操作完成后再让出总线。这也体现了周期挪用模式对CPU的友好性——数据传送过程中的每个总线周期要么归CPU用要么归DMA用绝不出现冲突。如果传送的是比较长的数据块DMAC可能不是一口气搬完的而是分批次挪用了多个总线周期。每挪用一个周期搬一点数据然后释放总线等下次有机会再搬。这种“搬一点、停一下、再搬一点”的节奏就是周期挪用名字里“周期”二字的由来。4.3 后处理阶段CPU如何知道传送结束数据块传送完毕后流程进入后处理阶段。这个阶段其实就是一个标准的中断响应过程DMAC向CPU发出中断请求信号。CPU响应中断进入中断服务程序。中断服务程序检查DMAC的状态寄存器确认传送是否正常结束如果出错则进行异常处理。如果需要继续传送下一块数据CPU再次执行预处理更新DMAC的参数。中断服务程序结束CPU返回原来的程序继续执行。后处理阶段的时间开销相比数据传送阶段几乎可以忽略不计。比如传送一个4KB的数据块在高速设备和现代总线环境下可能只需要几十微秒而预处理加后处理的中断开销可能只有几微秒。这就是DMA方式效率高的根本原因——CPU的介入时间被压缩到了极致。4.4 一个具体例子磁盘扇区读入内存把流程具体化我用一个常见的场景串联一遍磁盘读取一个512字节的扇区到内存缓冲区。程序先发起磁盘读请求CPU执行预处理把磁盘设备号、内存缓冲区起始地址、传送字节数512写入DMAC然后启动DMA。磁盘控制器开始寻找扇区、读取数据到自己的缓冲区。等到磁盘缓冲区满512字节磁盘控制器通知DMAC“数据准备好了”DMAC开始申请总线通过周期挪用方式分几次把512字节搬到内存的指定缓冲区。每一次搬动都是趁CPU不用总线的间隙。512字节搬完DMAC的长度计数器归零DMAC向CPU发出中断请求。CPU响应后执行中断服务程序检查这次的读入是否成功然后告诉操作系统“数据已经到位可以继续推进”。整个过程CPU只在最开始配置参数和最后收尾时出了力中间的512字节搬运全部由DMAC完成。4.5 传送时间怎么算综合题的套路408偶尔会在综合题或选择题里考DMA的传送时间计算。基本公式不难但要把几个时间区分清楚。DMA传送时间通常可以分为两个部分数据传送阶段用时等于数据块大小除以设备的数据传输速率。比如设备传输速率为5MB/s要传送10KB的数据传送时间就是10KB / 5MB/s ≈ 2ms。CPU的额外开销主要是预处理和后处理中CPU执行指令的时间。如果在周期挪用模式下还要考虑每挪用一次总线周期对CPU的影响。408真题里有一类经典考法求DMA方式下每秒有多少时间被DMA占用于传送数据CPU还有多少时间可以执行程序。解题思路是先算出每秒需要传送的总数据量再除以总线带宽或设备速率得出占用时间剩余时间就是CPU可用时间。比如某外设数据传输速率为100KB/s每次DMA传送一个4KB的数据块总线传输速率为2MB/s。那么每秒会产生25次DMA传送100KB / 4KB每次传送数据需要2ms4KB / 2MB/s每秒传送数据占用50ms。也就是说每秒有50ms被DMA占用CPU大约还有950ms可以正常执行程序。这种“数据量 → 次数 → 时间”三步走的思路是这类计算题的通用解法。提示做DMA计算题时先分清“DMA传送本身需要的时间”和“传送结束后中断处理需要的时间”是两码事。很多同学把中断处理时间也算进DMA传送时间里导致结果偏大。5. 408考点梳理题型、易错点与解题思路5.1 常见的三种出题角度408对DMA方式的考查基本围绕三个角度展开。第一个角度是概念辨析题。给出一段关于I/O控制方式的描述让你判断是对是错。比如“DMA方式在数据传送过程中不需要CPU干预”“DMA方式可以用于主存与主存之间的数据传送”“程序中断方式的数据传送单位是数据块”等。这类题考的是对概念的精确记忆一句话都不允许含糊。第二个角度是流程判断题。给出DMA工作过程中的某几个步骤让你排列顺序或者判断某个环节是否会发生。比如问“DMA传送完成后由谁发出中断请求”“数据传送过程中主存地址寄存器由谁维护”“DMA预处理阶段CPU需要做什么”。这类题考的是对工作流程的熟悉程度。第三个角度是计算题。结合磁盘、总线等知识计算DMA传送时间、CPU被占用时间、最大数据传输速率等。这类题需要你熟练掌握数据量、速率、时间的换算关系。5.2 高频易错点速查表我把这些年在答疑中反复出现的易错点整理成一张表每一行都是一个真实的丢分教训易错点错误理解正确理解DMA响应时机DMA在每个字节传送后请求中断DMA只在整块数据传送结束后发中断请求CPU作用DMA传送过程CPU完全不参与CPU参与预处理和后处理只是不参与数据搬运中断请求来源DMA中断请求来自外设传送结束后的中断请求来自DMAC数据传送路径DMA需要经过CPU寄存器中转DMA直接在外设与主存间传送绕开CPU寄存器优先级中断优先级高于DMADMA优先级高于一般程序中断周期挪用挪用的是CPU执行指令的时间挪用的是总线周期CPU可能因此延长访存等待适用设备DMA只适合低速设备DMA适合高速设备低速设备用中断方式即可这张表里的每一个错误我都见过不止一个同学在真题模拟里踩过。建议你在刷题前先把这七行彻底弄熟能自己从头到尾解释一遍再去做题。5.3 一个典型选择题的完整推演我拿一道典型的408风格选择题来演示解题思路题目说“某计算机采用DMA方式传送数据下列关于DMA方式的叙述中正确的是哪个”A. DMA方式传送数据时需要CPU执行中断服务程序来搬运数据 B. DMA方式可以用于外设与主存之间、主存与主存之间传送数据 C. DMA方式传送数据时每传送一个字节DMAC都要向CPU申请总线 D. DMA方式传送数据的过程不需要经过系统总线逐项看A选项是经典的偷换概念。DMA的数据搬运阶段不需要CPU执行中断服务程序只有后处理阶段CPU才响应中断做收尾。A错。B选项说DMA可以用于外设与主存之间、主存与主存之间的传送这是对的。DMAC只要设置了源地址和目标地址就能在两个方向上搬运数据。B对。C选项虽然看起来很像周期挪用的描述但“每传送一个字节都要申请总线”并不准确。传送单位可以是字节、字也可以是数据块的一部分。而且在成组传送模式下DMAC一次获得总线控制权后可以连续传送很长一段时间根本不需要每字节重新申请。C的绝对化表述是明显的错误。D选项更不用说DMA恰恰是通过系统总线来完成数据搬运的不可能脱离总线。D错。这类题做错的根源往往不是知识面不够而是对教材术语的精确含义把握不到位。复习时建议把教材里所有“不需要”“需要”“由CPU完成”“由DMAC完成”这类表述全部圈出来做成自己的判断题库提分效果非常明显。5.4 复习建议与记忆方法最后聊点备考实操层面的东西。DMA这部分内容我在辅导学生时发现很多同学不是看不懂而是看完就忘。原因很简单——知识是零散的没有一个主线把它们串起来。我自己的记忆方法是画一条时间线DMA的一生 先被CPU配置参数 → 接管总线搬数据 → 搬完向CPU汇报 → CPU收尾。把这条线画在纸上然后把每个阶段对应的硬件部件、寄存器操作、CPU状态填进去一张图就能覆盖DMA方式90%的考点。第二个建议是注意对比学习。DMA不要单独复习要放在“程序查询方式 → 程序中断方式 → DMA方式”这条进化链里去理解。每一种新方式的出现都是为了解决前一种方式的痛点。查询方式痛在“CPU傻等”中断方式痛在“CPU还要亲自搬数据”DMA则同时解决了这两个问题。这样一串起来你不仅记住了知识点还能推断出一些教材上没直接写、但考试可能考的结论。第三个建议是关于刷题的。408真题中I/O方式的题目重复率不低做完一轮真题后可以专门把I/O控制方式的题目汇总在一起对比看。你会发现命题人特别喜欢把DMA和中断放在同一个选项组里让你分辨细微差别。这种题没有捷径只能靠平时对概念的精读和积累。6. 实际应用场景的延伸思考6.1 磁盘读写中的DMA一次完整的读写之旅DMA方式在磁盘读写中的应用最为典型。传统硬盘和SSD都使用DMA技术只不过实现细节有所差异。传统硬盘读一个扇区的过程大致是操作系统向磁盘控制器发出读命令指定逻辑扇区号和内存缓冲区地址然后把控制权交给DMA控制器。磁盘控制器把扇区数据读入自己的缓冲区通过DMA方式把整个扇区的数据传输到内存。传输完成后磁盘控制器通过DMA控制器发出中断通知CPU“数据已经到位”。整个过程中CPU不需要逐字节读取磁盘数据只需要在开始前指定参数、在结束后处理结果。SSD设备虽然底层存储介质不同但对CPU来说数据传送的控制方式仍然沿用DMA。从这里可以看出DMA已经不是一个可选的“高级功能”而是现代存储系统的基本能力。6.2 网络设备与DMA高速传输的地基网络接口卡NIC也是DMA技术的重度使用者。网卡收到一个网络数据包后如果不使用DMACPU需要把包里的每一个字节从网卡缓冲区搬到内存一个1500字节的以太网帧就需要CPU搬运1500次。在高网络流量场景下这种搬运开销会瞬间耗尽CPU计算资源。使用DMA后网卡可以通过DMA把整个数据包直接搬到内存中的收包缓冲区CPU只需要在网络协议栈处理阶段对这些数据进行处理。很多高性能网络系统的设计里CPU甚至可以在收包过程中完全零数据拷贝靠的就是DMA加上内存映射技术。这套机制在考研面试里如果被问到“现代计算机为什么离不开DMA”你就可以从CPU效率的角度去回答没有DMACPU只能处理低速外设的数据传输高速外设的性能会被CPU的搬运能力锁死。6.3 DMA方式的局限性不是万能的DMA虽然强大但也有自己的局限性这一点408不太常考但对理解整个I/O体系有帮助。首先是总线竞争问题。DMA需要占用总线多个DMA设备同时请求时就需要总线仲裁。仲裁策略不合理会导致某个设备的DMA请求长期得不到响应数据丢失。现代计算机通过多总线结构和多级DMA控制器来缓解这个问题。其次是内存一致性问题。在多核处理器系统中CPU和DMA都可能同时访问内存如果CPU缓存了内存中的数据DMA修改了同一块内存区域就可能出现“CPU读到的还是旧数据”的情况。这涉及缓存一致性协议是系统和体系结构课程里的进阶话题。最后是复杂的初始化成本。每一次DMA传送的预处理都需要CPU执行多条指令来配置DMAC寄存器对于大量小数据块的传送场景预处理开销可能吞掉DMA带来的收益。这也是为什么很多实际系统会尽量设计成“一次性传送大块数据”而不是频繁触发小规模DMA。7. 结语DMA的考法我已经帮你踩平了说句实在话408里I/O方式这一节真的是典型的“背多分”内容。DMA方式本身并不难难的是各种细节之间的区分——什么时候CPU管、什么时候DMAC管、什么时候发中断、谁发中断、搬多少数据、走哪条路径。复习DMA的方式我的体会是不要死记教材上的长篇论述而是抓住“预处理、数据传送、后处理”三段式的主线配合对比表格和流程图把每个阶段里CPU和DMAC的职责边界划清楚。再配合真题和模拟题把选择题里那些陷阱表述全部过一遍这部分分数基本就能稳拿到手。如果你现在正被I/O方式里的各种细节搞得烦躁不妨按这篇文章的思路拿一张白纸自己画一遍DMA的完整流程图再对照真题检验一遍。相信我画完这张图之后你的脑子会清爽很多。
返回列表