ARTICLE DETAIL

资讯详情

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

408计算机组成原理第44题解析:DMA与磁盘地址计算全链路

408计算机组成原理第44题解析:DMA与磁盘地址计算全链路 1. 这道44题到底在考什么从DMA到磁盘地址的完整链路2022年408计算机组成原理第44题是一道把I/O控制方式和外存地址计算缝在一起的综合题。很多同学做这道题的时候第一问关于DMA的部分写得挺顺到了第二问算磁道、扇区就开始发懵——不是不会除法而是没搞清楚“磁盘地址”到底是怎么从逻辑块号映射到物理位置的。这篇文章我就把这道题拆开揉碎从DMA的工作机制讲到磁盘的柱面、磁头、扇区三层寻址再补上一些实际工程里才会遇到的坑。先说说这道题涉及的两个核心知识块。第一块是I/O设备与主机之间信息传送的控制方式题目聚焦在DMA方式上。DMA全称Direct Memory Access直接存储器访问它的核心思想是让外设和主存之间直接搬数据CPU只在开始和结束时介入中间的数据传输由DMA控制器接管。第二块是外存的磁道、扇区计算也就是给定磁盘的物理参数柱面数、磁头数、每道扇区数让你算容量、算地址映射、算传输时间。这两块知识在408里经常被放在同一道大题里考因为磁盘本身就是典型的块设备它和主存之间的数据传送天然适合用DMA来做。你想想如果磁盘每传一个扇区都要CPU执行一次中断服务程序来搬数据那CPU基本上就不用干别的了。所以磁盘控制器通常内置DMA功能一次DMA请求可以传送一个或多个扇区的数据。这道题适合谁看如果你正在准备408统考或者正在学唐朔飞、白中英、王道这几本教材里的存储系统和I/O系统章节那这篇文章就是给你写的。我会尽量用大白话把原理讲清楚同时给出可以直接套用的计算模板。即使你之前没系统学过磁盘地址计算跟着走一遍也能上手。2. DMA方式的核心机制与408常考角度2.1 DMA控制器的三条总线与三种工作模式DMA控制器要能接管总线必须有三组关键的信号线。第一组是地址线DMA控制器需要向主存发出地址告诉主存数据要写到哪个单元或者从哪个单元读。第二组是数据线用来实际搬运数据。第三组是控制线包括DMA请求信号、DMA应答信号、读写控制信号等。在408的考题里DMA控制器通常被描述为“可以控制总线”的部件。它和CPU之间通过总线请求和总线响应两条线握手。当外设准备好数据后向DMA控制器发DMA请求DMA控制器再向CPU发总线请求。CPU在当前总线周期结束后释放总线发出总线响应信号DMA控制器接管总线开始数据传送。DMA有三种工作模式408选择题里经常考停止CPU访存DMA控制器接管总线期间CPU完全不能访存。这种方式控制简单但CPU效率低适合高速外设成块传送。周期挪用DMA控制器每次只占用一个或几个总线周期用完就把总线还给CPU。这种方式对CPU影响小但控制逻辑复杂。交替访存把CPU的工作周期分成两半一半给CPU一半给DMA。这种方式不需要总线请求和响应但要求CPU和DMA的访存周期匹配。这道44题里题目描述的是磁盘和主存之间的数据传送通常采用的是周期挪用或者停止CPU访存的方式。具体用哪种要看题目给的时序条件。如果题目说“DMA控制器每传送一个字节需要占用一个总线周期”那基本就是周期挪用。2.2 DMA传送的完整流程与中断收尾DMA传送的完整流程可以分成三个阶段。预处理阶段CPU初始化DMA控制器设置主存起始地址、传送字节数、传送方向读还是写、外设地址等参数。数据传送阶段DMA控制器接管总线每传送一个数据单元就修改地址和计数器直到计数器减到零。后处理阶段DMA控制器向CPU发中断请求CPU执行中断服务程序做收尾工作比如检查传送是否出错、处理剩余数据等。这里有个容易混淆的点DMA传送结束后CPU仍然需要执行中断服务程序。很多同学以为DMA全程不需要CPU其实不对。DMA只是在数据传送阶段不需要CPU逐字节干预但开始前的初始化和结束后的收尾都离不开CPU。408选择题里经常拿这个点来设陷阱比如问“DMA方式下CPU完全不参与数据传送”这显然是错的。注意DMA请求和中断请求是两回事。DMA请求是在数据传送过程中外设向DMA控制器发出的中断请求是在DMA传送结束后DMA控制器向CPU发出的。两者发生的时机和作用完全不同。2.3 为什么磁盘适合用DMA而不是中断磁盘的传输速率虽然比不上内存但比键盘、鼠标这类字符设备快得多。假设一个扇区512字节磁盘转速7200转/分每转一圈可以读一个磁道的数据。如果每传一个字节都发一次中断CPU光处理中断就忙不过来了。用DMA的话磁盘控制器可以一次性把整个扇区的数据搬到主存CPU只在整块数据传完后处理一次中断。从408的考试角度看题目通常会给出磁盘的参数和DMA的传送速率让你算DMA传送占用了多少CPU时间或者算CPU用于处理中断的时间占比。这类计算的关键是搞清楚DMA传送一个数据单元需要几个总线周期以及CPU在DMA传送期间能否访存。3. 磁盘地址计算从逻辑块号到柱面、磁头、扇区3.1 磁盘的物理结构与三层寻址磁盘的物理结构可以想象成一栋楼。柱面相当于楼层磁头相当于每层楼里的房间号扇区相当于房间里的座位号。要找到某个数据你需要先确定它在哪一层柱面再确定是哪个房间磁头最后确定是哪个座位扇区。一个磁盘有若干个盘面每个盘面有一个磁头。所有盘面上相同半径的磁道组成一个柱面。每个磁道被分成若干个扇区每个扇区存储固定数量的字节通常是512字节或者4KB。磁盘的容量计算公式是总容量 柱面数 × 磁头数 × 每道扇区数 × 每扇区字节数这个公式在408里几乎每年都考但很多同学记不住“磁头数”和“盘面数”的关系。其实很简单一个盘面对应一个磁头所以磁头数就等于盘面数。如果题目说“磁盘有4个盘面”那就是4个磁头。3.2 逻辑块号到物理地址的映射计算磁盘的地址通常用逻辑块号LBA来表示从0开始编号。操作系统读写磁盘时给出的是逻辑块号磁盘控制器需要把它转换成柱面号、磁头号、扇区号。转换的规则是先填满同一个柱面下的所有磁道再换到下一个柱面。也就是说逻辑块号0到磁头数×每道扇区数-1对应柱面0逻辑块号磁头数×每道扇区数到2×磁头数×每道扇区数-1对应柱面1以此类推。具体的转换公式柱面号 逻辑块号 ÷ (磁头数 × 每道扇区数)磁头号 (逻辑块号 ÷ 每道扇区数) mod 磁头数扇区号 逻辑块号 mod 每道扇区数这里的除法是整数除法取商和余数。举个例子假设磁盘有4个磁头每道16个扇区。逻辑块号100对应的柱面号是100÷(4×16)100÷641磁头号是(100÷16) mod 46 mod 42扇区号是100 mod 164。提示扇区号通常从1开始编号而逻辑块号从0开始。如果题目给的扇区号从1开始计算时要注意加1。408题目里两种编号方式都出现过做题时先看清楚题目的约定。3.3 磁盘传输时间的三个组成部分磁盘读写一个数据块的时间由三部分组成寻道时间、旋转延迟、传输时间。寻道时间是磁头从当前磁道移动到目标磁道所需的时间。这个时间取决于磁头的机械结构和移动距离通常题目会给出平均寻道时间。旋转延迟是等待目标扇区旋转到磁头下方所需的时间。平均旋转延迟是磁盘转半圈的时间。如果转速是r转/分那么转一圈的时间是60/r秒平均旋转延迟就是30/r秒。传输时间是实际读写数据的时间。如果每道有N个扇区要读写k个扇区传输时间就是(k/N)×转一圈的时间。总访问时间 寻道时间 旋转延迟 传输时间。408题目里经常让你算平均访问时间或者比较不同调度算法的效率。4. 这道44题的完整解题过程与参数计算4.1 题目关键信息的提取与整理虽然我手头没有这道题的完整原文但根据标题和常见考法这道题大致是这样的结构第一问给出磁盘的参数让你算容量或者地址映射第二问涉及DMA传送让你算传送时间或者CPU开销。假设题目给出的磁盘参数是8个盘面每面1024个柱面每道64个扇区每扇区512字节。那么磁盘总容量是8×1024×64×512字节256MB。如果题目问“逻辑块号3000对应的柱面号、磁头号、扇区号分别是多少”按照前面的公式柱面号 3000 ÷ (8×64) 3000 ÷ 512 5磁头号 (3000 ÷ 64) mod 8 46 mod 8 6扇区号 3000 mod 64 56如果扇区号从1开始编号那扇区号就是57。4.2 DMA传送时间的计算与CPU开销分析假设题目说“磁盘控制器采用DMA方式与主存交换数据每次DMA传送一个扇区DMA控制器每传送一个字节需要一个总线周期总线周期为50ns”。那么传送一个扇区512字节需要512×50ns25600ns25.6μs。如果题目进一步问“CPU用于DMA预处理和后处理的时间”通常预处理是几十条指令后处理是中断服务程序。假设预处理需要100个时钟周期后处理需要200个时钟周期时钟频率为1GHz那么CPU开销是300ns。在DMA传送期间CPU可以继续执行其他程序除非DMA采用停止CPU访存的方式。如果采用周期挪用CPU和DMA交替访存CPU的执行速度会稍微慢一点但不会完全停顿。注意408题目里经常把DMA传送时间和CPU处理时间放在一起比较让你算CPU用于I/O的时间占比。关键是要区分“DMA传送时间”和“CPU参与时间”前者是数据在总线上传输的时间后者是CPU执行指令的时间。4.3 磁盘调度算法对访问时间的影响如果题目涉及多个磁盘请求可能会考磁盘调度算法。常见的算法有算法特点适用场景FCFS按请求顺序服务请求少时公平SSTF优先服务最近的请求可能产生饥饿SCAN磁头单向移动沿途服务避免饥饿C-SCAN单向扫描回程不服务响应时间更均匀这道44题如果考了调度算法通常会给出当前磁头位置和请求队列让你算总寻道时间。计算时要注意磁头的移动方向和当前所在磁道。5. 常见错误与排查技巧实录5.1 磁道、柱面、磁头三个概念混淆这是最常见的错误。很多同学把“磁道”和“柱面”搞混或者把“磁头数”和“盘面数”当成两个不同的东西。记住一个类比柱面是楼层磁头是房间号扇区是座位号。一个柱面包含所有盘面上相同半径的磁道所以柱面数等于每个盘面的磁道数。另一个容易错的地方是磁头号的编号。有些题目磁头号从0开始有些从1开始。如果题目说“0号磁头”那就是从0开始如果说“第1个磁头”那可能从1开始。做题时先看题目的约定不要想当然。5.2 逻辑块号计算时的取整与取余错误逻辑块号到物理地址的转换涉及除法和取余很多同学在这里算错。建议用表格法先算柱面号再算磁头号最后算扇区号。每一步都写清楚除数和余数不要跳步。举个例子逻辑块号1000磁头数4每道扇区数16柱面号 1000 ÷ (4×16) 1000 ÷ 64 15磁头号 (1000 ÷ 16) mod 4 62 mod 4 2扇区号 1000 mod 16 8如果扇区号从1开始就是9。每一步都验证一下15×642×1689603281000对的。5.3 DMA传送与中断传送的混淆有些同学把DMA传送和中断传送混为一谈以为DMA传送结束后不需要CPU干预。实际上DMA传送结束后DMA控制器会向CPU发中断请求CPU需要执行中断服务程序来做收尾。这个中断和普通的中断没有本质区别只是它的触发源是DMA控制器而不是外设。另一个混淆点是DMA请求和中断请求的优先级。通常DMA请求的优先级高于中断请求因为DMA传送不能等太久否则数据会丢失。408题目里如果考优先级一般会说“DMA请求的优先级高于中断请求”。5.4 磁盘传输时间计算时忽略旋转延迟很多同学算磁盘访问时间时只算寻道时间和传输时间忘了旋转延迟。旋转延迟是等待扇区转到磁头下方的时间平均是转半圈的时间。如果题目说“磁盘转速为7200转/分”那转一圈的时间是60/7200秒8.33ms平均旋转延迟是4.17ms。这个时间在总访问时间中占比很大不能忽略。提示如果题目问“平均访问时间”通常用“平均寻道时间平均旋转延迟传输时间”来算。如果题目问“最坏情况访问时间”那旋转延迟就是转一圈的时间。6. 从408考题到实际工程磁盘与DMA的延伸思考6.1 实际磁盘的扇区大小与对齐问题408题目里扇区大小通常是512字节但实际磁盘的扇区大小可能是512e512字节逻辑扇区4KB物理扇区或者4Kn4KB原生扇区。这就引出了分区对齐的问题。如果分区没有对齐到物理扇区的边界一次逻辑写操作可能会触发两次物理读改写性能会下降。在实际装系统或者分区时用DiskGenius这类工具可以看到“起始扇区号”。如果起始扇区号是2048的倍数对于512e磁盘那就是对齐的。如果不对齐可以用工具调整。这个知识点在408里不考但实际工作中很有用。6.2 chkdsk与坏扇区检测的底层逻辑Windows下的chkdsk命令会检查磁盘的坏扇区。它的原理是读取每个扇区的内容如果读取失败或者校验错误就标记为坏扇区。坏扇区分为软坏扇区和硬坏扇区软坏扇区可以通过重新写入来修复硬坏扇区是物理损伤只能重映射。chkdsk在检查时会显示“将检查该卷是否存在坏扇区”这个过程可能很慢因为它要扫描整个卷。如果磁盘容量很大建议先用快速检查发现问题再做完整扫描。6.3 空硬盘写入数据的磁道和扇区顺序新硬盘出厂时是空白的写入数据时按照从外到内的顺序填充磁道。外圈的磁道编号小内圈的磁道编号大。同一个柱面内先填满所有磁头对应的磁道再移到下一个柱面。这个顺序和逻辑块号的映射规则是一致的。实际写入时文件系统会尽量把数据放在连续的扇区里减少寻道时间。这就是碎片整理的意义所在。如果文件碎片化严重磁头需要频繁移动读写速度会明显下降。6.4 组间串行进位与磁盘地址的关系“组间串行进位”是计算机组成原理里加法器的概念和磁盘地址计算没有直接关系。但408题目有时会把多个知识点串在一起考比如让你先算地址再用加法器做地址递增。这时候要分清每个知识点的边界不要被题目的叙述绕晕。磁盘地址递增时扇区号先增加扇区号溢出后磁头号增加磁头号溢出后柱面号增加。这个递增顺序和逻辑块号的映射规则是一致的。如果用硬件实现地址递增可以用计数器加进位链来实现这就是组间串行进位的实际应用场景。7. 备考408存储系统与I/O系统的实操建议7.1 建立知识框架而不是死记公式存储系统和I/O系统的知识点很多但核心框架很清晰。存储系统围绕层次结构展开寄存器、Cache、主存、外存每一层的速度、容量、成本都不同。I/O系统围绕控制方式展开程序查询、中断、DMA、通道每一种方式的CPU参与程度不同。建议画一张思维导图把每个知识点的位置和关系标清楚。比如DMA属于I/O控制方式磁盘属于外存两者通过磁盘控制器连接。这样做题时就能快速定位到相关知识点。7.2 用真题反推知识点而不是盲目刷题408的真题质量很高每道题都对应明确的知识点。做完一道题后不要只对答案要分析这道题考了哪些知识点每个知识点的考查角度是什么。比如这道44题考了DMA的工作机制、磁盘地址计算、传输时间计算可能还涉及调度算法。建议把近10年的真题按知识点分类看看哪些知识点反复出现。DMA和磁盘计算几乎每年都考只是考查角度不同。把这些高频知识点吃透比刷一堆模拟题有效得多。7.3 动手算而不是只看答案磁盘地址计算和传输时间计算都是实操性很强的题目光看答案觉得会了实际动手算就容易出错。建议找一张白纸把题目给的参数列出来一步一步算每一步都写清楚公式和代入过程。算完后用反向验证的方法检查比如用算出的柱面号、磁头号、扇区号反推逻辑块号看是否和题目一致。DMA传送时间的计算也要动手算注意单位换算。ns、μs、ms之间的换算容易出错建议统一换算成秒或者毫秒再计算。7.4 关注实际应用而不是只应付考试408的知识点在实际工作中很有用。比如磁盘地址计算在文件系统、数据库、存储阵列里都有应用。DMA在网卡、显卡、磁盘控制器里都是标配。如果你以后做底层开发或者系统运维这些知识会经常用到。建议在备考之余用工具看看实际磁盘的分区结构、扇区大小、DMA传输速率等参数。比如用DiskGenius查看扇区编辑用性能监视器查看磁盘传输速率。这些实际经验会帮助你更深刻地理解课本知识。提示408考试里磁盘计算题的参数通常是理想化的实际磁盘还有缓存、预读、写合并等优化机制。做题时按题目给的参数算不要引入实际经验中的额外因素。8. 从这道题延伸出的高频考点速查8.1 DMA与中断的对比速查表对比项中断方式DMA方式数据传送方向外设→CPU→主存外设→主存CPU参与程度每传一个数据单元都要干预只在开始和结束时干预中断时机每个数据单元传完后整块数据传完后优先级较低较高适用场景低速字符设备高速块设备这张表在选择题里经常用到尤其是“CPU参与程度”和“中断时机”这两行。很多题目会问“DMA方式下CPU何时介入”答案就是“预处理和后处理阶段”。8.2 磁盘容量与地址计算速查公式总容量 柱面数 × 磁头数 × 每道扇区数 × 每扇区字节数柱面号 逻辑块号 ÷ (磁头数 × 每道扇区数)磁头号 (逻辑块号 ÷ 每道扇区数) mod 磁头数扇区号 逻辑块号 mod 每道扇区数平均旋转延迟 30 ÷ 转速转/分秒传输时间 (读写扇区数 ÷ 每道扇区数) × (60 ÷ 转速)秒这些公式要背熟但更重要的是理解每个参数的物理意义。比如“每道扇区数”决定了逻辑块号在同一个磁道内如何分布“磁头数”决定了逻辑块号在同一个柱面内如何分布。8.3 磁盘调度算法寻道时间计算速查假设当前磁头在100号磁道请求队列是55、58、39、18、90、160、150、38、184。用SSTF算法先服务90距离10再服务58距离32再服务55距离3以此类推。计算总寻道时间时把每次移动的距离加起来。用SCAN算法如果磁头向磁道号增加的方向移动先服务150、160、184再回头服务90、58、55、39、38、18。计算时注意磁头的移动方向不要漏掉回程的服务。注意408题目里如果考调度算法通常会给出当前磁头位置和移动方向。如果没给移动方向默认向磁道号增加的方向移动。9. 我在实际做题中踩过的坑与总结第一次做这道44题的时候我在磁盘地址计算上卡了很久。题目给的扇区号从1开始我按从0开始算结果差了1。后来才发现题目里有一句话“每个磁道的扇区编号从1开始”我没注意到。从那以后我做题时第一件事就是把题目里的编号约定圈出来。另一个坑是DMA传送时间的单位换算。题目给的时钟周期是ns传送字节数是KB我直接乘起来忘了换算结果差了三个数量级。后来我养成了一个习惯把所有单位统一换算成基本单位秒、字节再代入公式计算。还有一个坑是磁盘调度算法的寻道时间计算。我以为SSTF算法就是每次找最近的请求但忽略了“当前磁头位置”在每次服务后都会更新。比如当前在100服务了90之后磁头就在90了下一次要找离90最近的请求而不是离100最近的。这个细节很容易出错。最后分享一个做题技巧先画图再计算。把磁盘的柱面、磁头、扇区画成一个三维表格逻辑块号标在表格里这样地址映射关系一目了然。DMA传送的时间线也可以画出来标出CPU参与的时间段和DMA传送的时间段这样计算CPU开销时不容易漏项。这些经验都是我在反复做题和实际调试中积累的希望对正在备考408的你有所帮助。磁盘和DMA这部分内容理解了原理之后其实并不难关键是要动手算、多验证把每个参数的物理意义搞清楚。
返回列表