--- title: "09-磁盘与固态硬盘:调度与寿命" aliases: - 磁盘与固态硬盘 created: 2026-08-29 tags: - 基础与理论 - 操作系统 - "408" --- # 磁盘与固态硬盘:调度与寿命 > 本篇对应王道第五章收尾(原 19 篇)。文件都躺在磁盘上,前面所有管理最终都要落到磁盘读写——**磁盘调度算法**是本章的核心,SSD 是新贵。 ## 一、磁盘的结构 磁盘是表面涂有磁性物质的物理盘片,通过**磁头**(导体线圈)存取数据:读写期间磁头固定,**磁盘高速旋转**。 ![[image-cad0621b.png]] 结构自上而下: - **磁道**:盘面上的同心圆,一个盘面有上千个磁道(与磁头一样宽) - **扇区**:磁道划分出的固定大小片段(如 1KB),**一个扇区 = 一个盘块**,扇区是磁盘**可寻址的最小单位** - 注意:扇区按固定圆心角划分,所以**密度从最外道向里道增加**,存储能力受限于最内道的最大记录密度。现代磁盘用**环带**划分(同一环带内扇区数相同,外环带磁道扇区更多),充分利用外层容量 ![[image-818843c6.png]] 多个盘片垂直堆叠成磁盘组,每个盘面对应一个磁头,所有磁头**共进退**(与盘心距离相同)。**所有盘面上相对位置相同的磁道组成柱面**。磁盘地址用三元组表示: > **磁盘地址 = 柱面号 · 盘面号 · 扇区号** 分类:磁头径向固定的**固定头磁盘**(每磁道一个磁头)/ 磁头臂可伸缩的**活动头磁盘**(主流);盘片固定的**固定盘磁盘** / 可更换的**可换盘磁盘**。 **操作系统的规律**:几乎每介绍一类资源的管理,都要涉及一类**调度算法**。多个请求同时到达,先服务谁——这就是磁盘调度要解决的问题。 ## 二、磁盘的管理 - **低级格式化(物理格式化)**:把空白盘分成扇区(头部 + 数据区 + 尾部,头部尾部存磁道号/磁头号/扇区号和 CRC 校验)。通常出厂时就做好了 - **分区**:把磁盘分成 C 盘 D 盘……每个分区由一个或多个柱面组成,起始扇区和大小记录在 **MBR 的分区表**中 - **逻辑格式化(高级格式化)**:初始化文件系统数据结构——空闲空间/已分配空间信息、初始为空的根目录 - **簇(Linux 叫块)**:扇区太小,把相邻扇区组合成簇管理;**一簇只能放一个文件的内容**,文件按簇的整数倍占空间——半簇也占一簇(内部碎片的来源) - **引导块**:自举程序通常在 ROM,但为避免改 ROM 硬件,ROM 里只留很小的自举装入程序,**完整引导程序放磁盘的启动块**(固定位置)。有启动分区的磁盘 = 启动磁盘/系统磁盘 - **坏块**:磁盘有移动部件、容错能力弱,容易坏。简单磁盘(IDE)手动处理——Format 扫描标记进 **FAT 表**,程序不再使用;复杂磁盘由**控制器维护坏块列表**,低级格式化时保留备用块,用**扇区备用**逻辑替代坏块(OS 看不到)。**坏块处理的实质:用某种机制让系统不去使用坏块** **Windows 引导过程**(呼应引导那章):ROM 代码 → 读 MBR(含引导代码 + 分区表 + 引导标志)→ 找到引导分区 → 读分区第一扇区(引导扇区)→ 加载系统服务。 ![[image-2c53b86a.png]] ## 三、磁盘存取时间:找才是大头 一次磁盘读/写的时间 = **寻道时间 + 旋转延迟 + 传输时间**: | 时间 | 公式 | 说明 | | --- | --- | --- | | **寻道时间 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.png]] 路径:100→55→58→39→18→90→160→150→38→184,共移动 **498** 道,平均寻道长度 498/9 ≈ **55.3**。 ### SSTF:最短寻道时间优先 每次选**离当前磁头最近**的请求。贪心——每次局部最优不保证全局最优,但比 FCFS 好。**会产生饥饿**:18 号磁道附近若频繁来新请求,磁头就在附近来回打转,184 号长期得不到服务。 ![[image-a4de1984.png]] 路径:100→90→58→55→39→38→18→160→150→184,共 **248** 道,平均 248/9 ≈ **27.5**。 ### SCAN:扫描(电梯调度) SSTF 饥饿的根源是磁头可能在小范围来回。SCAN 规定:**磁头只有移到最外(内)侧磁道才能回头**——像电梯,上行途中只接上行的人,到顶才往下。 ![[image-34afb759.png]] 假设沿磁道号增大的方向:100→150→160→184→**200**→90→58→55→39→38→18,共 **282** 道,平均 ≈ **31.33**。 缺点:对**最近扫过的区域不公平**(刚扫过的地方要等它跑完全程才回来)。 ### C-SCAN:循环扫描 SCAN 的改进:磁头**单向**提供服务,从一端到另一端后**直接快速返回起点**,返回途中不服务——各磁道的等待时间更均匀。 ![[image-db2e047e.png]] 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.png]] > ⚠️ 考试若无明显说明,**默认 SCAN/C-SCAN 就是 LOOK/C-LOOK**(不必到端点)。 四种算法对比: ![[image-58e0b431.png]] | 算法 | 优点 | 缺点 | | --- | --- | --- | | FCFS | 公平 | 平均寻道长度大,性能差 | | SSTF | 性能比 FCFS 好 | **饥饿**;来回移动 | | SCAN(LOOK) | 寻道性能好、避免饥饿 | 对最近扫过区域不公平 | | C-SCAN(C-LOOK) | 各磁道等待时间均匀 | 返程空跑 | ## 五、减少旋转延迟的方法 读完一个扇区要短暂处理,**不能立即读下一个相邻扇区**——若逻辑相邻的块物理也相邻,读连续逻辑块就得等磁盘转一圈。 - **交替编号**:让逻辑相邻的块**物理上隔开一段**,处理时间刚好落在间隔里,读连续块不用等整圈 - **错位命名**:所有盘面同步旋转,相邻盘面的连续块(0 号盘 7 号扇区读完 → 1 号盘 0 号扇区)之间同样有处理时间——把不同盘面的扇区编号**错开**,磁头切换盘面时刚好接上 ![[image-c60d75ae.png]] ![[image-d0a649c1.png]] ## 六、提高磁盘 I/O 速度的若干方法 文件访问速度是文件系统性能最重要的指标,三条路:改进目录结构与检索方法;选取好的文件存储结构;提高磁盘 IO 速度。后者包括: 1. **磁盘高速缓存**(内存暂存盘块信息) 2. **调整磁盘请求顺序**(上面的调度算法) 3. **提前读**:读当前块时把下一块也读进缓冲(局部性) 4. **延迟写**:缓冲区只标"延迟写"标志就挂到空闲链尾,等**别的进程申请到它**才真正写盘——可能直接被复用,连写都省了 5. **优化物理块分布**:同一文件的盘块尽量放同一磁道或相邻磁道;按簇分配 6. **虚拟盘(RAM 盘)**:用内存仿真磁盘,放临时文件 7. **RAID**:并行交叉存取,大幅提速 ## 七、固态硬盘 SSD ### 特性 基于**闪存技术**的存储器,与 U 盘无本质差别(容量更大、性能更好)。组成:**闪存芯片 + 闪存翻译层**——翻译层把 CPU 的逻辑块读写请求翻译成对底层物理设备的控制信号,**扮演磁盘控制器的角色**。 ![[image-2f664f61.png]] 组织结构:闪存由 **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-操作系统总览]](全系列完结)