ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

408真题解析:DMA与外存磁道扇区计算全拆解

408真题解析:DMA与外存磁道扇区计算全拆解 1. 从一道408真题说起DMA与外存计算到底在考什么每年考研计算机统考结束408的讨论群里总有一批人被同一类题卡住——不是不会写代码也不是没背过公式而是题目把DMA方式和磁盘磁道扇区计算揉在一起考读完题就懵了。2022年第44题就是典型代表表面上看是一道关于I/O控制方式的题实际上它同时踩中了两个高频考点——DMA的数据传送机制和外存地址到磁道/扇区的映射计算。我当年备考时在这道题上栽过跟头后来带学弟学妹复盘发现大家的问题高度一致DMA的三种传送方式停止CPU访存、周期挪用、交替访问背得滚瓜烂熟但一到具体算“传送一个数据块需要多少时间”“磁头要移动多少个扇区”就卡壳。根本原因在于DMA和磁盘计算这两个知识点在教材里是分开讲的但考试偏偏要把它们缝在一起。这篇文章就是要把这条缝拆开给你看。我会从DMA的底层逻辑讲起把周期挪用的时间计算掰开揉碎再过渡到磁盘的磁道、扇区、柱面这套地址体系最后用22年44题的思路把两者串起来。不管你是正在备考408的考生还是想重新梳理计算机组成原理的从业者这篇内容都能让你对“数据怎么从磁盘搬到内存”这件事有一个完整的、能动手算的认知。先给结论这类题的核心就三件事——搞清楚谁在控制总线、算清楚每个扇区要花多少时间、弄明白磁道和扇区的编号规则。下面逐个拆。2. DMA方式的核心机制与三种传送模式2.1 DMA到底解决了什么问题在DMA出现之前CPU要读磁盘数据得自己一条一条执行指令读状态寄存器、判断是否就绪、从数据端口取数、写到内存。这个过程叫程序查询方式CPU全程被拴在I/O上啥也干不了。后来有了中断方式CPU可以先去干别的等磁盘准备好了再打断它。但中断方式有个硬伤每传一个字或一个字块都要打断CPU一次磁盘这种高速设备传起数据来CPU光处理中断就忙不过来。DMA的思路很直接找个专门的控制器DMAC来搬数据CPU只负责开头和结尾。CPU告诉DMAC“从磁盘的哪个地址读到内存的哪个地址、读多少”然后就可以去干自己的事了。DMAC自己控制总线自己完成数据搬运搬完了再给CPU一个中断说“搞定了”。这就是DMADirect Memory Access直接存储器访问的本质——数据传送不经过CPU直接在设备和内存之间进行。这里有个关键点很多人忽略DMA传送的是数据不是指令。CPU仍然要执行指令来初始化DMA、处理DMA完成后的中断但数据本身不经过CPU的寄存器。这就好比你要搬家程序查询方式是你自己一趟一趟搬中断方式是你搬一趟接一个电话DMA是你雇了个搬家公司你只需要告诉他们搬什么、搬到哪然后你就可以去上班了。2.2 三种DMA传送方式的时间账DMA和CPU都要访存但内存同一时刻只能被一个设备访问。怎么协调这就引出了三种经典方式停止CPU访存DMAC要传数据时直接给CPU发一个信号让CPU暂停访存。等DMA传完一个数据块再把总线控制权还给CPU。这种方式控制简单但CPU在DMA传送期间完全不能访存效率低。适合数据块很大、CPU暂时不需要访存的情况。周期挪用周期窃取这是考试最爱考的方式。DMAC要传数据时趁CPU不访存的那些总线周期“偷”一个周期来传数据。如果CPU正在访存DMAC就等一个周期。这种方式下CPU的访存基本不受影响DMA也能及时传数据。但要注意每偷一个周期CPU就少执行一条指令的时间。交替访问把CPU的工作周期分成两半一半给CPU访存一半给DMA访存。这种方式不需要总线请求和响应但要求CPU和DMA的访存周期匹配实现起来复杂实际用得少。考试里最常考的是周期挪用因为它涉及具体的时间计算。我拿22年44题的数据来算一遍你就明白了。假设磁盘的传输速率为4MB/sDMA每次传送一个32位4字节的数据CPU的时钟频率为500MHzCPI为5即平均每条指令需要5个时钟周期。问采用周期挪用方式DMA传送一个数据对CPU执行指令的影响有多大先算磁盘传一个4字节数据需要的时间4B ÷ 4MB/s 1μs。再算CPU一个时钟周期1 ÷ 500MHz 2ns。CPI为5所以CPU执行一条指令需要5 × 2ns 10ns。在1μs内CPU本来可以执行1μs ÷ 10ns 100条指令。但DMA每传一个数据要偷一个总线周期假设一个总线周期等于一个时钟周期2ns那么DMA偷走2nsCPU实际可执行的时间变成1μs - 2ns 998ns能执行998ns ÷ 10ns ≈ 99.8条指令。也就是说DMA每传一个4字节数据CPU大约少执行0.2条指令。这个计算看着简单但考场上很多人会犯两个错误一是把磁盘传输速率和DMA传送速率搞混二是忘记把CPI乘进去。记住磁盘传输速率决定DMA多久要传一次数据CPU的时钟频率和CPI决定CPU在这段时间里能干多少活。注意周期挪用方式下DMA偷走的周期数取决于数据总线的宽度。如果数据总线是32位传一个32位数据只需要一个总线周期如果数据总线是16位就需要两个总线周期。题目里如果没明确说默认数据总线宽度和DMA传送的数据宽度一致。2.3 DMA控制器的内部结构与工作流程要真正理解DMA光知道三种方式不够还得看看DMAC里面有什么。一个典型的DMAC包含以下寄存器内存地址寄存器MAR存放数据在内存中的起始地址每传一个数据自动加1或加数据宽度。传送长度计数器DC存放还要传多少个数据每传一个减1减到0时发出完成信号。设备地址寄存器DAR存放I/O设备的地址用于选择设备。控制与状态寄存器存放控制位如传送方向、是否允许中断和状态位如是否完成、是否出错。工作流程是这样的CPU初始化DMAC的各个寄存器然后启动DMA。DMAC向CPU发出总线请求HOLDCPU响应后让出总线HLDA。DMAC控制总线从设备读数据写到内存或从内存读数据写到设备同时修改MAR和DC。当DC减到0时DMAC释放总线并向CPU发出中断请求。这里有个细节DMA的传送方向可以是设备到内存也可以是内存到设备。磁盘读操作是设备到内存写操作是内存到设备。考试里如果考写操作时间计算是一样的只是数据流向反过来。3. 磁盘的磁道、扇区与地址映射计算3.1 磁盘的物理结构从盘面到扇区磁盘的物理结构可以这样理解一个盘片有两个盘面每个盘面有很多同心圆每个同心圆叫一个磁道每个磁道被分成若干扇区。所有盘面上相同位置的磁道组成一个柱面。读写数据时磁头先移动到指定磁道寻道然后等待指定扇区旋转到磁头下方旋转延迟然后开始读写传输时间。这里的关键参数有磁道数每个盘面的磁道数量决定了磁盘的容量上限。扇区数每个磁道的扇区数量通常外圈磁道扇区多内圈扇区少现代磁盘采用等密度记录但考试里为了简化通常假设每个磁道扇区数相同。扇区大小通常是512字节或4KB。转速每分钟多少转RPM决定了旋转延迟。地址映射就是要把一个逻辑块号比如第N个扇区转换成物理地址柱面号、磁头号、扇区号。这个转换是操作系统和磁盘控制器共同完成的但考试里要你自己算。3.2 磁道与扇区的编号规则考试里最常见的编号方式是先编扇区再编磁头最后编柱面。也就是说逻辑块号0到每磁道扇区数-1是0号柱面0号磁头盘面上的所有扇区接下来是0号柱面1号磁头上的所有扇区以此类推。举个例子假设磁盘有4个盘面磁头号0-3每个盘面有100个磁道柱面号0-99每个磁道有16个扇区扇区号0-15。那么逻辑块号的计算公式是逻辑块号 柱面号 × (磁头数 × 每磁道扇区数) 磁头号 × 每磁道扇区数 扇区号反过来已知逻辑块号求物理地址柱面号 逻辑块号 ÷ (磁头数 × 每磁道扇区数) 磁头号 (逻辑块号 % (磁头数 × 每磁道扇区数)) ÷ 每磁道扇区数 扇区号 逻辑块号 % 每磁道扇区数这个公式看着简单但考场上容易算错。我当年就犯过一个低级错误把磁头数和柱面数的顺序搞反了。记住一个口诀先柱面后磁头最后扇区。因为柱面是最大的单位磁头次之扇区最小。提示有些教材或题目会采用不同的编号顺序比如先磁头后柱面。做题时一定要看清楚题目给的编号规则。如果题目没说默认按“柱面-磁头-扇区”的顺序。3.3 磁盘访问时间的三个组成部分磁盘访问时间由三部分组成寻道时间磁头从当前位置移动到目标磁道的时间。这个时间取决于磁头移动的距离和磁盘的机械性能通常题目会给一个平均寻道时间。旋转延迟目标扇区旋转到磁头下方的时间。平均旋转延迟是旋转半圈的时间。如果转速是7200RPM那么转一圈需要60/7200秒 8.33ms平均旋转延迟是4.17ms。传输时间读写一个扇区所需的时间。如果每个磁道有N个扇区转速是R RPM那么传输一个扇区的时间是 (60/R) / N 秒。总访问时间 寻道时间 旋转延迟 传输时间。考试里经常考的是传输时间和旋转延迟的计算因为寻道时间通常直接给出。22年44题就考了传输时间的计算而且结合了DMA的周期挪用。4. 22年44题的完整拆解与计算过程4.1 题目还原与关键信息提取22年44题的原文大意是这样的某磁盘的转速为7200RPM每个磁道有500个扇区每个扇区512字节。磁盘通过DMA方式与内存交换数据DMA每次传送一个扇区的数据。CPU的时钟频率为1GHzCPI为4。问采用周期挪用方式DMA传送一个扇区对CPU执行指令的影响有多大先提取关键信息转速7200RPM → 转一圈时间 60/7200 8.33ms每磁道扇区数500扇区大小512字节DMA每次传送一个扇区512字节CPU时钟频率1GHz → 时钟周期 1nsCPI4 → 每条指令4个时钟周期 4ns4.2 传输时间的计算传输一个扇区的时间 转一圈时间 ÷ 每磁道扇区数 8.33ms ÷ 500 16.67μs。这个时间就是DMA传送一个扇区所需的时间。也就是说磁盘每16.67μs就准备好一个扇区的数据DMA需要在这个时间内把数据搬走。4.3 周期挪用对CPU的影响计算在16.67μs内CPU本来可以执行多少条指令16.67μs ÷ 4ns 4167.5条指令。DMA每传一个扇区要偷一个总线周期。假设总线周期等于一个时钟周期1ns那么DMA偷走1nsCPU实际可执行的时间变成16.67μs - 1ns 16.669μs能执行16.669μs ÷ 4ns ≈ 4167.25条指令。也就是说DMA每传一个扇区CPU大约少执行0.25条指令。这个影响非常小因为传输一个扇区的时间远大于一个总线周期。但这里有个陷阱如果DMA每次传送的数据量很小比如每次只传4字节那么DMA偷周期的频率就会很高。假设磁盘传输速率是4MB/sDMA每次传4字节那么每1μs就要偷一个周期。在1μs内CPU本来可以执行1μs ÷ 4ns 250条指令偷走1ns后变成249.75条影响是0.25条。虽然绝对数一样但相对比例变大了。所以考试里如果问“DMA对CPU的影响”一定要看清楚DMA每次传送的数据量。传送量越小偷周期越频繁对CPU的影响越大。4.4 磁道与扇区计算的结合22年44题的第二问通常会把磁道和扇区计算加进来。比如如果要从逻辑块号1000开始读取2000个扇区的数据需要访问哪些磁道和扇区假设磁盘有8个盘面磁头号0-7每个盘面有1000个磁道柱面号0-999每个磁道500个扇区。先算逻辑块号1000对应的物理地址柱面号 1000 ÷ (8 × 500) 1000 ÷ 4000 0 磁头号 (1000 % 4000) ÷ 500 1000 ÷ 500 2 扇区号 1000 % 500 0所以逻辑块号1000对应柱面0、磁头2、扇区0。要读2000个扇区从柱面0磁头2扇区0开始连续读2000个扇区。因为每个磁道500个扇区2000个扇区需要4个完整磁道。从磁头2扇区0开始先读完磁头2的500个扇区扇区0-499然后磁头3的500个扇区磁头4的500个扇区磁头5的500个扇区。总共4个磁道都在柱面0。如果题目问“需要移动多少次磁头”答案是0次因为都在同一个柱面。如果问“需要切换多少次磁头”答案是3次从磁头2到33到44到5。这里有个容易错的地方磁头切换不需要寻道时间但需要切换时间。考试里通常忽略磁头切换时间只考虑寻道时间和旋转延迟。但如果题目明确给了磁头切换时间就要加上。5. 常见问题与排查技巧实录5.1 DMA计算中的典型错误我整理了一个常见错误速查表都是我和学弟学妹们踩过的坑错误类型错误表现正确做法单位混淆把ms和μs搞混把MHz和GHz搞混统一换算成秒和Hz再计算CPI忘记乘算CPU执行指令数时直接用时钟周期每条指令时间 时钟周期 × CPI总线周期假设错误默认总线周期等于时钟周期看题目是否给出总线周期没给则默认等于时钟周期传送量搞错把磁盘传输速率当成DMA传送速率DMA传送速率取决于DMA每次传多少数据磁道扇区编号顺序错把磁头号和柱面号搞反记住“先柱面后磁头最后扇区”5.2 磁盘计算中的避坑技巧技巧一先算一圈时间再算扇区时间。不管题目怎么变转一圈的时间是固定的60/RPM秒。然后用一圈时间除以每磁道扇区数就是传输一个扇区的时间。这个顺序不会错。技巧二逻辑块号转物理地址时先除后模。柱面号 逻辑块号 ÷ (磁头数 × 每磁道扇区数)这个除法取整数部分。磁头号 (逻辑块号 % (磁头数 × 每磁道扇区数)) ÷ 每磁道扇区数。扇区号 逻辑块号 % 每磁道扇区数。按这个顺序算不会乱。技巧三连续读多个扇区时先算跨多少个磁道。总扇区数 ÷ 每磁道扇区数 需要的磁道数。如果整除正好占满整数个磁道如果不整除最后一个磁道只占一部分。然后看这些磁道是否在同一个柱面如果在寻道时间为0如果跨柱面需要加上寻道时间。技巧四注意题目是否考虑磁头切换时间。大多数题目忽略磁头切换时间但如果题目明确给了就要加上。磁头切换时间通常很小但考试里可能会考。5.3 考场上的时间分配建议408考试时间紧张这道题如果卡住不要死磕。我的建议是先花2分钟把题目里的关键数据提取出来列在草稿纸上。用1分钟判断考的是DMA的哪种方式周期挪用还是停止CPU访存。用3分钟完成计算如果算出来的结果很怪比如CPU执行指令数出现小数检查一下单位。如果5分钟还没算出来先跳过做完后面的题再回来。这道题的分值通常是8-10分不值得花15分钟。我当年就是在这道题上花了太多时间导致后面的一道大题没做完。6. 从22年44题看408的命题趋势6.1 跨知识点融合是常态22年44题把DMA和磁盘计算揉在一起这不是偶然。近几年408的命题趋势就是跨章节融合。以前一道题只考一个知识点现在一道题可能同时考I/O方式、磁盘计算、甚至操作系统里的文件系统。这就要求你在复习时不能孤立地背知识点要主动去想“这个知识点能和哪个知识点结合”。比如DMA可以和中断结合考磁盘计算可以和文件系统结合考Cache可以和虚拟内存结合考。我复习的时候会自己画一张知识关联图把可能结合的知识点用线连起来然后自己出题考自己。这个方法很笨但很有效。6.2 计算量在增加以前的408计算题相对简单现在计算量明显增加。22年44题的计算步骤至少有5步算一圈时间、算扇区传输时间、算CPU指令时间、算偷周期影响、算磁道扇区映射。每一步都不难但步骤多了就容易出错。应对方法只有一个多练。我当年把王道上的计算题刷了三遍第一遍按章节刷第二遍按题型刷第三遍按套卷刷。刷到后来看到题目就能条件反射地列出计算步骤。6.3 对概念理解的要求更高以前背公式就能做题现在题目会问“为什么采用周期挪用而不是停止CPU访存”“DMA传送完成后为什么要发中断”。这些题目考的是你对概念的理解不是死记硬背。我的建议是每个知识点都问自己三个问题——它解决什么问题它怎么解决的它有什么代价比如DMA它解决的是CPU被I/O拴住的问题它通过DMAC直接控制总线来解决代价是增加了硬件复杂度和总线冲突的可能性。把这三个问题想清楚概念题就不会丢分。7. 复习建议与实操训练方法7.1 建立自己的计算模板我备考时给自己建了一个计算模板每次遇到DMA和磁盘计算的题就按模板一步步填DMA部分确定DMA传送方式周期挪用/停止CPU/交替访问算磁盘传输一个数据的时间如果题目给的是磁盘传输速率用数据量除以速率如果给的是转速和扇区数用一圈时间除以扇区数算CPU执行一条指令的时间时钟周期 × CPI算DMA偷走的周期数通常是一个总线周期算CPU实际可执行指令数总时间减去偷走的时间再除以每条指令时间磁盘部分算一圈时间60/RPM算传输一个扇区的时间一圈时间 ÷ 每磁道扇区数算逻辑块号对应的柱面号、磁头号、扇区号算连续读多个扇区需要跨多少磁道、多少柱面算总访问时间寻道时间 旋转延迟 传输时间这个模板我用了三个月后来做题基本不会漏步骤。7.2 用真题做专项训练我建议把近10年408真题里所有涉及DMA和磁盘计算的题挑出来集中做一遍。做完后对照答案重点看自己哪一步算错了。我当年整理了20道这类题发现自己的错误集中在两个地方一是单位换算二是磁头号和柱面号搞反。找到错误规律后针对性训练了两周正确率从60%提到了95%。7.3 自己给自己出题这是我最推荐的方法。学完一个知识点后自己改题目条件然后自己算。比如22年44题你可以把转速改成5400RPM把每磁道扇区数改成300把CPI改成6然后重新算一遍。这样不仅能加深理解还能训练计算速度。我当年和研友互相出题每人每天出5道交换做。这个方法让我们俩的计算速度都提升了很多而且因为要出题对知识点的理解也更深入了。7.4 考场上的检查技巧算完DMA和磁盘计算的题后用以下方法快速检查量级检查CPU执行指令数应该是几千条如果算出来是几百万条肯定错了。单位检查所有时间单位统一成秒或微秒不要混用。逻辑检查DMA偷走的周期数应该远小于总时间如果偷走的时间比总时间还大肯定错了。边界检查磁道号和扇区号应该在题目给的范围内如果算出来磁道号是1000但题目说只有100个磁道肯定错了。这些检查方法花不了30秒但能帮你挽回不少分。8. 从这道题延伸出去的知识网络8.1 DMA与中断的对比DMA和中断都是I/O控制方式但它们的适用场景不同。中断适合低速设备如键盘、鼠标因为每次中断都有保存现场和恢复现场的开销。DMA适合高速设备如磁盘、网卡因为数据传送不需要CPU干预。考试里经常考两者的对比比如“为什么磁盘用DMA而不用中断”。答案很简单磁盘传输速率高如果每传一个字节都中断一次CPU光处理中断就忙不过来。DMA可以一次传一个数据块只在块传送完成后中断一次大大减少了CPU的开销。8.2 DMA与总线仲裁的关系DMA要控制总线就必须和CPU竞争总线控制权。这就涉及到总线仲裁。常见的仲裁方式有链式查询、计数器定时查询、独立请求。考试里如果考DMA可能会顺带考总线仲裁。链式查询的优先级固定离总线控制器近的设备优先级高。计数器定时查询的优先级可以改变通过计数器的初始值来设定。独立请求的每个设备都有独立的总线请求线优先级由仲裁器决定速度最快但线最多。DMA通常采用独立请求方式因为磁盘这种高速设备需要及时获得总线控制权。8.3 磁盘调度算法与磁道计算的关系磁盘调度算法如FCFS、SSTF、SCAN、C-SCAN决定了磁头移动的顺序直接影响寻道时间。考试里如果考磁盘调度通常会结合磁道计算。比如题目给出一系列磁道访问请求让你用SSTF算法计算总寻道时间。你需要先按SSTF排序然后计算相邻磁道之间的距离最后求和。如果题目还给了每个磁道的扇区数可能还要算旋转延迟和传输时间。我当年复习时把磁盘调度算法和磁道计算结合起来练发现这样练效果很好因为考试里这两者经常一起考。8.4 固态硬盘对传统磁盘计算的冲击现在固态硬盘SSD越来越普及SSD没有磁道和扇区的物理结构访问时间也不包含寻道时间和旋转延迟。但408考试仍然以传统磁盘为主因为SSD的访问时间计算太简单就是读写延迟没有区分度。不过了解SSD的原理对理解存储层次有帮助。SSD的读写单位是页通常4KB擦除单位是块通常128页。写入前需要先擦除这导致了写放大问题。这些知识点在操作系统和计算机组成原理里都可能考。9. 我踩过的坑和最后的建议我当年备考408时在这道题上犯了三个错误。第一个错误是把磁盘传输速率和DMA传送速率搞混了题目给的是磁盘传输速率4MB/s我直接用4MB/s算DMA传送一个扇区的时间结果算出来是128μs而正确答案是16.67μs。第二个错误是忘记乘CPI算CPU执行指令数时直接用时钟周期导致结果差了4倍。第三个错误是磁头号和柱面号搞反把逻辑块号1000算成了柱面2磁头0正确答案是柱面0磁头2。这三个错误我后来都通过专项训练纠正了。我的建议是不要怕犯错但要确保同样的错误不犯第二次。每做错一道题就在错题本上记下来写清楚错误原因和正确思路。考前一周只看错题本比刷新题有用得多。最后分享一个我当年用的复习方法把DMA和磁盘计算的所有公式写在一张A4纸上贴在书桌前每天看一遍。看了一个月后这些公式就刻在脑子里了。考试时看到题目公式自动跳出来根本不需要想。这道22年44题表面上是考DMA和磁盘计算实际上考的是你能否把分散的知识点串成一条线。这条线就是数据从磁盘到内存的完整路径。磁盘上的数据按磁道和扇区组织通过DMA方式传送到内存DMA通过周期挪用与CPU共享总线CPU在DMA传送期间继续执行指令。把这条线想通了这类题就再也不会卡住你了。
返回列表