备考408的过程里,计算机组成原理的I/O章节和外存计算,一直是很多人头疼的两个点。2022年那道44题把这两个知识点焊在了一起:一边是DMA方式,一边是磁道、扇区的计算。很多同学单独背DMA原理会背,单独算磁盘容量会算,一旦合成一道综合题,就卡在单位换算和时序关系里。这篇文章我就以这道题为引子,把DMA方式和外存计算这两块知识彻底拆开讲透,帮大家把这一整条知识链打通。
无论你现在是一轮复习刚接触计组,还是二轮刷真题时被这道题绊住,这篇文章都适合你。我会先从命题角度讲清楚为什么这两个点总爱一起考,再分别把DMA的机制和磁盘计算的底层逻辑掰开揉碎,最后用一道和44题同款考法的题目做完整推演。全程不堆结论,重点讲每个数字、每个公式背后的"为什么"。
1. 从22年44题看DMA与外存计算为何总打包出现
1.1 命题人把两个章节串成了一个完整场景
先想一个问题:磁盘这种外存设备,和DMA方式为什么天然是一对?
磁盘工作时有一个特点:数据是以连续的比特流从磁头下经过的,转速一旦跑起来,数据就是源源不断往外冒的。如果这种连续数据流用程序中断方式处理,CPU每收到一个字节或一个字就要被打断一次,去执行中断服务程序。磁盘转速7200转/分钟时,数据传输率动辄每秒几兆字节,每字节到来的时间间隔是零点几微秒,而一次中断响应加现场恢复就要十几甚至几十微秒,CPU根本接不住。
所以高速块设备必须用DMA。DMA允许外设和主存之间直接建立数据通路,数据不经过CPU内部寄存器,CPU只在整块数据传送开始前做初始化、结束后处理中断。这样一来,命题人只要把"磁盘"和"DMA"放在同一个题干里,就能自然地把I/O控制方式一章和外存计算一章组合出一道综合题。2022年44题就是这么来的——它不是故意刁难人,而是把现实中磁盘控制器的真实工作方式搬到了考卷上。
1.2 看懂组合逻辑比刷十道题更管用
既然这两块知识注定要一起考,那复习的时候就不能把它们当成孤立的章节。很多人在计组教材里学到I/O那章时,DMA的原理还停留在"不需要CPU干预"这句话上;学到外存那章时,磁道扇区计算又只是套公式。结果真上了考场,题目问"磁盘以DMA方式传送数据到主存,CPU在什么阶段被占用",就不知道该怎么把设备侧的参数和控制方式侧的时序对应起来。
我建议大家复习时先建立这样一个整体认知:一个完整的DMA读操作,从外设角度看是"磁盘转一圈、数据从磁头读出、在控制器里拼成块、通过总线进主存";从CPU角度看是"预处理、让出总线、响应中断"。设备参数决定了数据产出的节奏,DMA机制决定了CPU在什么时间点介入。把这两条时间线在脑子里叠在一起,这类综合题就变成了一道普通的时序计算题。
2. DMA方式核心机制:CPU到底"放权"放到什么程度
2.1 从程序查询到DMA:CPU参与度的四个档位
I/O设备与主机之间进行信息传送的控制方式,最常考的就是四种:程序查询方式、程序中断方式、DMA方式、通道方式。它们的本质区别在于CPU参与数据传输的程度不同。
程序查询方式是CPU全程亲自盯着设备状态字寄存器,设备没准备好就反复查询,数据每传送一步都要CPU执行指令完成。程序中断方式好一些,设备准备就绪后主动发中断请求,CPU暂时放下手头工作去处理,但每传一个字节或一个字,CPU就要被打断一次,现场保护和恢复的开销很大。DMA方式则把数据传送这段最繁重的工作交给了DMA控制器,CPU只在块的边界上介入。通道方式更进一步,通道可以执行通道程序,管理多台设备,CPU只需要发一条I/O指令。
这个递进关系我建议画成一条"CPU介入程度"的轴,从高到低:查询、中断、DMA、通道。408真题里反复出现的考点就是让你判断某种设备该用哪种方式,以及这些方式下CPU的开销差异。
2.2 DMA传送的完整时序:谁在干活,谁在等待
DMA的一次完整传送分为三个阶段:预处理、数据传送、后处理。
预处理由CPU执行几条指令完成。CPU要把主存起始地址写入DMA控制器的内存地址寄存器,把要传送的数据字数写入字计数器,设置传送方向是外设到主存还是主存到外设,然后向磁盘控制器发出启动命令。这几步做完之后,CPU就回到原程序继续执行,接下来漫长的数据传送过程它都不用管。
数据传送阶段是DMA控制器接管总线来完成的。磁盘每读出一个数据块,DMA控制器就把数据从设备的缓冲寄存器直接送到主存指定地址,同时内存地址寄存器加1、字计数器减1。注意这里数据不经过CPU的通用寄存器,这是DMA名字里"Direct"的由来。当字计数器减到0,说明这一块数据传送完毕,DMA控制器向CPU发出中断请求。
后处理阶段,CPU响应中断,进入中断服务程序,对传送结果做校验和收尾。如果还有数据要继续传,CPU会再次初始化DMA;如果没有了,就结束这次I/O操作。
理解了这个时间轴,很多题就好做了。题目问"DMA方式下CPU在哪些阶段占用",答案就是预处理和后处理阶段。数据传送阶段CPU虽然让出了总线控制权,但它在逻辑上处于"被解脱"的状态,可以继续执行不访问总线的指令,而不是完全停机。
2.3 三种DMA传送方式的内存总线占用策略
DMA传送期间如何使用主存总线,有三种典型策略:CPU停止法、周期挪用、交替访存。这是选择题和概念题的另一个高频出题点。
CPU停止法也叫成组传送方式。DMA控制器一旦获得总线控制权,就连续传送一整批数据,直到整块传完才把总线还给CPU。这种方式实现简单,传送速度最快,但整个传送期间CPU如果要访存就只能在一边等着,对CPU的运行影响很大。
周期挪用方式则是每传送一个字(或字节),DMA就申请一次总线,用完立刻释放。CPU大部分时间照常运行,只是每个字被"偷"走一个总线周期。这种方式特别适合磁盘这类数据均匀到达的设备,因为磁盘的数据是按固定速率流出的,不需要一次性霸占总线。
交替访存方式是把CPU的访存周期和DMA的访存周期在时间上错开,两者各自使用自己的时间片,互不干扰。这种方式需要主存提供更高的带宽,硬件的交叉存储结构配合,实际使用中并不多见,但概念题偶尔会考。
我自己的记忆技巧是:CPU停止法对应"批处理",周期挪用对应"零售",交替访存对应"错峰出行"。三种方式的区别不在于数据对不对,而在于CPU受到的干扰程度不同。408考试里问"周期挪用时CPU受影响最小"之类的话术,本质就是考这三种方式的折中。
3. 磁道与扇区:外存计算题的数学底子
3.1 磁盘物理结构:一个盘片从上到下全是同心圆
讲磁盘计算之前,先把磁盘的物理结构对齐。一个磁盘组通常由多个盘片组成,每个盘片有两个记录面,每个记录面对应一个磁头。每个记录面上从外圈到内圈划分成很多同心圆,每个同心圆就是一个磁道。所有记录面上半径相同的磁道集合,叫做柱面——柱面数等于单面的磁道数。每个磁道又被划分为若干扇区,扇区是磁盘I/O的最小可寻址单位,通常一个扇区512B,也有1KB甚至4KB的。
这里要提醒一句:408考试默认磁盘是恒定角速度(CAV)方式工作,也就是磁盘转速固定,所有磁道每秒钟转过的角度相同。在这个模型下,每条磁道的扇区数是相同的,磁道容量也就相同。代价是外圈磁道的位密度(每英寸能记录的比特数)比内圈低,因为外圈周长长,同样的数据摊得更开。
3.2 容量计算:非格式化容量为什么执着于内圈
磁盘容量有两种口径:非格式化容量和格式化容量。这个区分很关键,很多题目挖坑就挖在这里。
非格式化容量指磁道上能记录的总位数,计算方式一般是:记录面数 × 每面磁道数 × 最内圈磁道周长 × 位密度。为什么要用最内圈算?因为位密度是介质的一个物理极限,内圈周长最短,在最内圈能放下的位密度上限决定了整个系统的记录能力。如果按外圈周长去标定位密度,内圈就会发现放不下同样的位数。这个问题在真题里偶尔会以"为什么非格式化容量按最内圈磁道计算"的形式出现在选择题或者填空里。
格式化容量指磁道划分扇区、去掉扇区间的间隙和头部校验等开销后,用户真正能用的容量。计算公式很直接:记录面数 × 每面磁道数 × 每磁道扇区数 × 每扇区字节数。因为CAV下每道扇区数相同,所以格式化容量跟磁道在盘面的哪个半径没有关系。
举个例子,8个记录面、每面200个磁道、每磁道100个扇区、每扇区512B,格式化容量就是8×200×100×512B = 81,920,000B,约等于78.13MiB。这个数字后面第4章的例题还会用到。
3.3 数据传输率与平均存取时间的计算细节
数据传输率是磁盘计算的核心指标。在CAV模型下,磁盘转一圈读出的数据量正好等于一条磁道的用户数据量,所以:
数据传输率 = 每磁道容量 × 转速(转/秒)
如果转速给的是7200rpm,一定要先除以60变成120转/秒。每磁道容量 = 扇区数 × 扇区大小。这里算出来的单位是字节/秒。
平均存取时间则是另一个必考公式,它由三段构成:平均寻道时间 + 平均旋转延迟时间 + 传输时间。平均寻道时间题目一般直接给,描述的是磁头从当前磁道移动到目标磁道所需的平均时间。平均旋转延迟指的是目标扇区转到磁头下方所需的平均时间,由于磁头的位置是随机的,平均要转半圈,所以等于 60 /(2 × 转速rpm)秒。传输时间则是磁头从数据起点扫过数据终点的时间,等于要读的数据量除以数据传输率,或者等于"扇区数 / 每磁道扇区数 × 转一圈时间"。
这三个时间放在一起有很强的迷惑性。寻道时间和旋转延迟是以毫秒计的,传输时间在多数题里是零点几毫秒,很多人算着算着就把传输时间丢了。可恰恰是这个不起眼的传输时间,在题干里给足数据、要求精确计算时,会让你和标准答案差出零点几毫秒,选择题里就是两个选项的距离。
4. 一道44题同款考法的完整推演
4.1 题目条件与设问设计
下面这道题按22年44题的命题思路整理而来,数据做了典型化处理,方便展示完整解题过程。
题目:某磁盘组共有8个记录面,每个记录面有200个磁道,每个磁道划分为100个扇区,每个扇区512B。磁盘转速为7200rpm,平均寻道时间为5ms。该磁盘通过DMA方式与主存交换数据,每次DMA传送4KB数据(恰好是8个扇区),CPU在每块数据传送前的预处理需要20μs,传送完成后的中断处理需要10μs。求:
(1)磁盘的格式化总容量; (2)磁盘的数据传输率; (3)若磁头已经位于目标磁道上,读取一个4KB的DMA块平均需要多少时间(不考虑寻道); (4)磁盘连续读盘时,CPU用于处理DMA的占用率约为多少。
先别急着套公式,四问之间是有逻辑关系的:第一问算容量,第二问算产出速率,第三问是单次IO的时间成本,第四问回到DMA的CPU开销。这道题把设备物理参数和DMA机制串成了一条完整的链条。
4.2 分步计算全过程
第一问,格式化总容量直接用公式: 8 × 200 × 100 × 512B = 81,920,000B。
这里要注意进制。考试里存储容量如果没特殊说明,通常按2的10次方换算:81,920,000 ÷ 1024 ÷ 1024 ≈ 78.13MiB。有些题目会给"1MB=10^6B"的说明,那就按81.92MB写。最稳妥的做法是式子里的字节数保留原样,最后一步按题目的说明去换算,不要自己默认。
第二问,先把转速换算成秒: 7200rpm ÷ 60 = 120转/秒。 每磁道容量 = 100扇区 × 512B = 51200B。 数据传输率 = 51200B × 120转/秒 = 6,144,000B/s ≈ 6.14MB/s。
这一步考察的就是"每转一圈读一条磁道的用户数据",本质上和转速直接挂钩。如果把7200rpm直接当成120转/秒之外的数值,或者忘了每个磁道100扇区的前提,这个数据率立刻就会差出数量级。
第三问,磁头已在目标磁道上,所以不需要寻道。平均旋转延迟 = 转一圈时间的一半 = 60 ÷(2 × 7200)= 4.17ms。读取4KB数据对应8个扇区,在一条磁道上连续读8个扇区需要转过的角度是磁道的8%,也就是 8 / 100 = 0.08圈。0.08圈对应的时间 = 0.08 ×(60 ÷ 7200)≈ 0.667ms。
所以平均时间 = 平均旋转延迟 + 传输时间 = 4.17 + 0.667 ≈ 4.84ms。
这里有个非常容易错的地方:平均旋转延迟是半圈而不是一圈。很多同学写公式时没有除以2,直接算成8.33ms,第三问结果直接翻倍还多。为什么平均要转半圈?因为磁头落到目标磁道的时刻与目标扇区刚好转到磁头下方的时刻是完全随机的,平均而言你还得等半圈才能迎来扇区起点。只有题目明确说"目标扇区恰好位于磁头正下方",旋转延迟才能取0。
第四问,回到DMA的CPU占用率。先算一个4KB数据块从磁盘读出的节奏:4KB = 4096B,按数据传输率6,144,000B/s计算,产生一个4KB块所需的时间 = 4096 ÷ 6,144,000 ≈ 0.0006667s = 666.7μs。
在这666.7μs里,CPU需要消耗在DMA上的时间 = 预处理20μs + 中断处理10μs = 30μs。因此CPU的占用率 = 30 ÷ 666.7 ≈ 4.5%。
这个结果很有代表性:哪怕磁盘一直在高速读盘,CPU也只需要拿出大约4.5%的时间去伺候DMA,剩下的95%以上的时间都可以继续跑用户程序。这就是为什么磁盘设备一定采用DMA方式而不是中断方式——用中断方式按字节响应的话,这个占用率会直接爆表。
4.3 考场上的检查方法
做完这类题,我建议大家养成一个三连查的习惯。
第一查单位。转速转没转成秒,μs和ms之间是否统一。第二查口径。格式化容量用的是扇区数据大小,非格式化容量用的是位密度,两者不要混。第三查旋转延迟。半圈的"半"字有没有漏掉,题目说的"平均"是不是暗示你要取半圈。
这三查花不了三十秒,但能拦住大多数粗心错误。我自己在模拟考试里复盘过,这类综合题丢分几乎都不是因为不会,而是因为某个单位在某一步悄悄错了,后面全盘崩掉。宁可多花十秒回头验算,也别急着做下一题。
5. 这类综合题的延伸变体与复习复盘方法
5.1 从44题延伸出的高频变体
把DMA和磁盘计算这个组合练熟之后,我还想给大家补充几个常在真题或模拟题里出现的变体方向,遇到它们别慌,本质还是同一套东西。
第一个变体是文件读取时间的计算。题目会给你一个文件大小,比如200MB,文件在磁盘上连续存放,问你从平均寻道开始到读完整个文件大概需要多少时间。这个题就是把第4章的例题放大:寻道一次,旋转等待半圈,然后连续读取多个磁道的数据。文件占的磁道数 = 文件大小 ÷ 磁道容量,传输时间 = 磁道数 × 转一圈时间。注意连续文件只需要一次寻道,不是每个磁道都重新找一次。
第二个变体是结合缓冲区的题目。磁盘数据通过DMA送入主存缓冲区,缓冲区大小有限,问如果缓冲区满了是否会发生数据覆盖。这类题的关键是把DMA传送间隔和缓冲区填满时间做对比,体现了对"数据产出节奏"和"DMA传送节奏"两件事的综合理解。
第三个变体是把DMA换成通道方式,问通道程序如何组织多个设备的传送。这个考频不高,但40法案几年前把通道和DMA放在同一个选择题里比对过,你至少要知道通道能管理多台设备、能执行通道程序,而DMA控制器通常对应一台设备。
5.2 错题整理与知识点串联的具体做法
如果你已经被这类综合题绊过几次,我强烈建议做一次"跨章节合并"的错题整理。具体方法是:准备一张卡片或者一个文档页,左边画DMA的三个阶段时间轴,右边写磁盘的三个核心公式(格式化容量、数据传输率、平均存取时间),中间用一条箭头连起来,标注"CPU预处理和后处理发生在块边界上,磁盘数据按固定节奏到达"。
这种卡片的用处在于:每次复习I/O章节时你会顺带看到磁盘公式,复习外存计算时又会想起DMA的时序。两章知识在脑子里形成条件反射式的关联,考场上一看到"磁盘+DMA"的题干,就不需要临时回忆两条孤立的知识线了。
做题方面,我的建议是近十年的408真题中所有涉及I/O和外存的题目放在一起刷,不用成套做,专门横向对比。你会发现很多年份的题目虽然数据不同,但解题动作一模一样:先算设备侧的速率参数,再算控制方式侧的CPU开销,最后把两者做除法或者加法。把这个动作练成肌肉记忆,这类题对你来说就从"综合难题"降级成了"送分题"。
我在备考时至少把22年这道44题复盘了三遍。第一遍对着答案勉强看懂,第二遍把所有单位重新推导了一遍,第三遍把DMA三种方式和磁盘参数的时间轴画在同一张草稿纸上。三遍下来,我最大的感受是:408里最让人头疼的往往不是单个知识点有多难,而是知识点之间那种"明明相关但你复习时没串起来"的疏离感。DMA和磁盘计算就是最典型的组合,一旦把两条时间线在脑子里重叠起来,后面的路就会顺很多。希望大家也能用这个方法,把更多类似的跨章节考点提前串好,而不是在考场上才第一次意识到它们会出现在同一道题里。