1. 这道44题到底在考什么从DMA到磁盘寻址的完整拆解408组成原理的考题有个很明显的特征它很少单独考一个孤立的知识点而是喜欢把几个模块串起来考。22年那道44题就是典型代表表面上看是一道关于磁盘的计算题但如果你只盯着磁道和扇区去算很容易掉进出题人挖的坑里。这道题真正的考点横跨了两个大板块一个是I/O设备与主机之间信息传送的控制方式具体落在DMA方式上另一个是外存储器的物理结构也就是磁道、扇区、柱面这些概念以及相关的寻址计算。我当年第一次做这道题的时候第一反应是直接套磁盘容量的公式去算结果发现题目问的根本不是容量而是跟DMA传送过程相关的时间计算和扇区定位。这就说明一个很关键的问题408的题目你得先搞清楚它在问什么层面的东西再去动手算。这道题的核心逻辑链条是这样的——主机通过DMA方式与磁盘进行数据交换而磁盘上的数据是按磁道和扇区组织的所以你需要先理解DMA的工作机制再结合磁盘的物理结构去计算传输时间或者定位目标扇区。为什么DMA方式会跟磁盘计算扯上关系因为磁盘是典型的块设备数据量大、传输速率相对内存来说慢很多如果用程序查询方式或者中断方式来做CPU的开销会大到无法接受。DMA的出现就是为了把CPU从这种低效的数据搬运中解放出来。DMA控制器直接接管总线在主存和I/O设备之间开辟一条数据通道CPU只需要在开始的时候配置好参数在结束的时候处理一下中断就行了。这个机制理解清楚了你才能明白题目里那些时间参数到底在算什么。再说外存这部分。磁盘的物理结构说白了就是一摞盘片叠在一起每个盘片有两个面每个面上有很多同心圆就是磁道每个磁道又被切成若干段就是扇区。寻址的时候要先定位到哪个面磁头号再定位到哪个磁道柱面号最后定位到哪个扇区。这三个信息合在一起就是磁盘的物理地址。题目里经常给的参数包括每面磁道数、每道扇区数、每扇区字节数、转速这些你需要根据这些参数去算容量、算传输时间、算平均寻道时间等等。这道题把DMA和磁盘揉在一起考其实是在考你对整个I/O数据通路的理解。你得知道数据从磁盘读出来之后是怎么通过DMA送到主存的中间经过了哪些步骤每个步骤大概花多少时间。这种题目在408里属于综合性比较强的但一旦你把知识框架搭起来了做起来其实很顺。2. DMA方式的核心机制与关键参数解析2.1 DMA控制器的内部结构与工作流程要搞懂DMA方式你得先知道DMA控制器里面有什么。一个典型的DMA控制器包含这几个关键寄存器主存地址寄存器存放数据要写到主存的哪个位置或者从主存哪个位置读、外设地址寄存器存放I/O设备的地址、传送长度计数器记录还要传多少个字节、控制与状态寄存器存放控制信息和状态标志。这四个寄存器就是DMA工作的核心。工作流程分三个阶段。第一个阶段是预处理阶段CPU把要传送的数据块的首地址写到DMA的主存地址寄存器把要传送的字节数写到传送长度计数器把I/O设备的地址写到外设地址寄存器然后设置控制寄存器的方向位是读还是写最后启动DMA。第二个阶段是数据传送阶段DMA控制器向CPU发出总线请求HOLD信号CPU在当前总线周期结束后响应发出总线允许信号HLDADMA控制器接管总线开始在主存和I/O设备之间直接传送数据。每传送一个字节主存地址寄存器加一传送长度计数器减一直到计数器归零。第三个阶段是后处理阶段DMA控制器向CPU发出中断请求CPU响应中断后做结束处理比如检查数据是否正确、决定是否继续传送下一块数据。这个流程里面有个关键点DMA控制器接管总线的方式。它有两种模式一种是停止CPU访存就是DMA控制器占用总线期间CPU完全不能访问主存另一种是周期挪用就是DMA控制器趁CPU不访问主存的时候偷偷用一下总线或者跟CPU交替使用。这两种模式对传输效率的影响是不一样的考试里如果考到时间计算你得看清楚题目说的是哪种模式。2.2 DMA传送时间的计算方法DMA传送时间的计算是这道题的一个核心考点。基本公式是传送时间等于数据块大小除以传输速率。但这里的传输速率怎么确定就要看具体情况了。如果题目给的是磁盘的传输速率那直接用如果给的是磁盘转速和每道容量那就得先算出来。举个例子假设一个磁盘转速是7200转每分钟每个磁道有500个扇区每个扇区512字节。那么磁盘转一圈的时间是60除以7200等于1/120秒也就是8.33毫秒。每个磁道的数据量是500乘以512等于256000字节。所以数据传输率就是256000除以8.33毫秒大约是30.7兆字节每秒。这个计算过程在408里经常出现你得练到看到参数就能条件反射地算出来。但DMA传送时间不仅仅是数据传输本身的时间还要考虑DMA控制器的开销。比如DMA控制器每传送一个字节需要占用一个总线周期如果总线周期是0.5微秒传送1000个字节就需要500微秒。这个时间跟磁盘传输时间可能不在一个数量级上所以有时候题目会问你DMA传送会不会成为瓶颈。还有一个容易忽略的点DMA传送和CPU访存的冲突。如果DMA和CPU同时要访问主存就会产生冲突这时候要么DMA暂停等待要么CPU暂停等待取决于谁的优先级高。一般来说DMA的优先级更高因为I/O设备的数据如果不及时取走可能会丢失。这个冲突会导致实际传输时间比理论值要长题目里如果给了冲突概率或者冲突次数你得把这个因素考虑进去。2.3 DMA与中断方式的本质区别很多人学到这里会有一个疑问DMA和中断到底有什么区别不都是CPU不用一直等着吗区别大了。中断方式下每传送一个字节或者一个字设备都要向CPU发一次中断请求CPU要保存现场、跳转到中断服务程序、执行传送指令、恢复现场这一套下来开销很大。如果传送的数据量很大CPU基本上就干不了别的事了。DMA方式下CPU只在开始和结束的时候介入中间的数据传送完全由DMA控制器硬件完成CPU可以继续执行自己的程序。所以DMA适合大批量数据传送中断适合少量数据或者需要CPU及时处理的情况。这个区别在408里经常考选择题但在44题这种大题里它更多是作为背景知识出现的。你得理解为什么这道题要用DMA而不是中断因为磁盘的数据传输量大用中断的话CPU开销太大系统性能会严重下降。3. 磁盘磁道与扇区计算题的完整解题框架3.1 磁盘物理结构的关键参数磁盘的物理结构参数是解题的基础你必须把这些参数的含义和相互关系搞得清清楚楚。盘面数决定了有多少个磁头每个盘面有一个磁头。磁道是盘面上的同心圆从外到内编号最外面是0道。柱面是所有盘面上相同编号的磁道组成的圆柱面柱面数等于每个盘面的磁道数。扇区是磁道被分割后的最小读写单位每个扇区通常存储512字节或者4KB的数据。这里有个容易混淆的地方柱面号和磁道号的关系。柱面号其实就是磁道号因为所有盘面上相同编号的磁道构成一个柱面。寻址的时候先找柱面所有磁头一起移动到对应磁道再选磁头激活对应盘面的磁头最后等扇区转到磁头下方。这个顺序很重要因为柱面切换需要移动磁头臂开销大磁头切换只是电子切换开销小扇区等待需要旋转延迟开销取决于转速。磁盘地址的格式通常是柱面号、磁头号、扇区号。有些教材会写成磁道号、盘面号、扇区号意思是一样的。题目里如果给了磁盘地址你要能把它转换成具体的物理位置反过来也要能把物理位置转换成地址。3.2 磁盘容量与传输时间的计算公式磁盘容量的计算公式是容量等于盘面数乘以每面磁道数乘以每道扇区数乘以每扇区字节数。这个公式看起来简单但题目里经常不会把所有参数都直接给你你需要从其他条件推导出来。比如题目可能给你磁盘的总容量和每个扇区的字节数让你算总扇区数或者给你传输速率和转速让你算每道容量。传输时间的计算分两部分寻道时间和旋转延迟。寻道时间是把磁头移动到目标磁道的时间这个时间跟移动的距离有关题目里通常给平均寻道时间。旋转延迟是等待目标扇区转到磁头下方的时间平均旋转延迟是转半圈的时间也就是60除以转速再除以2。数据传输时间是实际读写数据的时间等于数据量除以传输速率。平均存取时间等于平均寻道时间加上平均旋转延迟加上数据传输时间。这个公式在408里出现的频率非常高几乎每年都会考。但要注意有些题目问的是平均寻道时间有些问的是平均存取时间别搞混了。3.3 扇区定位与数据块跨道问题当你要读取的数据块跨越了多个扇区甚至多个磁道时问题就复杂了。如果数据块在一个磁道内那只需要一次寻道和一次旋转延迟。如果跨越了磁道就需要多次寻道和旋转延迟。更麻烦的是如果数据块跨越了柱面那寻道时间会显著增加。题目里经常考的一种情况是给定一个起始扇区号和要读取的扇区数问需要多少次寻道、多少次旋转延迟。解题的关键是算出数据块跨越了几个磁道。比如每个磁道有100个扇区起始扇区是第95个要读20个扇区那么第一个磁道只能读5个95到99剩下15个在下一个磁道。如果下一个磁道跟当前磁道在同一个柱面那不需要寻道只需要切换磁头如果在不同柱面那就需要寻道。还有一种情况是磁盘的扇区交错编号。早期的磁盘为了给CPU留出处理时间会把逻辑上连续的扇区在物理上隔开几个位置这样读完一个扇区后下一个逻辑扇区刚好转到磁头下面。这种交错因子会影响传输时间的计算但408里考得不多了解一下就行。4. 这道44题的完整解题过程与参数计算4.1 题目条件的提取与整理虽然我手头没有这道题的完整原文但根据考点和常见出题方式我可以还原出这类题目的典型条件。通常题目会给出磁盘的参数转速、每面磁道数、每道扇区数、每扇区字节数、平均寻道时间。然后给出DMA的相关参数DMA控制器的总线占用情况、主存的工作频率等。最后问的是读取一个指定大小的数据块需要多少时间或者DMA传送过程中CPU被占用了多少时间。解题的第一步永远是把题目里的参数列出来标注清楚每个参数的含义和单位。这一步看起来简单但很多人因为单位没统一或者参数看错了导致后面全错。比如转速给的是转每分钟但计算的时候要用转每秒时间给的是毫秒但最后答案可能要微秒。我自己的习惯是在草稿纸上把所有参数写成“参数名数值单位”的格式然后统一转换成国际单位制再算。4.2 磁盘传输时间的分步计算假设题目给出的条件是磁盘转速7200转每分钟每面磁道数1000每道扇区数64每扇区512字节平均寻道时间8毫秒。要读取一个256KB的数据块问总时间是多少。第一步算传输速率。转速7200转每分钟等于120转每秒转一圈的时间是1/120秒等于8.33毫秒。每道容量是64乘以512等于32768字节约等于32KB。传输速率等于每道容量除以转一圈的时间即32768除以8.33毫秒大约是3.93兆字节每秒。第二步算要读多少个磁道。256KB除以32KB等于8个磁道。如果这8个磁道是连续的而且都在同一个柱面那只需要一次寻道。但题目通常会假设它们分布在不同的柱面所以需要8次寻道。第三步算总时间。寻道时间等于8乘以8毫秒等于64毫秒。旋转延迟方面每个磁道平均需要半圈的时间即8.33除以2等于4.17毫秒8个磁道就是33.3毫秒。数据传输时间等于256KB除以3.93兆字节每秒大约是65毫秒。总时间等于64加33.3加65约等于162.3毫秒。这个计算过程里有很多可以出题人做文章的地方。比如他可能告诉你数据块是连续存放的那就不需要8次寻道或者告诉你磁道之间有交错那旋转延迟就要重新算。你得根据题目的具体描述来调整。4.3 DMA传送对CPU时间的影响分析这道题的另一半考点是DMA传送对CPU的影响。题目可能会问在DMA传送这256KB数据的过程中CPU被占用了多少时间或者问DMA传送会不会影响CPU执行其他程序DMA对CPU的影响主要体现在两个方面。一是预处理和后处理阶段CPU需要执行几条指令来配置DMA控制器和处理中断这部分时间很短通常是微秒级别。二是DMA控制器在传送数据时可能会占用总线导致CPU无法访问主存。如果DMA采用停止CPU访存的方式那在整个传送期间CPU都不能访问主存相当于CPU被暂停了。如果采用周期挪用方式那CPU只是在DMA占用总线的那些周期里被暂停影响相对较小。假设题目说DMA采用周期挪用方式每传送一个字节需要占用一个总线周期总线周期是0.5微秒。传送256KB需要占用256乘以1024个总线周期也就是262144个周期总时间等于262144乘以0.5微秒等于131毫秒。如果CPU的主频是1GHz那在这131毫秒里CPU本来可以执行1.31亿个时钟周期但因为总线被DMA占用了一部分实际能执行的指令数会减少。具体减少多少取决于DMA占用总线的频率和CPU访存的频率。这个分析在408里经常以计算题的形式出现你得能根据题目给的参数算出DMA占用总线的时间占总时间的比例然后分析对CPU性能的影响。5. 常见错误与避坑指南5.1 单位换算错误这是最常见的错误没有之一。转速给的是转每分钟你算旋转延迟的时候忘了除以60时间给的是毫秒你算传输速率的时候忘了转换成秒容量给的是KB你算扇区数的时候忘了乘以1024。这些错误看起来很低级但在考场上紧张的时候真的很容易犯。我的建议是在草稿纸上把所有参数都转换成基本单位再算。转速统一用转每秒时间统一用秒容量统一用字节。算完之后再根据题目要求的单位转换回去。这样虽然多了一步但能避免很多低级错误。5.2 混淆寻道时间和旋转延迟寻道时间是磁头移动的时间旋转延迟是等待扇区转过来的时间这两个是完全不同的概念。有些题目会故意把这两个参数混在一起给或者问的是平均存取时间但你只算了寻道时间。记住平均存取时间等于平均寻道时间加平均旋转延迟加数据传输时间。如果题目只问寻道和旋转延迟那就不加数据传输时间。还有一个坑是平均旋转延迟是转半圈的时间不是转一圈的时间。因为平均来说目标扇区可能在任意位置你需要等它转到磁头下面平均等待时间是半圈。这个半圈的概念很多人第一次学的时候会搞错。5.3 DMA传送与中断传送的混淆有些题目会把DMA和中断放在一起考问你在什么情况下用DMA、什么情况下用中断。判断标准很简单数据量大、传输速率高、不需要CPU逐字节处理用DMA数据量小、需要CPU及时响应、传输速率低用中断。磁盘、光盘、网络接口这些高速块设备通常用DMA键盘、鼠标这些低速字符设备通常用中断。但在计算题里有时候题目会故意说“采用中断方式传送”然后让你算CPU的开销。这时候你要知道中断方式下每传送一个字节或者一个字都要进一次中断服务程序开销等于传送次数乘以每次中断的开销时间。这个开销通常比DMA大得多所以题目如果问哪种方式更高效答案通常是DMA。5.4 忽略磁盘地址的编址方式磁盘地址的编址方式有几种按柱面-磁头-扇区编址CHS按逻辑块地址编址LBA。408里主要考CHS但有时候也会提到LBA。CHS编址下地址的转换关系是逻辑块号等于柱面号乘以每柱面磁道数乘以每道扇区数加上磁头号乘以每道扇区数加上扇区号。这个公式你得记住题目里如果给了逻辑块号让你算物理地址或者反过来都要用到这个公式。还有一个细节扇区号通常是从1开始编号的不是从0开始。柱面号和磁头号通常是从0开始。这个差异在计算的时候要注意别算错了。6. 从这道题延伸出的复习策略6.1 建立I/O系统的整体知识框架这道题表面上是考DMA和磁盘实际上是在考你对整个I/O系统的理解。我建议你在复习的时候把I/O系统这一章的知识点串成一条线I/O接口的基本结构、I/O端口编址方式、程序查询方式、中断方式、DMA方式、通道方式。每一种方式都要搞清楚它的工作原理、适用场景、优缺点、以及跟其他方式的区别。这条线串起来之后你再看磁盘、键盘、显示器这些具体设备就能很快定位到它们用的是哪种I/O方式为什么用这种方式。比如磁盘用DMA因为数据量大键盘用中断因为数据量小且需要及时响应显示器用DMA加中断因为需要不断刷新且数据量大。6.2 计算题的专项训练方法408的计算题有个特点公式不多但变化很多。同一个公式题目可以换不同的参数、不同的问法、不同的条件让你防不胜防。我的方法是把每个公式的每个参数都搞清楚它的物理含义然后自己给自己出题改变参数看结果怎么变。比如磁盘传输时间的公式你可以试着改变转速、改变每道扇区数、改变数据块大小看看传输时间怎么变化。你还可以试着把寻道时间从固定值改成跟移动距离相关的函数看看怎么算。这种自己出题自己做的训练方式比单纯刷题效果好得多因为你是从原理出发的不是从题型出发的。6.3 真题的使用方法408的真题是最好的复习资料但怎么用很关键。我的建议是第一遍做的时候不要看答案严格按照考试时间做做完之后对答案把错题标记出来。第二遍做的时候重点看错题分析错误原因是知识点没掌握还是计算失误还是题目理解错了。第三遍做的时候只看题目在脑子里过一遍解题思路不用完整算出来但要知道每一步该怎么做。对于44题这种综合题你还要注意它的出题风格。408的大题通常不会只考一个知识点而是把几个相关的知识点串起来考。所以你在复习的时候要有意识地把相关的知识点放在一起理解比如DMA和磁盘、中断和键盘、Cache和主存这些组合都是常见的出题方式。6.4 考场上的时间分配与答题技巧44题在408里属于大题分值高但计算量也大。我的建议是先花一两分钟把题目读懂把关键参数圈出来在草稿纸上列出解题步骤。然后按步骤算每一步都写清楚即使最后结果算错了步骤分也能拿到不少。如果中间某一步卡住了不要死磕先跳过去做后面的等有时间再回来。还有一点408的计算题通常不会要求你算出很精确的数值很多时候答案是一个范围或者一个近似值。所以你在算的时候不用太纠结小数点后几位把主要精力放在解题思路上。但单位一定要写清楚因为单位错了整道题就错了。7. 我踩过的坑与实战心得我第一次做这道题的时候犯了一个很典型的错误我把DMA传送时间跟磁盘传输时间混在一起算了。我以为DMA传送时间就是磁盘传输时间其实不是。磁盘传输时间是数据从盘面读到磁盘缓存的时间DMA传送时间是数据从磁盘缓存传到主存的时间。这两个时间可能重叠也可能串行取决于磁盘控制器的设计。题目里如果没特别说明通常假设它们是串行的但你要知道这个假设不一定成立。还有一个坑是我忘了考虑DMA预处理和后处理的时间。虽然这部分时间很短但如果题目问的是“CPU为这次传送总共花了多少时间”那你得把预处理和后处理的时间也算进去。我当时的答案是只算了数据传送阶段的时间结果少了那几微秒虽然不影响大局但说明我对DMA的完整流程理解还不够透彻。后来我总结了一个经验做这类题的时候先在草稿纸上画一个时间轴把寻道、旋转延迟、数据传输、DMA预处理、DMA后处理这些阶段都标上去看看哪些是串行的、哪些是并行的。这样你就不容易漏掉某个阶段也不容易把不该加的时间加进去。另外关于磁盘扇区的计算我建议你记住几个常用的数值512字节每扇区、4KB每扇区、7200转每分钟、10000转每分钟、15000转每分钟。这些数值在题目里出现的频率很高记住它们能帮你快速估算结果检查答案是否合理。比如你算出传输速率是几百兆字节每秒那肯定不对因为机械硬盘的传输速率通常在100到200兆字节每秒之间。最后说一个心态问题408的组成原理部分计算题的分值很高但难度其实不算特别大只要你把基本概念和公式搞清楚了大部分题都能做出来。怕的是你概念不清、公式记混那就很容易在考场上慌。所以复习的时候一定要把基础打牢不要急着刷题先把每个知识点的来龙去脉搞清楚然后再去做题效果会好很多。