磁盘与固态硬盘:调度与寿命
本篇对应王道第五章收尾(原 19 篇)。文件都躺在磁盘上,前面所有管理最终都要落到磁盘读写——磁盘调度算法是本章的核心,SSD 是新贵。
一、磁盘的结构
磁盘是表面涂有磁性物质的物理盘片,通过磁头(导体线圈)存取数据:读写期间磁头固定,磁盘高速旋转。
结构自上而下:
- 磁道:盘面上的同心圆,一个盘面有上千个磁道(与磁头一样宽)
- 扇区:磁道划分出的固定大小片段(如 1KB),一个扇区 = 一个盘块,扇区是磁盘可寻址的最小单位
- 注意:扇区按固定圆心角划分,所以密度从最外道向里道增加,存储能力受限于最内道的最大记录密度。现代磁盘用环带划分(同一环带内扇区数相同,外环带磁道扇区更多),充分利用外层容量
多个盘片垂直堆叠成磁盘组,每个盘面对应一个磁头,所有磁头共进退(与盘心距离相同)。所有盘面上相对位置相同的磁道组成柱面。磁盘地址用三元组表示:
磁盘地址 = 柱面号 · 盘面号 · 扇区号
分类:磁头径向固定的固定头磁盘(每磁道一个磁头)/ 磁头臂可伸缩的活动头磁盘(主流);盘片固定的固定盘磁盘 / 可更换的可换盘磁盘。
操作系统的规律:几乎每介绍一类资源的管理,都要涉及一类调度算法。多个请求同时到达,先服务谁——这就是磁盘调度要解决的问题。
二、磁盘的管理
- 低级格式化(物理格式化):把空白盘分成扇区(头部 + 数据区 + 尾部,头部尾部存磁道号/磁头号/扇区号和 CRC 校验)。通常出厂时就做好了
- 分区:把磁盘分成 C 盘 D 盘……每个分区由一个或多个柱面组成,起始扇区和大小记录在 MBR 的分区表中
- 逻辑格式化(高级格式化):初始化文件系统数据结构——空闲空间/已分配空间信息、初始为空的根目录
- 簇(Linux 叫块):扇区太小,把相邻扇区组合成簇管理;一簇只能放一个文件的内容,文件按簇的整数倍占空间——半簇也占一簇(内部碎片的来源)
- 引导块:自举程序通常在 ROM,但为避免改 ROM 硬件,ROM 里只留很小的自举装入程序,完整引导程序放磁盘的启动块(固定位置)。有启动分区的磁盘 = 启动磁盘/系统磁盘
- 坏块:磁盘有移动部件、容错能力弱,容易坏。简单磁盘(IDE)手动处理——Format 扫描标记进 FAT 表,程序不再使用;复杂磁盘由控制器维护坏块列表,低级格式化时保留备用块,用扇区备用逻辑替代坏块(OS 看不到)。坏块处理的实质:用某种机制让系统不去使用坏块
Windows 引导过程(呼应引导那章):ROM 代码 → 读 MBR(含引导代码 + 分区表 + 引导标志)→ 找到引导分区 → 读分区第一扇区(引导扇区)→ 加载系统服务。
三、磁盘存取时间:找才是大头
一次磁盘读/写的时间 = 寻道时间 + 旋转延迟 + 传输时间:
| 时间 | 公式 | 说明 |
|---|---|---|
| 寻道时间 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:先来先服务
按请求到达顺序服务。公平,但请求多时性能接近随机调度。
路径:100→55→58→39→18→90→160→150→38→184,共移动 498 道,平均寻道长度 498/9 ≈ 55.3。
SSTF:最短寻道时间优先
每次选离当前磁头最近的请求。贪心——每次局部最优不保证全局最优,但比 FCFS 好。会产生饥饿:18 号磁道附近若频繁来新请求,磁头就在附近来回打转,184 号长期得不到服务。
路径:100→90→58→55→39→38→18→160→150→184,共 248 道,平均 248/9 ≈ 27.5。
SCAN:扫描(电梯调度)
SSTF 饥饿的根源是磁头可能在小范围来回。SCAN 规定:磁头只有移到最外(内)侧磁道才能回头——像电梯,上行途中只接上行的人,到顶才往下。
假设沿磁道号增大的方向:100→150→160→184→200→90→58→55→39→38→18,共 282 道,平均 ≈ 31.33。
缺点:对最近扫过的区域不公平(刚扫过的地方要等它跑完全程才回来)。
C-SCAN:循环扫描
SCAN 的改进:磁头单向提供服务,从一端到另一端后直接快速返回起点,返回途中不服务——各磁道的等待时间更均匀。
100→150→160→184→200→0→18→38→39→55→58→90,共 390 道,平均 ≈ 43.33(返程空跑 200 道,代价换来公平)。
LOOK / C-LOOK
SCAN 和 C-SCAN 都要严格走到盘面端点才回头,其实没必要——移动到最远端的一个请求即可返回,因为它们在移动前会"看一眼"(Look)还有没有请求。
⚠️ 考试若无明显说明,默认 SCAN/C-SCAN 就是 LOOK/C-LOOK(不必到端点)。
四种算法对比:
| 算法 | 优点 | 缺点 |
|---|---|---|
| FCFS | 公平 | 平均寻道长度大,性能差 |
| SSTF | 性能比 FCFS 好 | 饥饿;来回移动 |
| SCAN(LOOK) | 寻道性能好、避免饥饿 | 对最近扫过区域不公平 |
| C-SCAN(C-LOOK) | 各磁道等待时间均匀 | 返程空跑 |
五、减少旋转延迟的方法
读完一个扇区要短暂处理,不能立即读下一个相邻扇区——若逻辑相邻的块物理也相邻,读连续逻辑块就得等磁盘转一圈。
- 交替编号:让逻辑相邻的块物理上隔开一段,处理时间刚好落在间隔里,读连续块不用等整圈
- 错位命名:所有盘面同步旋转,相邻盘面的连续块(0 号盘 7 号扇区读完 → 1 号盘 0 号扇区)之间同样有处理时间——把不同盘面的扇区编号错开,磁头切换盘面时刚好接上
六、提高磁盘 I/O 速度的若干方法
文件访问速度是文件系统性能最重要的指标,三条路:改进目录结构与检索方法;选取好的文件存储结构;提高磁盘 IO 速度。后者包括:
- 磁盘高速缓存(内存暂存盘块信息)
- 调整磁盘请求顺序(上面的调度算法)
- 提前读:读当前块时把下一块也读进缓冲(局部性)
- 延迟写:缓冲区只标"延迟写"标志就挂到空闲链尾,等别的进程申请到它才真正写盘——可能直接被复用,连写都省了
- 优化物理块分布:同一文件的盘块尽量放同一磁道或相邻磁道;按簇分配
- 虚拟盘(RAM 盘):用内存仿真磁盘,放临时文件
- RAID:并行交叉存取,大幅提速
七、固态硬盘 SSD
特性
基于闪存技术的存储器,与 U 盘无本质差别(容量更大、性能更好)。组成:闪存芯片 + 闪存翻译层——翻译层把 CPU 的逻辑块读写请求翻译成对底层物理设备的控制信号,扮演磁盘控制器的角色。
组织结构:闪存由 B 个块组成,每块由 P 个页组成(页 512B~4KB,块 16KB~512KB)。读写规则:
- 数据以页为单位读写
- 只有一页所属的块整个被擦除后,才能写这一页;擦除后块内每页可直接再写一次
- 重复写若干次后块会磨损报废
随机写很慢的两个原因:
- 擦除块比较慢(比访问页慢一个数量级)
- 修改已有数据的页 Pi 时,同块所有含有效数据的页都要先复制到新(擦除过的)块,然后才能写 Pi
相比机械硬盘:无移动部件 → 随机访问快、无噪声震动、能耗低、抗震、安全性好,价格不断下降,有望逐步取代机械硬盘。
磨损均衡(Wear Leveling)
闪存的擦写寿命有限(几百到几千次)。若读写集中在部分闪存上,这部分先磨损坏——一块 256GB 的 SSD 可能因几兆空间的闪存损坏而整块报废。
两种均衡技术:
- 动态磨损均衡:写入时自动选较新的闪存块,老块先歇一歇
- 静态磨损均衡(更先进):没有写入时也自动做数据搬运——老闪存块承担无须写数据的存储任务(只读数据搬过去),新块腾出来干读写
效果算一笔账:256GB SSD、擦写寿命 500 次 → 需写入 125TB 数据才寿终正寝;就算每天写 10GB 也要三十多年——磨损均衡让 SSD 寿命足够可观。
八、盲点总复习
- 磁盘地址三元组:柱面号 · 盘面号 · 扇区号;扇区是可寻址最小单位;所有磁头共进退
- 磁盘调度优化的是寻道时间(占大头);旋转延迟和传输时间由转速决定,OS 管不了
- SSTF 贪心会饥饿;SCAN 用"到端点才回头"治饥饿,但对刚扫过区域不公平;C-SCAN 单向服务最均匀;LOOK 不必到端点(考试默认 SCAN=LOOK)
- 计算题套路:画磁道移动路径 → 相邻差值累加 = 移动道数 → ÷ 请求数 = 平均寻道长度
- 交替编号(同盘面逻辑块物理隔开)和错位命名(相邻盘面编号错开)都是为了消化读扇区后的处理时间
- 延迟写的精髓:缓冲区挂空闲链尾可能被直接复用,写盘操作可能整个省掉
- SSD 以页为读写单位、以块为擦除单位;随机写慢 = 擦除慢 + 改一页要复制整块有效页
- 磨损均衡:动态(写入时选新块)vs 静态(没写入也搬运,让老块只读不写)
至此操作系统四大管理全部讲完。回到总览看看全景 → 00-操作系统总览
💬 评论