Flash 存储磨损均衡算法详解
核心问题:为什么需要磨损均衡?
要理解磨损均衡,得先明白 Flash 存储器(包括 NAND 和 NOR)的物理限制。
- 有限的擦写次数:Flash 单元在经历一定次数的擦除操作后,会因物理损耗而失效。这个次数就是耐久度。
- SLC NAND:约 10 万次
- MLC NAND:约 3 千至 1 万次
- TLC NAND:约 500 至 1.5 千次
- QLC NAND:约 100 至 500 次
- 擦除操作的特殊性:Flash 不能像 RAM 一样直接覆盖写入。它必须先进行擦除(通常按块进行),将整个块变为'1',然后才能编程(将需要的比特从'1'变为'0')。
问题场景:假设文件系统的元数据固定存储在同一个 Flash 物理块上。每次更新,这个块都需要被擦写一次。即使它能承受 1 万次擦写,在频繁写入的系统里,可能几周就会用尽寿命,导致设备提前报废,而其他大部分块还'全新未使用'。
目标:通过算法让所有 Flash 物理块的擦写次数均匀分布,避免某些'热点'区块过早损坏,从而将设备总寿命延长至理论最大值。
实现层次与核心思想
磨损均衡主要在**闪存转换层(FTL)**中实现。FTL 是介于文件系统(如 FAT32, ext4)和物理 Flash 芯片之间的固件层,负责地址转换、坏块管理、垃圾回收和磨损均衡。
其核心思想很简单:将文件系统看到的'逻辑地址'与 Flash 的'物理地址'分离开来,并动态改变它们之间的映射关系。
主要算法分类
主要分为两大类:动态磨损均衡 和 静态磨损均衡。
动态磨损均衡
这是最基本的形式。
- 原理:当需要写入新数据时,FTL 总是从空闲块池中选择擦除计数最小(即最年轻)的块来使用。
- 工作方式:
- FTL 维护空闲块列表,记录每个块的擦除次数。
- 有写入请求时,找出擦除次数最少的块。
- 写入数据,更新逻辑到物理的地址映射表。
- 该块移出空闲列表,擦除计数增加。
- 优点:实现简单,能有效防止新数据集中消耗少数几个块。
- 缺点:无法解决'冷数据'问题。如果一个数据写入后不再修改,它占用的物理块就不会再被擦写,磨损计数停滞。而频繁变动的热数据区块持续磨损,导致差异拉大。
静态磨损均衡
更高级的方法,也是现代 SSD 和 eMMC/UFS 的标准做法。
- 原理:不仅在选择空闲块时考虑磨损,还会主动将冷数据从低磨损块搬移到高磨损块中,让闲置的低磨损块也参与循环。
- 工作方式:
- 采用动态策略选择空闲块。
- 周期性地或在磨损差异超过阈值时启动数据迁移。
- FTL 寻找存放冷数据的低磨损块(Block A)和高磨损的空闲块(Block B)。
- 将 Block A 中的有效数据复制到 Block B。
- 更新地址映射表指向 Block B。
- 擦除 Block A 并放入空闲池。
- 优点:极大改善磨损均匀性,充分利用所有块寿命。
- 缺点:增加了写放大。复制冷数据产生额外写入,对用户来说是多余的,但为了均衡寿命又是必要的。
关键技术与关联概念
磨损均衡不是孤立工作的,它与 FTL 的其他机制紧密耦合。
垃圾回收
- Flash 中数据更新时,旧数据页标记为无效,新数据写入新空闲页。垃圾回收的任务就是回收包含无效数据的块。
- 过程:GC 选择脏块(含大量无效数据),将其中的有效数据复制到新空闲块,擦除脏块使其变为可用。
- 关联:选择哪个块进行垃圾回收时,融入磨损均衡策略。GC 不仅看无效页面数量,也会考虑磨损计数,优先回收低磨损块,让它们进入空闲池接受新磨损。
地址映射机制
- FTL 维护映射表,将逻辑地址映射到物理地址。数据更新时,FTL 不覆盖原物理地址,而是写入新空闲地址,更新映射表指向新位置。这称为异地更新。
- 这是实现磨损均衡的基础,正是这种'不覆盖'的特性,使得 FTL 能自由选择数据物理位置。
写放大
- 定义:用户实际写入的数据量与实际写入 Flash 的物理数据量之比。
- 关系:静态磨损均衡和垃圾回收都会显著增加写放大。因为它们在后台移动数据,产生额外写入。设计良好的算法需要在延长寿命和降低写放大之间取得平衡。
实际应用与例子
- 固态硬盘:内置复杂 FTL 固件,包含成熟的动态和静态磨损均衡算法,是 SSD 达到数年使用寿命的关键。
- U 盘和 SD/TF 卡:中高端具备此功能。廉价 U 盘可能没有或算法简单,寿命和稳定性较差。
- 嵌入式系统:基于 SPI Flash 的文件系统(如 LittleFS, SPIFFS)实现了轻量级磨损均衡,适应微控制器需求。
总结
| 特性 | 动态磨损均衡 | 静态磨损均衡 |
|---|---|---|
| 核心思想 | 将新数据写入最年轻的空闲块 | 除了动态策略,还主动迁移冷数据 |
| 复杂度 | 较低 | 较高 |
| 效果 | 较好 | 极佳,能充分利用所有块 |
| 写放大 | 较低 | 较高(因数据迁移) |
| 适用场景 | 对寿命要求不极致的低成本设备 | 高端、高可靠性存储设备(如 SSD) |
总而言之,磨损均衡是一种通过智能地管理数据物理存放位置,确保 Flash 每个物理区块磨损程度尽可能均匀,从而最大化整个设备使用寿命的算法。它是现代大容量、高耐久度 Flash 存储设备不可或缺的保障。

