软考上午题里,磁盘相关计算属于那种单题只有一两分、但几乎年年都考的稳定题型。很多考生复习时容易把这块一带而过,总觉得无非是“容量=盘面×磁道×扇区×扇区大小”这种套公式的题,结果真上了考场才发现,平均旋转延迟到底要不要除以2、位示图的字号位号从0还是从1开始、SCAN和CSCAN回程到底处不处理请求,全是容易翻车的细节。这篇是计算机基础复习系列的第6篇,专门把磁盘相关计算从头到尾梳理一遍,覆盖物理模型、容量计算、访问时间、调度算法、位示图和RAID六大块,每块配例题和易错点。不管你是正在做软考真题冲刺,还是单纯想把计算机组成原理里磁盘这部分补扎实,这篇都值得花半小时看完。
1. 磁盘物理模型:算容量之前先搞懂名词
1.1 磁道、扇区、柱面、盘面是怎么串起来的
磁盘计算题的第一步,永远是确认题目里给的名词到底是哪种级别。盘片是物理圆盘,一个盘片有上下两个盘面,每个盘面对应一个磁头,所以“4个盘片”通常意味着8个盘面,但有些题目会说“4个记录面”,这时盘面数就是4。做容量题第一件事就是数清楚到底有几个可用盘面。
每个盘面上从外圈到内圈划分出若干同心圆,每一圈叫一条磁道,磁道号从外圈向内圈从0开始编号。磁道又被等分成扇区,扇区是磁盘读写的最小单位,常见大小是512字节,也有4KB的。同一柱面上所有盘面的同一半径磁道合起来,叫一个柱面。操作系统在CHS寻址时用“柱面号、磁头号、扇区号”三个分量定位一个扇区,柱面决定磁头径向移动,磁头号决定选哪个盘面,扇区号决定等磁盘转到哪个角度。
这里有一个大家容易忽略的地方:每条磁道的扇区数是一样的。也就是说内圈磁道和外圈磁道容量相同,但内圈的物理长度短,所以内圈的数据密度更高。计算非格式化容量时,必须按照最内圈的周长来算位密度,外圈就算实际能塞更多数据,设计上也不按外圈容量算。理解了这个模型,后面无论算容量还是算访问时间都不容易乱。
1.2 磁盘容量计算:格式化与未格式化别混
软考容量题就两类公式。一类是非格式化容量,给的是位密度(比如“位/英寸”)和磁道直径,计算公式是:
非格式化容量 = 位密度 × 最内圈磁道周长 × 总磁道数
注意位密度单位是“位”,要除以8才得到字节。另一类是格式化容量,给的是扇区数和扇区大小,计算公式是:
格式化容量 = 每磁道扇区数 × 扇区容量 × 总磁道数
总磁道数 = 盘面数 × 每面磁道数。盘面数不一定等于盘片数×2,题目说“记录面”就是记录面,说“盘片”才默认双面。
举个例子。某磁盘组有4个盘片,每面有200个磁道,每磁道16个扇区,每扇区512字节,求格式化容量。盘面数=4×2=8,总磁道数=8×200=1600,容量=1600×16×512=13107200字节,除以1024再除以1024等于12.5MB。如果题目把“扇区大小”改成“位密度”,那就要用非格式化容量公式,两者结果会差不少,因为格式化要扣除扇区之间的间隙、同步字段和校验字段。
这个计算里最容易翻车的是单位进制。软考默认1KB=1024B、1MB=1024KB,除非题干特别说明按1000进制算,否则一律按1024折算。我见过有同学在草稿纸上把300GB的磁盘按300000000000字节去算,最后答案差了一截,这种分丢得特别冤。
2. 磁盘访问时间:最爱考平均旋转延迟
2.1 访问时间的三个组成部分
磁盘读一个数据块的时间,由三段组成:寻道时间、旋转延迟、传输时间。寻道时间是磁头径向移动到目标磁道的时间,由移动距离决定,题目一般直接给平均值,比如5ms。旋转延迟是目标扇区转到磁头正下方的时间,这个时间取决于磁盘转速和当前磁头位置。传输时间是读写数据本身花的时间,等于要读的数据量除以数据传输率,或者等于扇区数乘以每个扇区经过磁头的时间。
平均访问时间的公式就是三项相加。如果题目问“平均”寻道和“平均”旋转延迟,直接代入;如果问某一次具体访问,那旋转延迟要看扇区当前位置,这类题通常不会让考生精确算角度,而是给平均延迟。真正能拉开分差的地方,集中在旋转延迟的换算和带处理时间的综合题上。
2.2 平均旋转延迟的换算套路
转速是“转/分钟”,要换算成“毫秒/圈”。一分钟是60000毫秒,所以每圈时间 = 60000 ÷ 转速。7200转/分的盘,每圈 = 60000 / 7200 ≈ 8.33ms。平均旋转延迟是半圈的时间,因为目标扇区平均分布,磁头平均要等半圈才能等到目标扇区,所以平均旋转延迟 = 每圈时间 ÷ 2 ≈ 4.17ms。
很多题目会在这一步埋坑,让人以为平均旋转延迟就是一圈时间。题目问“平均访问时间”,给的数据是“平均寻道时间5ms、转速7200rpm、每磁道100个扇区、每扇区512字节”,那就应该这么算:平均旋转延迟4.17ms,传输时间要看读多少数据,读一个扇区的传输时间是每圈时间除以扇区数,即8.33 / 100 = 0.0833ms。平均访问时间 = 5 + 4.17 + 0.0833 ≈ 9.25ms。如果把旋转延迟算成8.33ms,答案就错了近一倍。
这里有个考场习惯值得养成:见到转速先写“每圈多少ms”,见到“平均旋转延迟”立刻除以2,两步写完再代入公式,别跳步。
2.3 记录交错题:顺序存放不等于顺序读完
磁盘访问时间真正难的综合题,是“同一条磁道上连续存放多条逻辑记录,读一条处理一条,问读完所有记录总耗时”。这类题不把旋转和处理的先后关系画清楚,十个有九个会算错。
经典题长这样:磁盘转速3000rpm,一圈20ms,每磁道10个扇区,每条记录恰好占一个扇区,记录按扇区顺序连续存放。读一条记录需要2ms,处理一条记录需要4ms,问处理完10条记录总时间多少。
转速3000rpm时一圈是20ms,所以每个扇区扫过磁头的时间是2ms。读第1条记录用2ms,读完时磁头正好在扇区1的起点;紧接着处理需要4ms,这4ms里磁盘继续转,转过2个扇区,等处理完时磁头已经在扇区3的起点。可是第2条记录还在扇区1,必须等磁盘再转8个扇区(16ms)把扇区1转到磁头下,才能读第2条,读完再处理4ms。除了第一条是“读2+处理4=6ms”,后面每条都是“等16+读2+处理4=22ms”,总时间 = 6 + 9×22 = 204ms。
如果用记录间隔离散存放的方式优化,让读+处理的时间刚好等于转过若干个扇区的时间,也就是每条记录耗时6ms、磁盘正好转3个扇区,那么第2条记录放在扇区3、第3条放在扇区6、第4条放在扇区9,依次错开,10条记录读完总时间就是10×6=60ms。这种交错编号的优化原理,就是让“处理时间”被一轮旋转消化掉,而不是让磁头干等一整圈。考试看到“顺序存放”“记录交错”这些关键词,先画一个10等分的圆再动手,思路会清晰很多。
3. 磁盘调度算法:四种算法其实是同一条主线
3.1 FCFS、SSTF、SCAN、CSCAN的移动逻辑
磁盘调度算法是上午题常客,下午案例偶尔也会混一道。四种算法的区别,本质上就是“下一个服务谁”的选择规则不同。
先来先服务(FCFS)最简单,按请求到达顺序依次处理,公平但磁头移动路径长。最短寻道时间优先(SSTF)每次选离当前位置最近的请求,响应快但局部优先,极端情况下远处的请求可能长期得不到服务,也就是饥饿现象。SCAN也叫电梯算法,磁头沿着当前方向移动,途中经过的请求都服务,一直走到一端再反向,类似电梯上下运行。循环扫描(CSCAN)从字面理解,磁头只朝一个方向服务,到了端点直接快速返回另一端,返回途中不处理任何请求,这样能避免SCAN里“刚被服务过的方向很快又回来”的不公平等待。
还有一个细节,很多教材里SCAN到达边界才回头,而LOOK是到达当前方向最远的请求就回头,CSCAN对应的是CLOOK。软考选择题如果只说SCAN,默认按“到边界再回头”算,如果题目明确说“到达最大磁道号后反向”,就按题干来。解题时先圈出三个信息:当前磁头位置、当前移动方向、请求队列,然后按规则模拟,方向变了之后要特别小心。
3.2 一道综合题走完四种算法
用一个具体序列对比四种算法的总移动量。假设当前磁头位于143磁道,当前移动方向为磁道号增大方向,请求队列是86、147、91、177、94、150、102、175、130。
FCFS按顺序走:143→86→147→91→177→94→150→102→175→130,逐段移动量是57、61、56、86、83、56、48、73、45,累计565个磁道。
SSTF每次选最近的:143最近的是147(距离4),然后150(距离3),再到130(距离20),接着102(距离28)、94(距离8)、91(距离3)、86(距离5)、175(距离89)、177(距离2),累计162个磁道。
SCAN沿增大方向先服务147、150、175、177,到边界199后反向,回程服务130、102、94、91、86,累计为4+3+25+2+22+69+28+8+3+5=169个磁道。
CSCAN沿增大方向到199后直接回到0号磁道附近,再沿增大方向继续,回程不服务,那么服务顺序是147、150、175、177,然后跳到86开始服务86、91、94、102、130,累计为4+3+25+2+199+86+5+3+8+28=363个磁道。
把四个数字放在一起,SSTF和SCAN明显优于FCFS,CSCAN因为一次性回程多了199的移动量,在这类“最远请求不到199”的例子里显得高,但它的价值在于最坏等待时间可控。做题时最后一步一定是“把总移动量抄到答题卡之前再看一眼方向”,我见过有考生SCAN算对了,结果反向那一半把回程请求也服务了,直接算成另一种算法,一对答案才发现差了几十。
4. 位示图:盘块与字位之间的换算
4.1 位示图到底在管理什么
位示图是文件系统管理空闲盘块的一种数据结构。整个磁盘被划分成固定大小的物理块,比如4KB一块,位示图用一个二进制位对应一个物理块,1表示占用,0表示空闲。它的原理特别像地下停车场每个车位上方的那盏小灯,灯亮表示有车,灯灭表示空位,只不过位示图把这些灯全部集中到一片连续的内存里。一个32位字可以管32个盘块,盘块数多了,位示图本身也要占存储空间。
软考关于位示图的题,核心就两类:一类是“共N个盘块,每字n位,需要多少个字”,另一类是“给定盘块号,求它对应第几个字第几位”,以及反向的“给定字号位号,求盘块号”。第二类最容易错。
4.2 字号、位号、盘块号转换的公式与陷阱
换算公式本身不复杂,但起点是0还是1,决定公式完全不一样。字节位示图如果字号和位号都从0开始,盘块号也从0开始,那么盘块号b对应的字号 = b / n,位号 = b % n。这里n是每字位数,多数题是32。
如果盘块号从1开始,字号位号也从1开始,那要把所有数先减1再除,最后再恢复:字号 = (b - 1) / n + 1,位号 = (b - 1) % n + 1。很多考题会故意在题干里写明“盘块号从0开始”或“字号位号从1开始”,读题时把这几个“从几开始”圈出来,比急着套公式重要得多。
举个例子。某系统盘块号从0开始,每字32位,字号位号也均从0开始,问盘块号1024在第几个字的第几位。1024 ÷ 32 = 32余0,所以字号是32,位号是0。如果题目问“第几个字的第几位”,就要回答“第33个字的第1位”,因为从0计数到32,实际是人类习惯的第33个。反过来,第10个字(从0开始)的第5位(从0开始)对应的盘块号 = 10×32+5 = 325。一个正向一个反向,考场上特别容易差1或差32。
这个“减1加1”的坑每年都有人掉。我的习惯是草稿纸上先写一行字:“字号从0,盘块号从0,直接用除和取余;字号从1,先减1再操作”。用一道题验证完再往答题卡上写。
4.3 位示图自身占用空间的估算
位示图本身占多少空间,也是选择题考点。已知磁盘容量和物理块大小,先算总块数,再除以8就是位示图占用的字节数,因为一个字节8位。
例:磁盘容量300GB,物理块大小4KB,全部按1024进制换算。总块数 = 300×1024×1024 / 4 = 78643200块。位示图需要的位数 = 78643200位,换算成字节 = 78643200 / 8 = 9830400字节,约等于9.38MB。如果题目给的是每字32位,问需要多少个字,就用总块数除以32,得到2457600字。
这里要注意一个问题:题目可能把磁盘容量写成“300GB”,但物理块大小给“4KB”,两者的进制描述如果不一致,算出来会差很大。软考的默认口径是1024进制,遇到“厂商容量”这类字眼才考虑1000进制。拿不准时,先看题干有没有“约等于”“按十进制”的字样,没有就按1024算。
5. RAID容量计算:选择题里的稳定送分点
5.1 各级别冗余方式与有效容量
RAID题在软考里主要考容量和容错能力,最常出现的是RAID0、RAID1、RAID5、RAID10。先看一张表,把原理和有效容量一次记住。
| 级别 | 最少盘数 | 数据组织方式 | 有效容量 | 容错能力 |
|---|---|---|---|---|
| RAID0 | 2 | 条带化,数据分散到所有盘 | N×单盘容量 | 无冗余,坏一块全丢 |
| RAID1 | 2 | 镜像,两块盘存同样数据 | (N/2)×单盘容量 | 允许坏一块 |
| RAID5 | 3 | 数据和奇偶校验分布在所有盘 | (N-1)×单盘容量 | 允许坏一块 |
| RAID6 | 4 | 双重奇偶校验 | (N-2)×单盘容量 | 允许坏两块 |
| RAID10 | 4 | 先镜像再条带 | (N/2)×单盘容量 | 每组镜像允许坏一块 |
这张表里最需要背的是RAID5。很多人第一次做RAID5容量题,下意识以为是所有盘容量加总,正确答案其实是“总容量减一块盘的容量”,因为要拿一块盘的等效空间存奇偶校验信息。RAID5不是单独用某块盘存校验,而是把校验信息分散到所有盘上,所以有效空间是N-1块盘。N块同容量盘做RAID5,利用率就是(N-1)/N。
5.2 RAID5是考试常客:做题模板
实际考题往往这么出:某公司购买8块4TB硬盘,若组建RAID5,可用存储容量是多少?直接套公式:(8-1)×4TB=28TB,利用率是28/32=87.5%。如果题目改成“组建RAID1”,可用容量=8×4/2=16TB,利用率50%;如果改成“组建RAID0”,可用容量=32TB,但不提供冗余。
还有一种变体:8块4TB盘+2块4TB热备盘做RAID5,可用容量是多少?热备盘平时不参与存储,坏了才顶上,所以可用容量仍然是28TB,硬盘总插槽数多了2块。这类题纯粹考概念,热备盘不计入有效容量,按字面理解就行。
RAID5还有一个常和“磁盘损坏”结合的判断题,比如“RAID5中一块盘损坏后,系统还能正常工作吗”,答案是能,因为可以通过其余盘的数据和校验信息重建损坏盘的数据,但如果后续又坏一块,数据就彻底丢了。这里也对应前面表格说的“允许坏一块”。
6. 易错点清单与复习策略
6.1 我踩过的十个坑
把磁盘相关计算里最容易出问题的位置汇总成一份清单,考前扫一眼能救命。
- 转速换算出错。每圈毫秒 = 60000 / rpm,不是60 / rpm,也不是60000直接乘。
- 平均旋转延迟是一圈的一半。很多题目就留这个陷阱,算完一圈时间记得除以2。
- 盘片数不等于盘面数。双面盘片默认盘面数翻倍,题目说“记录面”才是直接给的数。
- 非格式化容量和格式化容量公式混用。给位密度用周长×磁道数,给扇区用扇区数×扇区大小。
- 记录交错题按“读+处理”直接乘条数。顺序存放时,处理期间磁头已经转过了下一条记录的位置,要加等待时间。
- 调度算法没看当前方向。SSTF没有方向概念,SCAN和CSCAN必须有方向,方向不同结果完全不同。
- SCAN和CSCAN回程处理请求。SCAN回程要处理沿途请求,CSCAN回程不处理,直接回到另一端。
- 位示图公式起点搞反。先确认字号、位号、盘块号的起点是0还是1,再套公式。
- RAID5有效容量算成N块盘。正确是N-1块盘,校验信息占了等价于一块盘的容量。
- 进制默认。软考默认1024进制,没有明确说明按1000进制时,不要用1000算。
6.2 考前怎么盯这块的复习
磁盘相关计算在上午题占比不高,但知识点密集,适合用“短线冲刺”的方式解决。我的操作方法是考前两周把手写笔记本翻到一页,只抄三类内容:转速和容量的所有公式、四种调度算法的一句话区分、位示图从0和从1两组公式。抄完合上本子,默写一遍,再对照检查。这页纸就是考试当天下午进考场前最后看的东西,比临时翻教材有用得多。
题量方面,这部分不需要题海战术。每天做3道跟磁盘相关的选择题,坚持一周,基本就能覆盖所有考法。刷题时故意把每道题的坑点标注出来,比如这道题考“平均旋转延迟要不要除以2”,那道题考“CSCAN回程会不会服务”,形成自己的坑点索引。考场上遇到新题,先对照坑点索引排除掉几个错误选项,正确率会明显提升。
我个人备考时对这类计算题的最大体会是:别急着列算式,先花十秒钟把题目里的物理过程在脑子里过一遍。磁盘题和纯数学题不一样,每一个数都有实际含义,把“磁头现在在哪、盘转到哪、要不要等待”想清楚,公式自然就列对了。我在记录交错题上栽过一次之后,养成了画圆盘草图的习惯,考试时这个习惯帮我稳住了所有访问时间题。这套方法你也可以直接拿去用,软考只剩两周也不是问题。