Appearance
固态硬盘
2026 大纲 五(三)2 固态硬盘,补充说明点名两项:读写性能特性、磨损均衡。
没有磁头之后,上一节那套还成立吗
上一节整节都建立在一个前提上:移动磁头很贵。磁盘调度的全部意义就是少跑几个磁道。
SSD 把这个前提抽掉了——它没有磁头,也没有旋转,读任意一个位置的代价都一样。 于是上一节最重要的那个结论直接作废:磁盘调度算法在 SSD 上基本失效。
但换掉一个约束不等于没有约束,SSD 换来了三条它自己的、而且更别扭的物理限制:
写只能把 1 变成 0(把 0 改回 1 必须先擦除)、 擦除只能整块进行(一块含很多页)、 每块的擦除次数有限(几千到几万次,擦完就坏)。
三条合起来会导出一个很麻烦的后果:想改一页,得先擦掉它所在的整块, 而擦一次就消耗掉这块寿命的一份。如果老老实实原地改, 一个被频繁改写的位置几天就能把那一块擦废。
所以 SSD 内部必须垫一层软件——FTL(闪存转换层),它做的事一句话: 别原地改,换个地方写,再把逻辑地址重新指过去。
这一句推出后面全部内容:换地方写 ⇒ 旧位置成了垃圾 ⇒ 要垃圾回收 ⇒ 回收时要搬走块里还有效的页 ⇒ 实际写入量大于用户写入量(写入放大) ⇒ 而且得让各块被擦的次数尽量拉平 ⇒ 磨损均衡。
⚠️ 有一处要先立住:磨损均衡解决的是"分布"不是"总量"—— 它没法让擦除总次数变少,只能让它别集中在少数几块上。
一、FTL:为什么它非存在不可
假设没有 FTL,主机直接按物理页地址读写,会立刻撞上前两条约束:
要修改逻辑块 5 的内容 ⇒ 该页已经写过,不能覆盖 ⇒ 必须先擦除 ⇒ 擦除只能整块 ⇒ 得把同块内其余 255 个页的有效数据先读出来暂存 ⇒ 擦块 ⇒ 把 256 个页全部写回
结果:主机只想改 4 KB,闪存实际写了 1 MB。
FTL 的解法是换个地方写:把新数据写到一个已擦除的空闲页上,然后把"逻辑块 5"的映射改指向新页,旧页标记为无效。这样一次写就是一次写,不必读-改-擦-写。
| 映射粒度 | 映射表大小 | 写放大 | 说明 |
|---|---|---|---|
| 页级映射 | 最大 | 最小(任意页可写到任意空闲页) | 灵活但映射表放不进 SSD 的 DRAM |
| 块级映射 | 最小 | 最大(块内偏移固定) | 省内存但退化回读-改-擦-写 |
| 混合映射 | 中等 | 中等 | 大部分数据块级映射,另留少量"日志块"按页级映射接收随机写 |
二、写入放大与垃圾回收
WAF 越大,同样的主机写入量消耗掉的擦除次数越多,寿命越短。
FTL 采用"换个地方写"之后,无效页会不断堆积,必须由垃圾回收 GC 收拾:① 挑一个无效页多、有效页少的块(搬运量最小);② 把该块中仍然有效的页搬到别的空闲页并更新映射表;③ 擦除这个块,使它重新成为空闲块。
GC、写入放大、磨损均衡是一条链,不是三个独立知识点
不能覆盖写 ⇒ FTL 换地方写 ⇒ 产生无效页 ⇒ 必须 GC ⇒ GC 要搬走有效页 ⇒ 搬运本身就是额外的写 ⇒ 写入放大 ⇒ 擦除次数被更快地消耗 ⇒ 磨损均衡才有意义
反过来也成立:GC 挑块的策略同时也是磨损均衡的一部分——若总挑同一批块回收,那批块就被擦穿了。所以实际的 FTL 会把"无效页数量"和"已擦除次数"一起纳入挑块的评分。
TRIM 补的是一个信息鸿沟:文件系统删除文件时通常只在目录和空闲空间管理结构里做标记,并不擦掉数据本身(外存空闲空间管理就是这么做的),SSD 无从知道那些页已作废,GC 时还会老老实实搬走。TRIM 命令让文件系统主动通知 SSD"这些逻辑块已经作废",SSD 直接把对应物理页标记为无效 ⇒ GC 搬运量下降 ⇒ 写入放大下降 ⇒ 寿命延长、随机写性能回升。代价是需文件系统、驱动、SSD 固件三方都支持,且 TRIM 过的数据不再可恢复。
三、磨损均衡
| 策略 | 做法 | 它解决了什么 | 它留下什么 |
|---|---|---|---|
| 动态磨损均衡 | 每次要写新数据时,从擦除次数最少的空闲块里挑 | 让正在被改写的数据轮流落在不同块上 | 冷数据霸占的块永远不进入轮换——那些块擦除次数一直很低,实际参与轮换的块变少,均衡是局部的 |
| 静态磨损均衡 | 主动把长期不变的冷数据搬到擦除次数多的块上,腾出擦除次数少的块给热数据 | 把冷数据占的低磨损块释放进轮换池,均衡覆盖全盘 | 搬运冷数据本身也是写入,会略微增加写入放大 |
一块盘寿命的量化走查:均衡与不均衡差 32 倍(想看清"分布问题"怎么变成算式时展开)
一块 256 GB 的 TLC SSD,块的擦除寿命 3000 次,写入放大系数 WAF = 4,某应用每天写入 50 GB。
① 理论总擦写量:
擦除寿命是按块计的,而"每块能擦 3000 次"对全盘每一块都成立,所以全盘能承受的闪存侧写入量就是"容量 × 寿命次数"。注意这是闪存侧的量,还不是主机能写的量。
② 计入写入放大后主机实际能写的量:
闪存被消耗掉的是"闪存侧写入量",而 WAF 描述的正是"闪存侧 ÷ 主机侧",所以主机侧可写量要除以 WAF,不是乘。
③ 若磨损完全均衡:
先把 TB 换成 GB(乘 1024)才能和"每天 50 GB"约掉单位。"完全均衡"在这里的含义是——全盘每一块的擦除次数同步增长,所以第 ① 步的总量可以一滴不剩地用完。
④ 若完全不做均衡,热点写入始终落在同一片 8 GB 区域上:这片区域能承受
分子换成了 8 GB 而不是 256 GB,这是全题的关键。不做均衡时被消耗的只有热点所在的那批块;剩下 248 GB 的块擦除次数还是个位数,却一次也帮不上忙——盘是被那 8 GB 拖死的,不是被容量用完拖死的。这正是"磨损均衡解决的是分布问题"这句话的算式形态。
⑤ 差距:
四、闪存类型与 SSD/HDD 对比
| 类型 | 每单元位数 | 擦除寿命 | 速度 | 单位容量成本 |
|---|---|---|---|---|
| SLC | 1 | 最长(~10 万次) | 最快 | 最贵 |
| MLC | 2 | 中(~1 万次) | 中 | 中 |
| TLC | 3 | 较短(~3000 次) | 较慢 | 较便宜 |
| QLC | 4 | 最短 | 最慢 | 最便宜 |
| 比较 | SSD | HDD | 判据/根因 |
|---|---|---|---|
| 存储介质 | 闪存(电子) | 磁介质(机械) | —— |
| 随机读 | 极快(无寻道/旋转) | 慢 | 有没有机械定位 |
| 顺序读 | 快 | 较快 | 差距远小于随机读 |
| 随机写 | 快,但受 GC/写放大拖累 | 慢 | 两者慢的机理不同 |
| 读写对称性 | 不对称(读 ≪ 写 ≪ 擦) | 基本对称 | 闪存的编程/擦除机理 |
| 覆盖写 | 不能,必须先擦块 | 能,直接改写磁化方向 | 闪存位只能 1→0 |
| 寿命 | 受擦写次数限制 | 受机械磨损限制 | —— |
| 抗震 / 噪音 | 好 / 无 | 差 / 有 | 有无运动部件 |
| 价格 | 较贵 | 便宜 | —— |
| 磁盘调度 | 不需要 | 需要(SCAN 等) | 有没有寻道时间可优化 |
五、换成 SSD 之后,OS 要跟着改什么
| 受影响的机制 | 原来针对 HDD 的做法 | 换成 SSD 之后 |
|---|---|---|
| 磁盘调度算法 | SSTF / SCAN / LOOK 重排请求以减少寻道 | 失效。没有寻道时间可省,重排换不来收益反而增加排序开销。实际系统改用最简单的"不排序"策略(Linux 里叫 noop / none),把调度交给 SSD 内部的 FTL |
| 文件的物理布局 | 尽量把一个文件的块放同一柱面、相邻柱面 | 不再重要(随机读≈顺序读);但顺序写仍然更好,因为能降低写放大 |
| 页面置换与写回策略 | 主要关心缺页率 | 还要关心写的次数:换出一个被修改过的页要写盘,SSD 上写的代价与寿命成本都远高于读,所以更倾向优先淘汰未修改页(改进型 CLOCK 算法把修改位纳入考虑,在 SSD 上收益更大) |
| 删除文件 | 只改目录与空闲空间管理结构 | 还应发 TRIM,否则 SSD 会一直搬运早已作废的数据 |
| 交换分区 / 频繁刷盘的日志 | 无特殊考虑 | 属高写入负载,会加速磨损,需要评估写入量 |
考点速记
- 三条物理约束:写只能把 1 变成 0(改回去必须先擦)、擦除只能整块进行、每块擦除次数有限。加上"页读写、块擦除"这个粒度不对等,推出 FTL 的存在理由。
- FTL 的核心做法一句话:别原地改,换个地方写,再把逻辑地址重新指过去。 由此推出整条因果链——换地方写 ⇒ 旧位置成垃圾 ⇒ 垃圾回收 ⇒ 回收要搬走有效页 ⇒ 写入放大(实际写入量 > 用户写入量)⇒ 各块擦除次数要拉平 ⇒ 磨损均衡。
- 读写性能三条特性:读 ≪ 写 ≪ 擦的不对称;随机 ≈ 顺序只对读成立(写因为要 GC 仍受影响);带宽靠多通道多 Die 并行堆出来。
- ⚠️磨损均衡解决的是"分布"不是"总量":它没法减少擦除总次数,只能让它别集中在少数几块。动态磨损均衡管新写入落到哪,静态磨损均衡管把冷数据搬走、腾出那些擦得少的块。
- ⚠️磨损均衡由 SSD 控制器的 FTL 实现,不是文件系统的职责(对照 文件系统的全局结构速记第七条:跟具体硬件有关的事不归文件系统)。
- ⚠️换成 SSD 后磁盘调度算法基本失效——它优化的是寻道,而 SSD 没有磁头。但公平性与优先级仲裁仍然需要,所以 I/O 调度层并没有整个消失。
- SSD 相对 HDD 的对照:无机械部件故抗震、静音、功耗低、随机读快;代价是有擦写寿命上限、写放大、掉电时映射表可能不一致。
这一节在真题里被考过的形式:
SSD 至今不单独成题,本页下方的练习区渲染的是整个 disk-scheduling 标签下的题, 它们全部是磁盘调度题,在磁盘结构与调度讲,范围比本节宽,属正常。
不单独成题不等于不考。SSD 在真题里以对照项的身份出现,而且近年在增加:
- 作为"这件事归谁做"的错项(os-2025-32,在文件系统的全局结构讲)。 问"文件系统能为温彻斯特硬盘和固态硬盘都提供的功能","实现均衡磨损"是错项—— 它由 SSD 控制器的 FTL 负责,而且机械盘根本不需要(速记第五条)。 同题的"降低寻道时间"也是错项,因为 SSD 没有寻道(速记第六条)。
- 作为文件系统与块大小相关判断的背景(os-2025-32 的正确项"确定盘块大小", 正是因为它与硬件类型无关)。
复习优先级:读懂即可,重点只有两条——均衡磨损归 SSD 控制器不归文件系统、 SSD 没有寻道所以磁盘调度失效。这两条在 2025-32 里各出现过一次。 FTL、写入放大、垃圾回收这条因果链理解一遍就行,至今没有考过计算。
易错:认为均衡磨损是文件系统或操作系统的功能。由 SSD 控制器的 FTL 实现,机械盘也不需要它。
易错:认为磁盘调度算法在 SSD 上同样有效。它优化的是寻道,SSD 没有磁头——但公平性与优先级仲裁仍需要。
易错:认为磨损均衡能延长总的可擦写次数。它只改变分布,不改变总量。
易错:认为 SSD 的随机写和顺序写一样快。随机 ≈ 顺序只对读成立,写要受垃圾回收拖累。
易错:认为 SSD 可以原地修改一页。写只能 1→0,要改必须先擦除整块——这正是 FTL 存在的理由。
相关知识
磁盘结构与调度|设备的基本概念与分类|页面置换算法|外存空闲空间管理