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 中数据更新时,旧数据页标记为无效,新数据写入新空闲页。垃圾回收的任务就是回收包含无效数据的块。


