408组成原理大题:DMA与磁盘磁道扇区计算全拆解

发布时间:2026/9/28 20:00:21
408组成原理大题:DMA与磁盘磁道扇区计算全拆解 备考计算机408计算机组成原理的大题一直是拉开分差的关键尤其是2022年的第44题很多人在考场上被它狠狠绊了一下。这道题表面上是在考磁盘读写实际上把I/O设备与主机之间信息传送的控制方式DMA方式和外存的磁道、扇区计算全部串在了一起。如果你只是背过“DMA是直接存储器存取”这句话却说不清楚DMA控制器怎么取总线、数据怎么搬运、中断什么时候来那遇到这道题大概率会慌。我去年复习时反复把这道题和相关知识点啃了三遍踩了不少坑也总结出一套比较好用的拆解思路。这篇文章不重复市面上那种“考点罗列”而是把DMA的工作流程、磁道扇区的计算逻辑、以及两类知识怎么在一道大题里协同掰开揉碎讲清楚文末还附了一套可自测的模拟题希望能帮正在刷408真题的你少走弯路。1. DMA方式不是孤立概念先想明白它从哪来、要解决什么问题1.1 程序查询方式和中断方式各自的瓶颈在哪任何一本组成原理教材讲I/O控制方式顺序一定是程序查询、程序中断、DMA、通道I/O处理机。这个顺序本身就是一条“CPU从繁重I/O负担里逐步解放”的演进路线。程序查询方式最简单但核心问题是CPU必须轮询设备状态。比如打印机打印一个字符CPU要反复读状态寄存器看它是不是忙完了忙完了才写入下一个字符。只要设备运行CPU就被死死拴在状态查询上表面上看CPU在“干活”实际上是在空转等待。这种方式的效率低到离谱但优点也明显控制逻辑简单不需要额外硬件早期嵌入式系统里还有用。真题一般不会直接考深度计算但会拿来和DMA做对比问你“为什么现代磁盘不用程序查询”。答案核心就是磁盘数据速率太高CPU轮询根本接不住而且轮询过程大量浪费CPU时间。程序中断方式比查询好一些它让设备在需要服务时主动发中断请求CPU可以先干别的事。但问题在于每传送一个字节或一个字CPU都要经历“保护现场—识别中断源—跳转中断服务程序—搬运数据—恢复现场—返回到断点”这一整套流程。这里有个容易被忽略的点中断服务程序里真正干活的部分就是一次内存读写但现场保护和恢复的开销远大于数据搬运本身。如果磁盘每秒钟要传送几千字节中断开销就会把CPU彻底淹没。所以说中断方式适合数据量小、频率低的设备比如键盘、鼠标一旦面对高速块设备中断方式就从“解放CPU”变成了“拖垮CPU”这也是DMA方式出现的直接原因。1.2 DMA控制器的“专职搬运工”定位DMA全称Direct Memory Access直译是“直接存储器访问”。核心思路特别朴素与其让CPU把数据从设备寄存器搬到内存不如在内存和设备之间专门建一条高速通道由一个专用硬件来负责搬运这个硬件就是DMA控制器DMAC。CPU只在传输开始前告诉DMAC“数据从哪里来、要到哪里去、传多少”然后转身去做自己的事等到一整块数据都搬完了DMAC再给CPU发一次中断告诉它“活干完了”。你可以把CPU想象成一个老板把DMA控制器想象成老板雇来的专职快递员。老板不需要自己一件一件搬箱子只需要在开工前写下装货地址、卸货地址、货物件数快递员就一趟一趟跑完活最后回来报告。这样老板才能腾出时间写方案、开会也就是继续执行主程序。这里必须提醒一点DMA方式并不是完全不打断CPU。它传输数据时是要占用存储总线的CPU一旦需要访存就得停下来等一个或者几个存储周期这叫“周期窃取”。所以严谨地说DMA让CPU从数据搬运中解放出来但无法做到100%零干扰。真题里经常考的就是计算这个“干扰比例”DMA传输数据占主存带宽的百分比或者单位时间内DMA请求导致CPU暂停的次数。1.3 DMA完整工作流程拆解预处理、数据传送、后处理DMA的完整过程可以拆成三个阶段每个阶段对应一道题里可能考到的知识点。预处理发生在DMA正式搬运数据之前由CPU执行若干指令完成。CPU要做的事包括向DMA控制器写入主存起始地址或者外设地址、传输的字数或字节数、传送方向读盘还是写盘、启动设备等。在写地址和字数的过程中CPU是一对一跟DMA寄存器打交道的所以这部分时间算在CPU头上。题目如果问你“CPU准备一次DMA传送需要多少时间”要去看CPU访问寄存器所用时间和寄存器个数但这在408真题中出现频率不高。数据传送阶段是DMA的核心。对于磁盘这类块设备DMA往往按一个扇区或者连续若干个扇区作为一次数据块来传送。DMAC先向总线仲裁器发出总线请求获得总线使用权后通过总线在设备和内存之间直接传数据。每传一个字主存地址寄存器加1或减1传输计数器减1直到计数器归零本次DMA数据块传送完成。这个过程中数据不经过CPU的内部寄存器这是它和中断方式最本质的区别。中断方式下数据必须先读到CPU累加器再写回内存DMA方式下数据流根本不进CPU走的是总线上的专用通路。后处理发生在一次DMA数据块传完之后。DMAC向CPU发出中断请求CPU响应后执行中断服务程序对数据块进行校验、检查本次传输是否出错、决定是否启动下一次DMA传送。你可能觉得奇怪不是已经很省心了吗为什么还要中断因为DMA不会帮你判断“这扇区数据读出来对不对”它只是机械地搬运。后处理通常还要做“是否全部数据已经传完”的判断如果没传完CPU就要重新设置寄存器启动新一轮DMA。这里就是真题容易设陷阱的地方很多人以为DMA传送一整块磁盘数据只需要中断一次实际上如果磁盘控制器每次DMA只传一个扇区那么一个文件跨多个扇区就需要多次DMA每一次DMA结束CPU都要被中断一次中断次数和扇区数量挂钩。2. 外存计算题怎么不丢分磁道、扇区这些概念必须形成立体图景2.1 盘片、磁道、柱面、扇区到底是怎么排布的很多同学背公式能把磁盘容量公式背下来但是一到题目描述“8个记录面每面2560个磁道每磁道128个扇区”就懵了主要是脑子里没有一个立体模型。硬盘本质上是一摞圆形盘片同轴安装每张盘片上下两面都能记录数据这两个面叫记录面。每个记录面上有很多个同心圆轨道叫磁道磁道从外圈向内编号最外层是0磁道。所有盘片上半径相同的磁道组成一个圆柱形的面叫柱面。为什么要引入柱面因为磁头臂一伸出去所有盘片对应半径的磁道就能同时被读到定位时只需要找“柱面号”不需要单独指定每个盘面的磁道号。扇区则是把每个磁道按角度等分成若干弧段每段就是一个扇区扇区之间有间隙通常每个扇区的字节数是512B或4KB。磁盘地址一般写成“驱动器号/柱面号/盘面号/扇区号”。这个顺序其实是有讲究的读数据时先寻道到柱面再激活对应盘面磁头最后等磁盘转到扇区起始位。真题里如果让你计算某个逻辑块对应的物理位置往往就要用这个地址关系。2.2 容量计算公式格式化容量和非格式化容量的区别磁盘容量有两种非格式化容量和格式化容量。非格式化容量把磁道间隙、扇区头尾等信息占的空间也算进去计算公式是“记录的位密度 × 磁道总长度 × 磁道总数”格式化容量才是用户实际可用的容量按扇区计算公式是格式化容量 记录面数 × 每面磁道数柱面数 × 每磁道扇区数 × 每扇区字节数这里特别容易漏乘一个“记录面数”。很多题目给的是“有8个盘片”那不是8个记录面而是16个记录面每张盘正反面都能用。如果题目直接说“8个记录面”或者“8个盘面”就按8来算不要自己乘2。真题一般不会在这里挖坑但概念要清楚。拿到具体数字时一定要先画乘法式子再算。比如一个硬盘有8个记录面、每面2560个磁道、每磁道128个扇区、每扇区512B那么格式化容量 8 × 2560 × 128 × 512 B。先整理成2的幂8是2的3次方2560可以拆成256×102^8×10128是2^7512是2^9算起来会快很多最后得到字节总数再除以1024或1000换成KB、MB、GB。做题时注意题干要求用二进制2的倍数还是十进制1000的倍数408考试一般默认用二进制换算但读题时仍要扫一眼单位描述。2.3 数据传输率和访问时间的精确计算法数据传输率和访问时间是外存计算的两大支柱。数据传输率也叫磁盘的数据速率表示磁盘每秒能从介质上读出多少字节公式有两种写法数据传输率 每磁道扇区数 × 每扇区字节数 × 磁盘转速转/秒或者换一种等价思路传输率 每磁道容量 ÷ 转一圈所需时间。比如转速是7200rpm转每分钟那么每秒转数就是7200 ÷ 60 120转/秒。如果每磁道有128个扇区每扇区512B那么每磁道容量是128 × 512 64KB数据传输率 120 × 64KB 7680KB/s约7.5MB/s。这个数意味着磁盘每秒钟能连续读出约7.5MB数据读一个4KB文件只需很短时间但实际读出文件还包括寻道和等待扇区的时间。磁盘访问时间 寻道时间 旋转延迟时间 传输时间。寻道时间指磁头移动到目标磁道的时间题目一般直接给平均寻道时间比如5ms。旋转延迟是磁头已经定位到磁道后等待目标扇区转到磁头下方的时间。如果磁盘正在匀速旋转目标扇区的位置从当前位置到最远可能差一整圈平均情况就是转半圈所以平均旋转延迟 转一圈时间的一半。转一圈时间是转速的倒数转速7200rpm时转一圈时间是60 ÷ 7200 1/120秒约8.33ms平均旋转延迟约4.17ms。如果题目没有特殊说明“目标扇区刚好就在磁头下方”一律按“转半圈”处理这是判卷默认的约定。传输时间 读出的数据总量 ÷ 数据传输率。如果读出的是几个连续扇区还有一个更直观的算法读出占磁道比例 × 转一圈时间。比如每磁道128个扇区要读4个连续扇区占128分之4也就是1/32那么传输时间就是转一圈时间8.33ms × 1/32 ≈ 0.26ms。这个方法在计算混合题时特别好用不用绕到传输率再兜回来。把寻道、旋转延迟、传输三段加起来就是一次读盘平均耗时。3. 真题考法复盘22年44题把DMA和磁盘计算拧成了一股绳3.1 真题到底想考什么从解题突破口反推得分点22年这道44题给我们的最大启示就是计算题一旦披上外存的外壳本质还是I/O控制方式的时间关系题。它反复在问几件事数据一次DMA能传多少DMA传完一个单位数据花多少时间在这段时间里CPU有多少次需要暂停暂停的时间占总时间多少这些问题的核心模型就是“设备以恒定速率产生数据DMA以固定块大小搬运数据CPU和DMA分时使用存储总线”。我建议大家拿到这类题不要先着急算容量而是先把题干里的所有时间参数和容量参数列出来标出两个方向一个是I/O设备的数据产生速度一个是DMA搬运数据的速度。磁盘的旋转速度决定了扇区到达的速率DMA的数据搬运速度受限于存储周期和每次传输的字数两个速度一旦不匹配要么缓冲区溢出要么总线空闲。真题往往就是利用这个矛盾设计问题。另外这类题有一个隐形的思想主线DMA之所以适合磁盘是因为磁盘的数据流是连续快速的而且一次I/O动辄几十KB若用中断方式每一字节都断一次CPU谁都扛不住。理解了这条主线遇到“为什么磁盘采用DMA而不采用中断方式”的简答题你就知道该答设备速率快、中断开销大、DMA能批量传输这三个层面了。3.2 一组贴近真题的模拟题完整梳理DMA与磁道扇区的计算链我从22年44题的考查风格出发把可考的边角料都塞到下面这道模拟题里。参数接近真题风格但数字是我自己设计的主要用来训练思路不是让大家背答案。假设某磁盘采用DMA方式与主机交换数据。磁盘转速为7200rpm共有8个记录面每面2560个磁道每磁道128个扇区每扇区512B。平均寻道时间为5ms。DMA控制器每次DMA传送一个扇区的数据主存存取周期为100ns主存数据线宽度为16位每次DMA传送一个16位数据需要占用一个存储周期磁盘数据传输到内存的过程完全由DMA控制。文件系统使用4KB大小的簇一个簇在磁盘上连续存放。求该磁盘的格式化容量该磁盘的数据传输率读取一个完整簇的数据平均需要多长时间假设簇的第一个扇区正好需要平均旋转延迟且簇内扇区连续采用DMA方式读取一个扇区时CPU需要暂停多少个存储周期这些暂停时间占该扇区平均访问时间的比例是多少先做第1问。格式化容量公式直接套8个记录面 × 2560个磁道 × 128个扇区 × 512B。2560按2进制换算容易乱我们直接拆开8 × 2560 20480个磁道面总磁道数这里就理解为总的“磁道记录面”20480 × 128 2621440个扇区2621440 × 512B 1342177280B约1.25GB因为1GB2^30B1342177280/10737418241.25。这个结果合理也是常见机械盘容量规格。第2问数据传输率 每磁道容量 × 每秒转数。每磁道容量 128 × 512B 65536B 64KB。每秒转数 7200/60 120转/秒。所以数据传输率 65536 × 120 7864320B/s约7.5MB/s。第3问一个簇是4KB每扇区512B所以一个簇占8个连续扇区。读取这个簇时先寻道平均寻道时间5ms再等待目标扇区转到磁头下方平均旋转延迟4.17ms然后连续读出8个扇区8个扇区占每磁道128扇区的比例是8/1281/16转一圈8.33ms所以传输时间 8.33ms × 1/16 ≈ 0.52ms。平均总时间 5 4.17 0.52 9.69ms。这里有个容易忽略的细节如果簇的8个扇区横跨磁道比如一个簇从一个磁道的末尾跨到下一个磁道的开头那读簇过程就要额外加一次寻道或者一次旋转延迟但题目明确说了“簇内扇区连续”默认为在同一磁道内连续存放“连续存放”意味着跨磁道时其实还在同一柱面的下一条磁道严格来说是跨磁道需要磁头切换切换时间很小题目没有特别说明通常忽略。做题时要看题干有没有“连续存放”以及“忽略磁头切换时间”这一类提示。第4问最贴近DMA考的底层逻辑。一个扇区512B主存数据线宽度16位即2字节那么一个扇区需要搬运512/2 256个16位数据。每次DMA传送一个16位数据占用一个存储周期存储周期为100ns所以一次DMA完成一个扇区传送需要CPU暂停256个存储周期暂停时间 256 × 100ns 25600ns 0.0256ms。而读取一个扇区的平均时间 寻道平均5ms 旋转延迟平均4.17ms 单个扇区传输时间1/128 × 8.33ms ≈ 0.065ms 9.235ms。DMA导致的CPU暂停时间0.0256ms占这个过程的0.28%左右几乎可以忽略。但要注意这个占比算得小是因为我们把寻道和旋转延迟都算进“平均访问时间”里了。真题如果问“DMA传送期间CPU暂停时间占总传送时间比例”则分母只算数据传送阶段不含寻道和旋转比例就会变成100%因为DMA在整个数据传送阶段一直占用存储周期。所以做题时一定要看清楚题目说的是“占一次读操作时间”还是“占数据传输时间”。3.3 这类计算最容易绕晕的单位换算梳理我把这道模拟题的四个小问串起来就是想让大家看到DMA和外存计算结合的核心是单位换算。转速有“转/分”和“转/秒”时间有“ms”和“ns”容量有“B”“KB”“MB”“GB”DMA字长有“8位”“16位”“32位”。我自己的习惯是把所有单位先统一到“字节、秒、转”这个基本三元组里再开始算。比如转速7200rpm先转成120转/秒存储周期100ns先记成0.1us或者直接写成1×10^-4ms扇区字节数则始终用512B而不是0.5KB这样后面做除法的时候不容易漏小数点。单位换算看着简单但考场上一紧张就出错。强烈建议草稿纸上先写“已知量化简清单”转速7200rpm 120转/s转一圈时间1/120s ≈ 8.33ms每扇区时间8.33ms ÷ 128 ≈ 0.065ms存储周期100ns 0.0001ms把这些基础数字写完再去做任何小问都会快很多而且算完可以反向检查如果算出某个时间比转一圈8.33ms还长那说明模型肯定错了因为读出单个磁道内数据最多不会超过8.33ms。4. 常见坑点和排查技巧实录我从真题和模拟卷里踩出来的经验4.1 容量计算时漏乘“记录面数”或者把“8个盘片”当“8个记录面”这是外存计算第一大坑。“盘片”和“记录面”完全不是一回事。一张盘片有正反两个面所以“8个盘片”对应16个记录面而题目一旦说“8个记录面”通常就默认只有8面可用可能是因为有一面贴了保护标签或者其中一面做了非记录用途。如果题目出现“有效记录面”“可用记录面”更要看仔细。最好的办法是一看到盘片数据就条件反射地列出来记录面数到底是多少然后代入容量公式不要让乘法算式直接滑过。4.2 旋转延迟“平均半圈”还是“一整圈”别把平均延迟和最大延迟混为一谈很多参考书喜欢说“旋转延迟的时间 磁盘旋转一周时间的一半”有人不理解为什么不是等比别的位置。因为目标扇区可能正好在磁头下方延迟0也可能刚转过去一点点延迟接近一整圈所有可能位置的等待时间均匀分布在0到一整圈之间平均就是半圈。真题如果给的是“平均旋转等待时间”直接就能用如果只给转速就要先算“转一圈时间”再除以2。另一种题型是告诉你“磁盘从当前位置转到目标扇区需要经过N个扇区”这时就不能用平均半圈了直接按N个扇区对应的时间算。这种更精确的考法在指令调度题里常见但在408组成原理大题里出现频率不高不必过度纠结。4.3 DMA的“一次传送”到底是多大一块别把它等同于一次磁盘I/O的全部数据DMA方式里的“块”是一个由硬件决定的概念不等于文件系统中一次读写的全部数据。常见的情况是磁盘控制器每次I/O中断后DMA以扇区为单位搬运或者以突发方式连续传多个扇区。如果题干没说“一次DMA传送整个簇”那默认一次DMA传一个扇区每传完一个扇区就中断CPU一次。这样算下来CPU就能粗算出中断频率数据传输率7.5MB/s每扇区512B那么每秒要完成约15000次DMA块传送也就是每秒产生15000次中断。高频但比中断方式每字节一次了好太多。如果题目问“CPU响应DMA中断的频度”你可以通过“数据总量 ÷ 每次DMA块大小”来求。4.4 备考材料怎么用王道、唐朔飞、白中英各自的侧重点现在很多人在纠结看王道还是唐朔飞还是白中英。我自己的感受是王道强化课对408考试题型研究得最透适合用来建立知识框架和刷题唐朔飞的教材讲得细尤其是I/O部分的中断和DMA流程图值得精读但没必要把每个硬件信号都背下来白中英的教材相对精炼适合快速过概念。如果你时间紧优先把王道计组I/O章节的课后题和历年真题吃透再回到唐朔飞教材对照DMA流程自己画一遍状态转换图。这里提“画图”不是让你画复杂的时序而是画一个简化的传送过程CPU初值设置 → DMA请求总线 → 总线批准 → 数据传送 → 计数器减一 → 计数到0中断。自己画一遍比看十遍都有效因为考试时你脑子里就有了“动图”。5. 一套亲测可用的综合题解题流程从读题到检查不超过15分钟5.1 三步拆题法保证不漏条件面对一道“DMA磁盘”的综合大题我自己的流程固定为三步。第一步把题干中所有数值按“存储结构参数”和“时间参数”分类列进草稿纸。存储结构参数包括盘面数、磁道数、扇区数、每扇区字节数、簇大小、主存数据线宽度时间参数包括转速、寻道时间、存储周期、DMA传送单位。第二步根据目标问题确定该走哪条公式链。求容量走“盘面数×磁道数×扇区数×字节数”求数据速率走“每磁道容量×转速”求访问时间就拆“寻道旋转传输”求DMA影响就拆“一次DMA块字节数÷每次总线传输字节数×存储周期”。第三步代入前先统一单位计算结果后做一次合理性检查。比如CPU暂停占比如果超过100%或者平均访问时间小于传输时间的一半那一定哪里算错了。这个方法看起来笨但能救命。考场紧张时最容易犯的错就是想到哪步算哪步结果算了半天发现题目第一问要的是容量你算的却是柱面数。把条件列出来其实每道题就是看条件往公式里填。5.2 一张浓缩到不能再浓缩的公式速查表下面这张表我考前一直默背你也可以照着自己整理一份名称公式注意磁盘格式化容量记录面数 × 每面磁道数 × 每磁道扇区数 × 每扇区字节数盘片不等于记录面数据传输率每磁道扇区数 × 每扇区字节数 × 每秒转数等价于每磁道容量 × 转速旋转一圈时间1 / 每秒转数单位统一为秒平均旋转延迟旋转一圈时间 / 2均匀分布下的期望磁盘访问时间寻道时间 旋转延迟 传输时间注意题目是否忽略寻道DMA一次传送时间DMA块字节数 / 每次总线传输字节数 × 存储周期总线宽度决定每次传输字节数DMA占CPU总线比例DMA传送时间 / 总耗时先看清分母是全部读时间还是仅传输时间把这表里的每个公式用自己话解释一遍比抄十遍管用。尤其最后一行“DMA占CPU总线比例”一定要养成习惯先问自己题目问的占比的“总”是谁。因为有的题会拿“整个磁盘平均访问时间”当分母有的题会拿“DMA有效传输时间”当分母这两个答案完全不同。5.3 一个检查答案的独门习惯用“极限思维”验证最后分享一个我每次做题都会用的怪招算完一个结果后把某个参数往极端方向推一下看答案是否符合直觉。比如算DMA传输占总线时间比例可以设想转速极大、寻道时间极小如果公式推出来的占比和“搬运扇区本质所花时间”矛盾那就说明你没有把DMA的重复搬运过程算全。再比如算访问时间时一个簇只包含一个扇区那么平均访问时间应当近似等于寻道半圈单扇区传输时间如果公式算出来比这个还小一定是把寻道或旋转漏了。这种极限检查不需要花太多时间但对减少低级失误非常有帮助尤其在考场上抬头一看表还剩五分钟的时候。我在实际复习中最大的体会是408的题从来不是考你背不背公式而是考你在单位混乱、场景嵌套的情况下能不能保持清醒。22年44题把DMA和外存计算放在一起表面上是两个章节的知识点合体骨子里其实只考一件事弄懂数据从磁盘到内存到底经过了谁的手、每一步花多少时间。把这个过程在脑子里像慢镜头一样过一遍你会发现它并不可怕。后面复习遇到同类题目先画流程再动笔你也能稳稳拿满这道十分左右的大题。