磁盘与固态硬盘:调度与寿命

本篇对应王道第五章收尾(原 19 篇)。文件都躺在磁盘上,前面所有管理最终都要落到磁盘读写——磁盘调度算法是本章的核心,SSD 是新贵。

一、磁盘的结构

磁盘是表面涂有磁性物质的物理盘片,通过磁头(导体线圈)存取数据:读写期间磁头固定,磁盘高速旋转

image-cad0621b

结构自上而下:

  • 磁道:盘面上的同心圆,一个盘面有上千个磁道(与磁头一样宽)
  • 扇区:磁道划分出的固定大小片段(如 1KB),一个扇区 = 一个盘块,扇区是磁盘可寻址的最小单位
  • 注意:扇区按固定圆心角划分,所以密度从最外道向里道增加,存储能力受限于最内道的最大记录密度。现代磁盘用环带划分(同一环带内扇区数相同,外环带磁道扇区更多),充分利用外层容量
image-818843c6

多个盘片垂直堆叠成磁盘组,每个盘面对应一个磁头,所有磁头共进退(与盘心距离相同)。所有盘面上相对位置相同的磁道组成柱面。磁盘地址用三元组表示:

磁盘地址 = 柱面号 · 盘面号 · 扇区号

分类:磁头径向固定的固定头磁盘(每磁道一个磁头)/ 磁头臂可伸缩的活动头磁盘(主流);盘片固定的固定盘磁盘 / 可更换的可换盘磁盘

操作系统的规律:几乎每介绍一类资源的管理,都要涉及一类调度算法。多个请求同时到达,先服务谁——这就是磁盘调度要解决的问题。

二、磁盘的管理

  • 低级格式化(物理格式化):把空白盘分成扇区(头部 + 数据区 + 尾部,头部尾部存磁道号/磁头号/扇区号和 CRC 校验)。通常出厂时就做好了
  • 分区:把磁盘分成 C 盘 D 盘……每个分区由一个或多个柱面组成,起始扇区和大小记录在 MBR 的分区表
  • 逻辑格式化(高级格式化):初始化文件系统数据结构——空闲空间/已分配空间信息、初始为空的根目录
  • 簇(Linux 叫块):扇区太小,把相邻扇区组合成簇管理;一簇只能放一个文件的内容,文件按簇的整数倍占空间——半簇也占一簇(内部碎片的来源)
  • 引导块:自举程序通常在 ROM,但为避免改 ROM 硬件,ROM 里只留很小的自举装入程序,完整引导程序放磁盘的启动块(固定位置)。有启动分区的磁盘 = 启动磁盘/系统磁盘
  • 坏块:磁盘有移动部件、容错能力弱,容易坏。简单磁盘(IDE)手动处理——Format 扫描标记进 FAT 表,程序不再使用;复杂磁盘由控制器维护坏块列表,低级格式化时保留备用块,用扇区备用逻辑替代坏块(OS 看不到)。坏块处理的实质:用某种机制让系统不去使用坏块

Windows 引导过程(呼应引导那章):ROM 代码 → 读 MBR(含引导代码 + 分区表 + 引导标志)→ 找到引导分区 → 读分区第一扇区(引导扇区)→ 加载系统服务。

image-2c53b86a

三、磁盘存取时间:找才是大头

一次磁盘读/写的时间 = 寻道时间 + 旋转延迟 + 传输时间

时间 公式 说明
寻道时间 Ts Ts = m×n + s 磁头移到目的磁道:跨越 n 条磁道(m≈0.2ms/道)+ 启动磁头臂(s≈2ms)
旋转延迟 Tr Tr = 1/(2r) 磁头定位到目标扇区,平均转半圈。5400 转/分 → Tr≈5.55ms
传输时间 Tt Tt = b/(rN) 读/写 b 字节,r 为转数,N 为每磁道字节数

总时间 Ta = Ts + 1/(2r) + b/(rN)。

关键认识:寻道时间占大头,与调度算法直接相关;旋转延迟和传输时间都由转速决定——转速是硬件参数,OS 优化不了。所以磁盘调度的主要目标就是减少平均寻道时间

💡 后文凡"找"的时间(寻道、延迟)都能优化;传输时间是磁盘本身性质,优化不了。

四、磁盘调度算法(必考计算)

例题贯穿:请求队列 55, 58, 39, 18, 90, 160, 150, 38, 184,磁头初始在 100 号磁道。

FCFS:先来先服务

按请求到达顺序服务。公平,但请求多时性能接近随机调度。

image-55f5c9f6

路径:100→55→58→39→18→90→160→150→38→184,共移动 498 道,平均寻道长度 498/9 ≈ 55.3

SSTF:最短寻道时间优先

每次选离当前磁头最近的请求。贪心——每次局部最优不保证全局最优,但比 FCFS 好。会产生饥饿:18 号磁道附近若频繁来新请求,磁头就在附近来回打转,184 号长期得不到服务。

image-a4de1984

路径:100→90→58→55→39→38→18→160→150→184,共 248 道,平均 248/9 ≈ 27.5

SCAN:扫描(电梯调度)

SSTF 饥饿的根源是磁头可能在小范围来回。SCAN 规定:磁头只有移到最外(内)侧磁道才能回头——像电梯,上行途中只接上行的人,到顶才往下。

image-34afb759

假设沿磁道号增大的方向:100→150→160→184→200→90→58→55→39→38→18,共 282 道,平均 ≈ 31.33

缺点:对最近扫过的区域不公平(刚扫过的地方要等它跑完全程才回来)。

C-SCAN:循环扫描

SCAN 的改进:磁头单向提供服务,从一端到另一端后直接快速返回起点,返回途中不服务——各磁道的等待时间更均匀。

image-db2e047e

100→150→160→184→200→0→18→38→39→55→58→90,共 390 道,平均 ≈ 43.33(返程空跑 200 道,代价换来公平)。

LOOK / C-LOOK

SCAN 和 C-SCAN 都要严格走到盘面端点才回头,其实没必要——移动到最远端的一个请求即可返回,因为它们在移动前会"看一眼"(Look)还有没有请求。

image-5d9dd858

⚠️ 考试若无明显说明,默认 SCAN/C-SCAN 就是 LOOK/C-LOOK(不必到端点)。

四种算法对比:

image-58e0b431
算法 优点 缺点
FCFS 公平 平均寻道长度大,性能差
SSTF 性能比 FCFS 好 饥饿;来回移动
SCAN(LOOK) 寻道性能好、避免饥饿 对最近扫过区域不公平
C-SCAN(C-LOOK) 各磁道等待时间均匀 返程空跑

五、减少旋转延迟的方法

读完一个扇区要短暂处理,不能立即读下一个相邻扇区——若逻辑相邻的块物理也相邻,读连续逻辑块就得等磁盘转一圈。

  • 交替编号:让逻辑相邻的块物理上隔开一段,处理时间刚好落在间隔里,读连续块不用等整圈
  • 错位命名:所有盘面同步旋转,相邻盘面的连续块(0 号盘 7 号扇区读完 → 1 号盘 0 号扇区)之间同样有处理时间——把不同盘面的扇区编号错开,磁头切换盘面时刚好接上
image-c60d75ae image-d0a649c1

六、提高磁盘 I/O 速度的若干方法

文件访问速度是文件系统性能最重要的指标,三条路:改进目录结构与检索方法;选取好的文件存储结构;提高磁盘 IO 速度。后者包括:

  1. 磁盘高速缓存(内存暂存盘块信息)
  2. 调整磁盘请求顺序(上面的调度算法)
  3. 提前读:读当前块时把下一块也读进缓冲(局部性)
  4. 延迟写:缓冲区只标"延迟写"标志就挂到空闲链尾,等别的进程申请到它才真正写盘——可能直接被复用,连写都省了
  5. 优化物理块分布:同一文件的盘块尽量放同一磁道或相邻磁道;按簇分配
  6. 虚拟盘(RAM 盘):用内存仿真磁盘,放临时文件
  7. RAID:并行交叉存取,大幅提速

七、固态硬盘 SSD

特性

基于闪存技术的存储器,与 U 盘无本质差别(容量更大、性能更好)。组成:闪存芯片 + 闪存翻译层——翻译层把 CPU 的逻辑块读写请求翻译成对底层物理设备的控制信号,扮演磁盘控制器的角色

image-2f664f61

组织结构:闪存由 B 个块组成,每块由 P 个页组成(页 512B~4KB,块 16KB~512KB)。读写规则:

  • 数据以为单位读写
  • 只有一页所属的块整个被擦除后,才能写这一页;擦除后块内每页可直接再写一次
  • 重复写若干次后块会磨损报废

随机写很慢的两个原因:

  1. 擦除块比较慢(比访问页慢一个数量级)
  2. 修改已有数据的页 Pi 时,同块所有含有效数据的页都要先复制到新(擦除过的)块,然后才能写 Pi

相比机械硬盘:无移动部件 → 随机访问快、无噪声震动、能耗低、抗震、安全性好,价格不断下降,有望逐步取代机械硬盘。

磨损均衡(Wear Leveling)

闪存的擦写寿命有限(几百到几千次)。若读写集中在部分闪存上,这部分先磨损坏——一块 256GB 的 SSD 可能因几兆空间的闪存损坏而整块报废

两种均衡技术:

  • 动态磨损均衡:写入时自动选较新的闪存块,老块先歇一歇
  • 静态磨损均衡(更先进):没有写入时也自动做数据搬运——老闪存块承担无须写数据的存储任务(只读数据搬过去),新块腾出来干读写

效果算一笔账:256GB SSD、擦写寿命 500 次 → 需写入 125TB 数据才寿终正寝;就算每天写 10GB 也要三十多年——磨损均衡让 SSD 寿命足够可观。

八、盲点总复习

  1. 磁盘地址三元组:柱面号 · 盘面号 · 扇区号;扇区是可寻址最小单位;所有磁头共进退
  2. 磁盘调度优化的是寻道时间(占大头);旋转延迟和传输时间由转速决定,OS 管不了
  3. SSTF 贪心会饥饿;SCAN 用"到端点才回头"治饥饿,但对刚扫过区域不公平;C-SCAN 单向服务最均匀;LOOK 不必到端点(考试默认 SCAN=LOOK)
  4. 计算题套路:画磁道移动路径 → 相邻差值累加 = 移动道数 → ÷ 请求数 = 平均寻道长度
  5. 交替编号(同盘面逻辑块物理隔开)和错位命名(相邻盘面编号错开)都是为了消化读扇区后的处理时间
  6. 延迟写的精髓:缓冲区挂空闲链尾可能被直接复用,写盘操作可能整个省掉
  7. SSD 以为读写单位、以为擦除单位;随机写慢 = 擦除慢 + 改一页要复制整块有效页
  8. 磨损均衡:动态(写入时选新块)vs 静态(没写入也搬运,让老块只读不写)

至此操作系统四大管理全部讲完。回到总览看看全景 → 00-操作系统总览

⬅️ 🏠 00-操作系统总览 ➡️ 00-操作系统总览(全系列完结)