☰
操作系统磁盘管理小测复盘:寻道时间与调度算法全解析
2026/10/14 17:35:27 网站建设 项目流程

提到操作系统里的磁盘管理,很多同学第一反应是“不就是硬盘读写嘛”。但真到了课堂小测,要在限定时间内把寻道时间、旋转延迟、传输时间算明白,把FCFS、SSTF、SCAN的调度序列画清楚,不少人就懵了。这次我就拿一堂操作系统课程里的课堂小测做个完整复盘,主题正好是设备管理模块中的磁盘管理,从物理结构到访问时间计算,从调度算法到容量换算,把整块知识串起来说透。这篇文章适合正在学操作系统、准备考研或者单纯想把磁盘这块搞扎实的同学,看完可以直接照着算一遍。

1. 这次课堂小测到底在考什么

1.1 设备管理在操作系统课程里的位置

操作系统这门课逻辑上其实挺清晰:处理机管理管CPU,内存管理管主存,文件管理管存储空间的逻辑组织,设备管理则管所有I/O设备。磁盘比较特殊的一点是,它既是字符设备之外的块设备代表,又是文件系统真正的物理载体。你在文件系统里看到的inode、目录、数据块,最终都要落到磁盘的具体扇区上。所以设备管理这一章,一头连着中断、驱动、缓冲区这些I/O底层机制,另一头又连着文件系统的地址映射,卡在中间的位置很容易被单独拎出来考。

课堂小测之所以专门考磁盘,是因为这块既有概念记忆,又有计算,还有策略比较。比如“设备的独立性”这种题考概念,“磁盘访问时间的计算”考公式应用,“FCFS和SSTF谁更适合当前队列”考算法理解。如果把设备管理比作一整棵技能树,磁盘调度就是上面最能直观检验功力的挂果枝条。

1.2 磁盘管理为什么值得单独考

磁盘管理的核心矛盾说白了就一句话:CPU和内存的速度是纳秒、微秒级别,磁盘的机械寻道和旋转是毫秒级别,差了好几个数量级。而绝大多数程序又必须把数据持久化到磁盘上,所以怎么让磁盘服务尽可能多的I/O请求,就成了设备管理里最具工程味道的问题。

这次小测的命题思路也围绕这个矛盾展开:一类题是计算单次磁盘访问时间,检验你对寻道、旋转、传输三段时间的理解;一类题是给定一个待处理的I/O请求队列,让你用不同调度算法排出磁头移动序列并计算寻道总量;还有一类是存储容量计算,检验你对磁头数、柱面数、扇区数这些硬件参数之间关系的掌握。三类题逻辑上层层递进,课堂上那些“懂了”的感觉,落到笔头上很容易露馅。

2. 拆开磁盘:核心概念与访问时间模型

2.1 磁道、扇区、柱面与容量计算

磁盘的物理结构经常被一句话带过,但小测里的计算题全靠它。一个机械硬盘由若干盘片组成,每个盘片上下两面都能存储数据,每一面有一个磁头。盘面上被划分成一圈一圈的同心圆,每一圈叫一个磁道;磁道又被等分成若干个扇区,扇区是磁盘读写的最小单位,常见大小是512字节或4KB。

柱面这个概念最容易和磁道混淆。所有盘面上半径相同的磁道,在竖直方向上组成一个圆柱面。寻道操作移动的是整个磁头臂,所有磁头同时移动到同一个柱面位置,所以操作系统在给磁盘编址的时候,用的不是“盘面+磁道”,而是“柱面号+磁头号+扇区号”三元组。这一点理解了,后面看地址转换逻辑就顺了。

容量计算的公式其实不需要死记,按物理关系推就行:

容量 = 磁头数 × 每面磁道数 × 每道扇区数 × 每扇区字节数

这里的磁头数就是可用的盘面数,每面磁道数就是最内圈到最外圈的磁道数量。小测时最容易出错的是单位换算:硬盘厂商喜欢用十进制(1GB = 10^9B),操作系统内用二进制(1GB = 2^30B),混用就会得到“标称容量偏大”的经典现象。

提示:算容量时先把扇区总数算出来,再统一换算成KB/MB/GB,最后注明是二进制还是十进制,写清楚就不会因为单位丢分。

2.2 一次磁盘访问到底花多少时间

这是小测里必考的计算模型。一次完整的磁盘读或写,时间分成三段:

第一部分是寻道时间,也就是磁头臂从当前柱面移动到目标柱面所需的时间。这个时间取决于移过的磁道数,机械结构决定了它不能无限快,典型值在几毫秒到十几毫秒。

第二部分是旋转延迟,磁头已经定位到目标磁道后,还要等目标扇区旋转到磁头下方。磁盘每转一圈的时间T = 60s ÷ 转速RPM,平均旋转延迟通常取半圈,也就是T/2。比如7200转的磁盘,每转8.33ms,平均旋转延迟约4.17ms。

第三部分是传输时间,目标扇区经过磁头下方时实际读写数据的时间。传输时间 = 数据量 ÷ 磁盘传输速率,或者用“数据量 ÷(每道字节数×转速)”来算。

三者相加就是磁盘访问时间。这里有个很多同学会忽略的点:寻道时间和旋转延迟其实是“并行优化”的对象,但在单次访问计算里就是简单相加。真正值得思考的是,既然旋转延迟占了这么大比例,那么把同一柱面、相邻扇区的数据连续排布,就比逻辑上分散排布快得多,这也是文件系统做块分配时的优化动机。

2.3 调度算法图谱:FCFS、SSTF、SCAN、C-SCAN

磁盘I/O请求到达的顺序是随机的,磁头如果按到达顺序一个个服务,就跑冤枉路。所以操作系统需要调度算法来重排服务顺序。这次小测重点考四个:

FCFS先来先服务最简单,按请求到达顺序逐个处理。好处是公平、实现简单,坏处是磁头移动路径完全取决于请求分布,最坏情况下等于在磁盘上随机乱跑。

SSTF最短寻道时间优先,每次都选离当前磁头位置最近的请求。它能显著降低平均寻道时间,但问题是可能造成“饥饿”,远处的请求可能长期等不到服务。

SCAN又叫电梯算法,磁头保持一个方向移动,沿途服务所有请求,到最内或最外边界才回头。它兼顾了效率和公平,但边界的请求等待时间会比较长,因为磁头到头才转弯。

C-SCAN循环扫描是SCAN的变体,磁头只单向服务,到达边界后直接快速移回另一端起点,中间不服务任何请求。这样回程很快,各柱面的等待时间更均匀。

小测里经常让比较这四种算法的寻道总量,但更深一层的问题是:为什么现代系统不只用SSTF?因为真实系统里请求还带着优先级、超时时间,公平性有时比平均性能更重要。电梯算法之所以经典,就是因为它好实现、有界等待、性能也够用。

3. 一道经典调度题全程手算

3.1 题目与初始条件

为了还原课堂小测的感觉,我把当时的题目原样写出来。假设某磁盘共有200个柱面,编号0到199。当前磁头位于100号磁道,正在向磁道号增大的方向移动。磁盘I/O请求队列里等待服务的磁道号依次是:

98, 183, 37, 122, 14, 124, 65, 67

题目要求分别用FCFS、SSTF、SCAN、C-SCAN四种调度算法,计算磁头的移动序列和总寻道长度,并比较结果。我先把四个队列的顺序和计算过程完整走一遍,你会发现手算的时候每一步都得想清楚“当前磁头在哪、下一步去哪”。

3.2 四种算法的完整推演

FCFS最直接,按照请求到达顺序依次服务:

100 → 98 → 183 → 37 → 122 → 14 → 124 → 65 → 67

逐段计算寻道距离:

|100-98|=2 |98-183|=85 |183-37|=146 |37-122|=85 |122-14|=108 |14-124|=110 |124-65|=59 |65-67|=2

总寻道长度 = 2+85+146+85+108+110+59+2 = 597

这个数字直观反映出FCFS的问题:磁头在183和37之间来回大跨越,完全是“跟着感觉走”。

SSTF每次选当前最近的请求。从100出发,98距离2,122距离22,所以先到98。到了98后,最近的变成122距离24,比65的距离33更近,于是去122。继续看,124距离2,65距离57,所以到124。之后依次是67(距离57还是65的59?这里67更近)、65、37、14、183。移动序列和距离如下:

100 → 98(2)→ 122(24)→ 124(2)→ 67(57)→ 65(2)→ 37(28)→ 14(23)→ 183(169)

总寻道长度 = 2+24+2+57+2+28+23+169 = 307

SSTF明显比FCFS好,但最后的183就是那个“饿肚子”的远端请求:前面因为它离得远一直不被选,最后不得不一次性大跨越回内层。

SCAN从100出发,当前移动方向是增大,所以先服务所有大于100的请求:122、124、183。按单向移动直到最内边界199,然后掉头向减小方向移动,依次服务67、65、37、14。移动序列:

100 → 122 → 124 → 183 → 199 → 67 → 65 → 37 → 14

距离计算:

22 + 2 + 59 + 16 + 132 + 2 + 28 + 23 = 284

注意从183到199是为了“扫到边界再回头”,这是SCAN的标准定义。也有的教材允许到达最远请求后就回头,即183直接转向67,那样总寻道长度是252。两种口径考试里都可能出现,关键是看清题目说的是“到端点”还是“到最远请求”。

C-SCAN在SCAN基础上只单向服务。从100方向增大,服务122、124、183后继续到199,然后直接回到0(这段快速回程不服务),再从0向外服务14、37、65、67。移动序列:

100 → 122 → 124 → 183 → 199 → 0 → 14 → 37 → 65 → 67

距离计算:

22 + 2 + 59 + 16 + 199 + 14 + 23 + 28 + 2 = 365

C-SCAN的总寻道长度比SCAN多,但它的回程不服务请求,因此各磁道的等待时间更均匀。课堂讨论时我们专门对比过:SCAN类似电梯来回送人,C-SCAN则像环形班车,单向送完快速返回再重新发车。

3.3 结果对比与课堂讨论

四种算法算完,列个表比较直观:

算法磁头移动序列总寻道长度
FCFS100→98→183→37→122→14→124→65→67597
SSTF100→98→122→124→67→65→37→14→183307
SCAN100→122→124→183→199→67→65→37→14284(或252)
C-SCAN100→122→124→183→199→0→14→37→65→67365

表面上SCAN在总寻道长度上最优,但小测里老师追问了一句:如果请求队列里不断有新的远距离请求到来,哪种算法能保证每个请求都有机会被服务?SSTF就不行,它容易被局部近邻请求拖住;SCAN和C-SCAN有明确的方向和边界,因此无饥饿。这就是为什么电梯算法至今仍是教科书主角的原因。

另外,这里还有一个容易忽略的细节:以上的计算只算了寻道距离。真实系统里一次完整I/O还包含旋转延迟和传输时间,而在计算寻道总长度时,这段“后端处理”并不计入。考试时如果不写清楚“本题忽略旋转延迟”,过程可能被扣分。

4. 小测现场最容易踩的5个坑

小测之后我统计了一下大家的失分点,集中在这几个地方,提前避开能省很多冤枉分。

第一个坑是柱面号从0还是从1开始。题目只要写了“编号0到199”,计算时就不能再用200还是199的数数出错。SCAN从100向增大方向走,到199是边界,别默认成200。

第二个坑是把柱面号、磁头号、扇区号的顺序搞反。磁盘地址三元组是(柱面号,磁头号,扇区号),不是(磁道号,盘面,扇区)。到文件系统里做逻辑块到物理块的映射时,顺序变化会导致完全不同的计算结果。

第三个坑是平均旋转延迟。转速7200RPM时,每转8.33ms,平均延迟是4.17ms。有同学直接写8.33ms,那是在算“最坏延迟”,不是平均延迟。考试里除非特别说明,默认取半圈。

第四个坑是SCAN和C-SCAN的转向条件。SCAN到“最内/最外柱面”转向,C-SCAN到边界后直接回另一端起点。如果你用了“到最远请求就回头”的简化版,建议在答案里写清楚自己的假设,这样即使和阅卷标准不同,过程分也能保住。

第五个坑是容量计算里单位混用。512B×扇区数算出的是裸容量,但MB、GB、TB的进位在操作系统里通常按2的幂次算。题目要求“保留整数GB”时,先用二进制算完再转换,别中途四舍五入。

我把这5个坑总结成一张自查表,考试前扫一眼:

易错点错误示范正确做法
柱面编号把199当边界再歪一格看清编号从0还是1开始
地址三元组磁道号放第一位柱面号、磁头号、扇区号
旋转延迟用整圈时间默认半圈
SCAN转向不写边界条件明确“到端点”或“到最远请求”
单位换算中途四舍五入先算整数再转换

5. 把课堂知识接到真实系统上

5.1 现代操作系统里的调度器早就不是教科书那套了

如果你以为Linux内核里就是跑个SCAN算法,那就想简单了。真实系统的I/O调度器面对的是bio请求、闪存介质、多队列并发,早就不拿“磁头位置”当唯一考量了。早期Linux有四种调度器:noop、deadline、anticipatory、cfq。CFQ按进程分组公平分配带宽,deadline给每个请求设截止时间,保证没有请求饿死,本质上是一种带时间约束的电梯算法。

到了多队列时代,内核又引入了blk-mq机制,不少SSD场景直接使用none调度器,也就是不做重排,因为SSD没有寻道时间,重排反而增加延迟。我在实际服务器上排查IO性能问题时,经常先把调度器确认一遍:老机械盘用deadline比较稳,NVMe SSD用none,虚拟机磁盘用noop或none效果更直接。这些细节在课堂小测里不会考,但学了磁盘调度再去看内核文档,理解速度完全不一样。

5.2 SSD给磁盘管理带来的颠覆

SSD没有磁头,没有寻道时间,也没有旋转延迟,看起来调度算法可以退休了。但SSD引入了新的问题:闪存的写入必须按块擦除,随机小块写入会产生写放大;磨损均衡算法要尽量让每个闪存单元擦写次数接近。所以现代SSD内部的FTL层会做大量重排,把逻辑块映射到物理块上,操作系统层面看到的“扇区”早已不是机械时代的物理扇区。

这也解释了为什么操作系统课程依然要教磁盘结构:没有机械硬盘做参照,你就很难理解为什么顺序写比随机写快这么多,为什么文件系统要有块组、分区对齐,为什么数据库要预分配日志文件。课堂小测里算的那几毫秒寻道时间,在真实系统里变成了几十微秒的随机读延迟差,但优化逻辑一脉相承。

如果以后你接触存储系统面试,大概率会碰到“设计一个磁盘调度策略”这种开放题。把FCFS、SSTF、SCAN、C-SCAN的优缺点讲清楚,再补上“请求优先级”“超时重试”“连续性提升”这几个维度,就已经超过大多数应试答案了。这也是小测之外最值得继续深入的方向。

最后说点我自己的体会。这次小测之后,我把磁盘管理的知识点重新整理了一遍:物理结构管容量,访问时间管性能,调度算法管排队策略,三者串起来才是完整的设备管理视角。后来再去翻Linux的I/O调度器,发现内核里那些参数本质上就是在课堂算法模型上加了权重和时限。所以别小看一道课堂小测的计算题,它只是打开真实存储系统的一把小钥匙。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询