作为一个在408考场上被44题按在地上摩擦过的过来人,看到"计算机组成原理22年44题"这个标题,我脑子里立刻就能浮现出那道涉及DMA方式、磁道、扇区的综合大题。很多同学对计算机组成原理的学习停留在背诵概念层面,导致一做到DMA和磁盘计算相结合的题目就发懵。今天这篇复盘,我打算把这道题的考查逻辑、DMA传送的完整细节、磁道扇区计算的底层原理全部串起来讲一遍,全程干货,不绕弯子,希望能帮正在备考的你把这块硬骨头啃下来。
1. 真题拆解:22年44题到底在考什么
1.1 题目场景还原与核心考点
22年这道44题,计算机组成原理部分的场景大致是:某磁盘存储系统采用DMA方式与主机交换数据,题干给了一系列磁盘参数,比如记录面数、每面磁道数、每磁道扇区数、每扇区字节数、磁盘转速,然后围绕这些条件设置了多个小问。这些小题主要落在两个知识模块上:一个是I/O设备与主机进行信息传送的控制方式中的DMA方式,另一个是外存计算中磁道、扇区相关的计算题考点。
先说DMA部分。题目会要求你判断在该场景下I/O控制方式属于哪一种,并进一步考查DMA传送过程中CPU和DMA控制器的分工配合。比如在数据传送阶段,CPU是让出了总线还是继续执行程序?DMA请求是什么时候发出的?这些细节如果不把DMA的工作流程彻底搞清楚,靠临场蒙是很危险的。
再说磁盘计算部分。这类题目本质上是把存储容量的计算公式、数据传输速率的计算、平均访问时间(寻道、旋转延迟、传输时间)的结合,和DMA的频率、总线占用方式串在一起,让考生在一个综合场景里做多步计算。这种考法在往年真题中反复出现,属于408命题组非常偏爱的一类综合题。
1.2 为什么这道题让很多考生丢分
我自己当年做这道题的时候,第一感觉是"参数太多了,不知道谁和谁有关系"。其实这就是命题组的陷阱。很多同学背公式只会背单个的,比如磁盘容量等于磁头数乘以磁道数乘以每磁道扇区数乘以每扇区字节数,但一旦公式里混入了"转速转一圈需要时间""传输一个扇区需要多少次DMA请求"这种联动条件,就不知道如何下笔。
更深层的原因是:DMA的知识点在很多教材里被讲成了纯概念。大家只记得"DMA是直接存储器存取""DMA不需要CPU干预",但对DMA控制器内部到底怎么工作、传送一次数据需要占用几个总线周期、预处理和后处理阶段CPU分别要做什么,并没有真正理解。题目一换场景,自然就露馅了。
这里我想强调一个复习思路:组成原理的考试,考的不是你记住了多少名词解释,而是你能不能把一个部件放在系统里看它能干什么、怎么干、干完以后有什么后果。磁盘和DMA放在一起考,就是因为磁盘的传输速率高、一次传的数据量大,恰恰是DMA最典型的用武之地。
1.3 从这道题反推408的命题风格
把这道题的风格吃透,你能发现408计算机组成原理命题的走向是"软硬结合、场景化、计算化"。它不爱考纯记忆的大题,更爱给你一个具体的硬件环境(某种磁盘、某个接口、某类控制方式),让你扮演一个系统设计者或分析者,计算吞吐量、判断总线占用时间、给出CPU的响应时机。
这类题有一个很大的特点:每个参数都不是白给的。题干中出现的每个数字和限定条件,到最后一定都会用上,或者就是用来给你设陷阱的。你养成这样一个习惯:拿到题先把每个参数都在纸上标注出它的物理含义,再想它可能牵扯到哪个公式,这样才能在考场上稳住心态。
2. DMA方式:I/O设备与主机信息传送的关键控制方式
2.1 DMA为什么会出现:从程序查询和中断方式说起
在讲DMA之前,我们必须先清楚它要解决什么问题。I/O设备与主机之间的数据传送控制方式,按CPU参与的程度由高到低排列,大致是程序查询方式、中断方式、DMA方式、通道与I/O处理机方式。程序查询方式最原始,CPU要不断轮询设备状态,设备没准备好就死等,CPU利用率极低。中断方式稍微改进了一点,设备准备好后主动发中断通知CPU,但CPU每传送一个数据(比如一个字节或一个字)就要响应一次中断,中断现场保护和恢复的开销非常大。
计算机组成原理教材里经常拿这个做对比:如果设备每传送一个字符都中断CPU一次,那么CPU的大量时间会被中断处理消耗。对于高速外设(典型的就是磁盘、显卡、网卡),这种方式的传输速率根本跟不上设备的速度。试想一下,磁盘每秒要传几十甚至上百MB数据,每传一个字都中断一次,CPU就没工夫干别的了。
于是DMA(Direct Memory Access,直接存储器存取)方式应运而生。它的核心思想是:在传送一个数据块期间,让高速外设直接和主存交换数据,不需要CPU一条条指令地干预,由DMA控制器这个"搬运总管"来负责整个搬运过程。它解决的核心矛盾就是:外设的数据产生/消耗速度太快,CPU逐字干预会成为瓶颈。
这里有一个高频考点很容易混淆:DMA虽然叫"直接存储器存取",但它并不是完全不经过CPU,它只是在数据传送阶段不经过CPU。预处理和后处理阶段,CPU还是要参与的,这一点在每年真题中都反复以选择题和大题的形式出现。
2.2 DMA的数据传送流程:三个阶段
DMA的数据传送过程可以清晰地分成三个阶段,这三个阶段我建议你们用"准备—搬运—收尾"六个字来记忆。
第一阶段是预处理(准备阶段)。这个阶段由CPU执行程序来完成:CPU给DMA控制器设置传送方向(是内存写到外设,还是外设读到内存)、传送数据的起始地址、要传送的字节数,然后向外设发出启动命令。简单理解就是:CPU告诉DMA控制器"你要从哪里搬、搬到哪去、搬多少、怎么搬"。在这个阶段,总线还是由CPU控制的,CPU并没有让出总线。
第二阶段是数据传送(搬用阶段)。这是DMA真正"干活"的阶段,也是考试最爱考细节的地方。在传送过程中,DMA控制器需要获得总线的控制权。它通过向CPU发出总线请求信号(通常叫HRQ,Hold Request),CPU在当前的机器周期或总线周期结束后让出总线(响应信号HLDA)。之后,总线由DMA控制器接管,主存储器和外设之间直接进行数据交换,每传送一个字或一个字节,DMA控制器会修改地址寄存器和计数器。这个阶段CPU完全不参与数据的搬运,它可以继续做内部操作,比如执行不需要访问总线的指令,或者干脆等待。
第三阶段是后处理(收尾阶段)。当DMA控制器中的传送计数器减到0,说明一个数据块传完了。这时DMA控制器会向CPU发出一个中断请求,CPU响应后执行中断服务程序,做一些善后工作,比如校验数据、检查传送是否正确、决定是否继续下一次DMA传送。注意,最后这次中断请求是DMA向CPU发的,这属于"一次数据块传完"的汇报,和中断方式中"每个数据都中断"是完全不同的量级。
2.3 DMA传送的三种方式:停止CPU访存、周期挪用、交替访存
DMA获得总线控制权后,如何与CPU竞争总线呢?教材中通常列出三种方式:停止CPU访问主存、周期挪用(也叫周期窃取)、交替访存。
停止CPU访问主存是最简单粗暴的方式。在DMA传送期间,DMA控制器一直占用总线,CPU完全不能访问主存。好处是控制简单,对DMA的传输速率最有利;坏处是CPU在这段时间内基本被挂起,即便它有内部的运算可以做,只要涉及访存就得等着。这种方式的DMA传送效率最高,但CPU利用率损失大。
周期挪用是更折中的方案。当I/O设备有数据要传送时,DMA控制器在CPU的一个机器周期或存取周期快要结束的时候,"插队"挪用一两个总线周期来完成一次数据的传送,传完立刻释放总线,CPU继续使用主存。这种方式对CPU的影响小一些,但DMA每传送一个字都可能会打断CPU一下。考试中经常出一种判断题:DMA周期挪用是在CPU不访存时才进行的吗?正确答案应该是:有可能发生在CPU访存间隙,也可能强行占用,具体取决于总线仲裁逻辑,但通常认为周期挪用发生在CPU不访问主存或访存周期结束时比较合理。
交替访存方式更高级,它把总线时间固定分成两半,一半给CPU访存,一半给DMA访存,双方互不干扰。这种方式不需要总线申请和释放的交互,DMA传送对CPU来说几乎透明,但对硬件要求高,通常只出现在特定结构的系统中。
为了直观对比,我给你们整理了一个表:
| 传送方式 | 总线占用情况 | CPU受影响程度 | DMA传送效率 | 适用场景 |
|---|---|---|---|---|
| 停止CPU访存 | DMA长期独占总线 | 高 | 最高 | 大批量数据、传输速率要求极高的设备 |
| 周期挪用 | DMA每个数据周期短暂占用 | 低 | 主导原则下较高 | 一般高速外设,兼顾CPU和DMA需求 |
| 交替访存 | CPU和DMA轮流访存 | 几乎无感 | 较高 | 总线结构特殊的系统 |
这里我要插一句我的复习体会:不要只看这张表背结论,你得跟着DMA的工作流程走一遍。拿周期挪用来说,如果外设每次只传一个字(比如16位),那么DMA控制器每传送一个字都要发起一次总线请求。考试时经常让你算:磁盘每传送一个扇区需要多少次周期挪用?那就相当于用扇区字节数除以每次传送的字节数,这个计算思路要形成条件反射。
2.4 DMA与其他传送方式的对比表
除了上述三种方式,面试和初试中还喜欢把DMA和中断方式混在一起考。我把最常考的几个对比点列出来:
| 对比维度 | 中断方式 | DMA方式 |
|---|---|---|
| 数据传送单位 | 字节/字 | 数据块 |
| CPU介入时机 | 每传一个数据中断一次 | 一个数据块传完后中断一次 |
| 数据传送路径 | CPU寄存器→主存/外设 | 外设↔主存,不经CPU |
| 响应时机 | 指令执行结束后 | 在一个机器周期或总线周期结束后 |
| 处理内容 | 程序控制的数据搬运 | 搬运由DMA控制器硬件完成 |
| CPU的主要工作 | 参与每一次搬运 | 只做预处理和后处理 |
最经典的一句话是:中断方式是程序控制的数据传送,DMA方式是硬件控制的批量数据传送。这句话基本能对付大多数选择题。不过我这里想提醒一下:DMA的后处理虽然靠中断实现,但这个中断的性质是"整块完成汇报",传输效率和中断方式完全不同,别把这两件事搞混。
3. 外存那些绕不开的计算:磁道、扇区与容量
3.1 磁盘物理结构:磁道、扇区、柱面
外存的机械式硬盘在物理结构上可以这样理解:一张圆形盘片上有若干个同心圆,每一个同心圆称为一条磁道。磁道并不是画上去的细线,而是一个环形存储区域,它会被划分成若干个弧段,每个弧段称为一个扇区,扇区是磁盘读写的最小单位。不同盘面上相同编号的磁道组成的立体圆柱面叫柱面,这个概念在计算容量时经常用到。
这里有一个特别重要的细节:每一条磁道的存储容量是相同的,无论它是在盘片最内侧的小圆上,还是在最外侧的大圆上。这意味着内侧磁道的数据密度大,外侧磁道的数据密度小。很多同学在做容量计算时,会误以为每条磁道的扇区数随半径变化,但标准习题设定里每磁道扇区数通常是一个定值。不过题干如果不说"相同"而只给半径,你就得小心它是不是在暗示等密度记录方式,这时每磁道的扇区数可能不同,但408统考真题基本都按等容量(即每磁道扇区数相同)处理,不用过度联想。
扇区是磁盘寻址的基本单位,一般大小为512字节,但现代高级格式化硬盘也有4KB物理扇区。做题时以题干给的每扇区字节数为准,千万别把512字节当成铁律。
3.2 磁盘容量计算的核心公式
磁盘存储容量的计算是这块最基础的得分点。完整容量的计算公式是:
磁盘总容量 = 记录面数(磁头数)× 每面磁道数 × 每磁道扇区数 × 每扇区字节数
为什么是记录面数而不是盘片数?因为一张盘片通常两面都可记录,一面配一个磁头,所以记录面数等于参与记录的盘面数量。如果题中说"盘片数为2",那么记录面数可能就是4,除非题干明确说有一个面不用于存储。
我们来看一个具体的例子。假设一个磁盘组有4个记录面,每面有200个磁道,每磁道有64个扇区,每扇区512字节,那么总容量就是:4 × 200 × 64 × 512。先算4 × 200 = 800面道数,再算800 × 64 = 51200扇区总数,最后51200 × 512 = 26214400字节,换算一下约等于25 MB(按1MB = 1024 × 1024字节计算)。这种多步乘法的计算,大家在草稿纸上一定要写清楚单位,别最后栽在进制换算上。
注意区分"非格式化容量"和"格式化容量"这两个概念。非格式化容量等于磁记录表面总的磁化单元数,计算公式里用的是位密度和内外圈周长;格式化容量才是我们可以实际使用的容量,因为扇区的头部、校验区、间隙等要占用额外空间。考试中一般给的都是格式化参数,直接用上面的公式即可。
3.3 磁盘访问时间的组成:寻道、旋转延迟、传输时间
访问磁盘上一个扇区总共要花多少时间?这个时间由三部分组成:寻道时间、旋转延迟时间、数据传输时间。这是一个高频综合题型,DMA题只要扯上和磁盘交互,基本躲不开这个计算。
寻道时间是指磁头移动到目标磁道上方所花的时间,通常用题目给定的寻道时间或平均寻道时间来计算。这个值一般固定,比如给出平均寻道时间6 ms。
旋转延迟时间是指目标扇区旋转到磁头下方所需要等待的时间。如果不知道扇区的具体位置,通常取转一圈时间的一半作为平均旋转延迟。转一圈的时间等于 1 / 转速(秒),转速单位通常是转/分钟(r/min)。例如7200 r/min的磁盘,转一圈的时间是60秒除以7200,约等于8.33 ms,平均旋转延迟就是4.17 ms左右。
数据传输时间是指磁头读出数据并传送到内存的时间。如果题目给的是数据传输速率,那就用数据大小除以速率;如果给的是转速和每磁道扇区数,更常见的算法是先算转一圈能读多少数据,再用比例关系算。比如每磁道有100个扇区,转速3600 r/min(转一圈16.67 ms),那么读一个扇区需要的时间约等于16.67 ms除以100等于0.167 ms。
这里我建议你们养成一个习惯:见到转速,先换算每秒多少转,再换算转一圈多少毫秒。这是全题的"时间基准",后面所有和时间相关的计算都要用它。
3.4 数据传输速率与DMA的结合考点
磁盘的数据传输有两层含义,容易搞混。一层是磁盘内部从盘片读数据到磁盘控制器缓存的速率,它取决于转速和每磁道容量;另一层是磁盘控制器通过DMA把数据送到主存的速率,它取决于总线宽度、DMA每次传送的数据量和传送频率。两道题经常会这样设问:磁盘读取一个扇区需要多少时间?在这个时间内DMA完成了多少次总线请求?
计算磁盘内部传输速率有个便捷公式:数据传输速率 = 转速 × 每磁道容量(注意单位换算)。举例来说,转速为7200 r/min,每磁道容量为64个扇区乘以512字节(即32768字节),那么每秒传输的字节数 = (7200 / 60) × 32768 ≈ 3.93 MB/s。这个数值代表的是磁盘能持续往外吐数据的理论速度。
然后DMA再和它对接:DMA每传送一个字或一个字节,要占一个总线周期。假设DMA每次传送16位(2字节),那么一秒内需要多少个DMA周期才能跟上磁盘的速度?用3.93 MB/s除以2字节每次,大约需要每秒196万次左右的总线周期占用。如果一次传送太小,DMA的效率就低,这也是为什么很多磁盘控制器都配有FIFO缓冲,先把数据攒一堆再一次性大批量搬运。
4. 实战演算:22年44题的完整解题过程
4.1 题干条件整理与信息标注
由于属于回忆还原版本,我按多位考生回忆和常见真题风格整理出一版可复现的题目条件,步骤逻辑与当年原题高度一致:
某磁盘组有4个记录面,每面有200个磁道,每个磁道有64个扇区,每个扇区512字节。磁盘转速为7200 r/min。该磁盘采用DMA方式与主存交换数据,DMA控制器每次传送32位数据,磁盘控制器每次从盘片读出一个扇区的数据后就发出一次DMA总线请求。预处理阶段CPU设置的DMA传送起始地址为0x8000,传送方向为外设到主存。请回答以下问题: (1) 该磁盘的总存储容量是多少? (2) 磁盘的数据传输速率(内部读速率)约为多少? (3) 平均磁盘访问时间(寻道6ms)中,旋转延迟和传输一个扇区的时间分别是多少? (4) DMA传送一个扇区(512字节)的数据大约需要多少次总线周期占用?(假设DMA每次传送32位)
这种条件设计在考场上非常典型,每个参数都会在某一小问中用到。拿到题先别急着算,在草稿纸上把参数列出来:记录面数4、磁道数200、每磁道扇区数64、每扇区字节数512、转速7200 r/min、平均寻道6 ms、每次DMA传送32位。看到"每次DMA传送32位",马上想到占用一次总线能搬4字节,这就是第(4)问的钥匙。
4.2 分步计算与公式推导示范
先看第一问:总存储容量。套用那个核心公式:容量 = 4 × 200 × 64 × 512。按部就班算:4 × 200 = 800,800 × 64 = 51200,51200 × 512 = 26,214,400字节。换算成更常见的单位,除以1024得到25,600 KB,再除以1024得25 MB。这个数字其实不大,符合普通小容量磁盘的定位,也说明存储容量的计算题并不会给出很夸张的数量级。
第二问:数据传输速率。转速7200 r/min,转一圈用60 / 7200秒,约0.008333秒,即8.33 ms。每磁道64个扇区,每扇区512字节,所以每磁道容量 = 64 × 512 = 32768字节。转一圈就把这个磁道的数据全读出来,所以数据传输速率 = 32768 / 0.008333 ≈ 3,932,160字节每秒,约3.75 MiB/s。注意这里如果你按每秒120转来算,就是120 × 32768,结果一样。
第三问:平均磁盘访问时间。平均访问时间 = 平均寻道时间 + 平均旋转延迟 + 传输时间。平均寻道时间给的6 ms。平均旋转延迟取转一圈时间的一半,即8.33 / 2 = 4.165 ms。传输一个扇区的时间,因为一圈能读64个扇区,所以16.67 ms / 64?错了,这里要用8.33 ms除以64,约0.13 ms。稍微敏感的同学会看到,传输时间其实非常小,平均访问时间主要由寻道和旋转延迟主导。所以第三问的答案是6 + 4.165 + 0.13 ≈ 10.3 ms。
这里我要特别提醒一个很多人易混的坑:读一个扇区的传输时间,和平均旋转延迟的计算方式不同。旋转延迟取的是半圈时间,而传输时间是目标扇区开始旋转到磁头下之后,磁头读完整个扇区数据花的时间,它是8.33 / 64 ≈ 0.13 ms,不是8.33 / 2再除以64。这两个概念一个算"等",一个算"读",千万别混在一起。
第四问:DMA传送一个扇区的总线周期数。扇区大小512字节,DMA每次传送32位即4字节。用512除以4得128次。也就是说,磁盘每读完一个扇区,DMA控制器要占用128次总线周期才能把整个扇区搬到主存。从这个数值你可以直观感受到:如果DMA每次都只传一个字节,那256次总线请求会让总线忙个不停,所以32位甚至更宽的DMA通道对高速外设是必要的。
4.3 从这道题延伸出的DMA流程判断
题目还给了一个细节:DMA起始地址0x8000。这实际上在暗示,预处理阶段CPU会在DMA控制器的地址寄存器中写入这个起始地址,每传送4字节,地址寄存器自动加4,传送计数器自动减1。当计数器减到0时,说明这512字节的扇区传完了,DMA控制器发出中断请求。于是CPU进入中断服务程序做后处理。如果题目问"后处理阶段CPU做什么",答案就是从DMA控制器的状态寄存器中读取状态、校验数据、判断是否继续启动下一次DMA传送。
另外,如果题目进一步问"在这个DMA传送过程中,CPU能执行程序吗",答案是:在数据传送阶段,如果采用停止CPU访存方式,CPU不能访问主存,但能执行不需要读内存的指令;如果采用周期挪用,CPU在总线让出间隙还是可以继续运行的。这也就是为什么周期挪用对系统性能更友好。
5. 刷题避坑指南:DMA与磁盘计算的常见错误
5.1 DMA模块的3个理解误区
第一个误区是"把DMA和中断对立"。很多同学认为DMA不需要中断,这是错的。DMA在数据块传送完成后恰恰要靠中断通知CPU做善后,只是中断频率远低于中断方式而已。判断题里如果说"DMA传送过程中完全不使用中断",那必然是错误的。
第二个误区是"CPU完全不参与DMA"。准确说法是CPU不参与数据传送阶段,但参与预处理和后处理。如果选择题把"CPU在DMA整个过程中完全不干预"作为选项,这又是错的。CPU至少要做参数设置和善后处理两件事。
第三个误区混淆"周期挪用"和"停止CPU访存"的响应时机。停止CPU访存是DMA请求后,CPU在一个存储周期结束时就让出总线;周期挪用是DMA在CPU不访存的间隙或者存取周期结束时插入占用。如果题目说"周期挪用一定发生在CPU不访问主存时",这个表述并不绝对,实际情况中如果设备很急,也会强占,所以判断题要看清限定词。
5.2 磁道、扇区计算里的高频易错点
关于外存计算,我总结了五个最容易踩的坑,每年都有大量考生栽在同样位置上。
第一个坑是转速单位换算。7200 r/min是转/分钟,算每秒转数要除以60,算每转时间要用1除以每秒转数。我看到有同学在草稿纸上直接写7200转每秒,明显是单位没做切换,这种低级错误最可惜。
第二个坑是平均旋转延迟到底是"转一圈时间的一半"还是"转一圈时间"。前者是物理常识:目标扇区可能在磁头前方半圈处,也可能在后方半圈处,平均下来就是半圈。只有极个别题目会明确说明扇区恰好在磁头正下方,那就是0延迟,但考题通常都按平均处理。
第三个坑是每磁道容量和磁盘总容量的混用。计算传输速率时用的是每磁道容量;计算总容量时用的是记录面数乘以每面磁道数再乘以每磁道容量。两者相差一个"面数×磁道数"的因子,不能互相替代。
第四个坑是数据传输时间。读一个扇区所需时间 = 转一圈时间 / 每磁道扇区数,前提是读起始位置刚好在扇区头部,如果考虑平均起始位置偏移,会涉及更复杂的计算,但统考题基本不这么出。我建议题目没特别说明,就不要自行加复杂度。
第五个坑是存储单位换算。计算机领域的KB、MB通常按1024进制,但磁盘厂商有时用1000进制。408考试默认按1024处理,除非题干明确用十进制。算出来的数字如果在选项里找不到,多半是单位换算出了问题,优先检查这里。
5.3 冲刺阶段的复习建议
距离考试还有一个多月的时候,我建议把组成原理的复习重心放在"数据通路"和"I/O方式"这两个板块。DMA和磁盘计算这类题目并不难,但需要你形成一个稳定的解题流程:先列参数、再找公式、再统一单位、最后计算和检查。我每次做这种题都会在草稿纸上画一个简单的时间轴,把"寻道—旋转—传输"的每个阶段标注出来,确保不漏项。
另外,强烈建议大家把王道课后题和历年真题中所有涉及DMA、磁盘计算、Cache命中率、总线带宽计算的题目分类整理到一起,反复做三遍以上。这一类计算题型其实非常有限,吃透套路后,考试基本就是"套公式+小心单位"。
经验总结
写到这里,我再分享一次我的个人做法:当时复习DMA和磁盘计算的时候,我把教材上每种控制方式都画成一张"谁在干活"的流程图——CPU干什么是深色,DMA 控制器干什么是浅色,外设干什么是虚线。这样一来,题里无论问"此时CPU在干什么""总线归谁控制",我都能秒答。这道题后续还可以这样扩展:把它跟Cache写策略甚至虚拟内存的缺页处理放在一起对比,你会发现DMA的下一次中断处理其实和缺页中断的流程有相似之处,都涉及"让出总线/让出CPU"和"善后处理"的协调。能发现这种底层联系,组成原理才算是真的学到手了。冲刺阶段不用贪多,把这道题吃透,比你盲目刷十套新题都管用。