磨损均衡算法介绍
核心问题:为什么需要磨损均衡?
要理解磨损均衡,首先要明白 Flash 存储器(包括 NAND Flash 和 NOR Flash)的物理限制:
- 有限的擦写次数:Flash 存储单元在经历一定次数的擦除操作后,会因物理损耗而失效。这个次数就是耐久度。
- SLC NAND:~10 万次
- MLC NAND:~3 千 - 1 万次
- TLC NAND:~500 - 1.5 千次
- QLC NAND:~100 - 500 次
- 擦除操作的特殊性:Flash 不能像 RAM 一样直接覆盖写入。它必须先进行擦除(通常按'块'进行,如 128KB/256KB),将整个块变为'1',然后才能进行编程(将需要的比特从'1'变为'0')。
问题场景:假设一个文件系统的元数据(如 FAT 表)固定存储在同一个 Flash 物理块上。每次文件更新,这个块都需要被擦写一次。即使这个块只能擦写 1 万次,在频繁写入的系统里,可能几周甚至几天就会用尽寿命,导致整个存储设备提前报废。而其他大部分块可能还'全新未使用'。
磨损均衡的目标就是:通过算法,让所有 Flash 物理块的擦写次数均匀分布,避免某些'热点'区块被过早写坏,从而将整个存储设备的总寿命延长至接近其理论最大值。
磨损均衡的实现层次与核心思想
磨损均衡算法主要在闪存转换层中实现。FTL 是介于文件系统(如 FAT32, ext4)和物理 Flash 芯片之间的一个固件层,它负责地址转换、坏块管理、垃圾回收和磨损均衡。
其核心思想是:将文件系统看到的'逻辑地址'与 Flash 存储器的'物理地址'分离开来,并动态地改变它们之间的映射关系。
主要磨损均衡算法分类
磨损均衡算法主要分为两大类:动态磨损均衡 和静态磨损均衡。
1. 动态磨损均衡
这是最基本的形式。
- 原理:当需要写入新数据时,FTL 总是从空闲块池中选择一个擦除计数最小的块(即'最年轻'的块)来使用。
- 工作方式:
- FTL 维护一个所有空闲块的列表,并记录每个块的擦除次数。
- 当有写入请求时,算法从这个列表中找出擦除次数最少的块。
- 将数据写入该块,并更新逻辑到物理的地址映射表。
- 该块被移出空闲列表,其擦除计数增加。
- 优点:实现相对简单,能有效防止新写入的数据集中消耗少数几个块。
- 缺点:无法解决'冷数据'问题。如果一个数据写入后就不再修改(称为'冷数据'),那么它所占用的那个物理块就不会再被擦写,其磨损计数也就停滞了。而其他频繁变动的'热数据'区块则在持续磨损,导致块之间的磨损差异逐渐拉大。
2. 静态磨损均衡
这是更高级、更有效的方法,也是现代 SSD 和 eMMC/UFS 中的标准做法。
- 原理:不仅在选择空闲块时考虑磨损,还会主动地将'冷数据'从低磨损的块中搬移到高磨损的块中,从而让那些闲置的、低磨损的块也参与到磨损循环中来。
- 工作方式:
- 同样采用动态磨损均衡的策略来选择空闲块。
- 系统会周期性地或在特定条件下(如磨损差异超过某个阈值)启动数据迁移。
- FTL 会寻找一个存放着'冷数据'的、磨损计数很低的物理块(Block A),以及一个磨损计数很高的空闲块(Block B)。
- 它将 Block A 中的有效数据复制到 Block B 中。


