摘要: KV组件的写平衡(磨损平衡)特性就是经过异地更新、垃圾回收等策略来平衡flash介质各个存储区块的磨损程度,以免某些“特定”存储区块因过分使用而造成坏区,从而延长flash的使用寿命。算法
前言spa
KV组件是AliOS Things中一个以Key-Value方式进行持久化存储的轻量级组件,主要为基于nor flash的小型MCU设备(Micro Control Unit)提供通用的Key-Value持久化存储接口。KV组件支持写平衡(磨损平衡)、掉电保护特性,且具备至关低的footprint。这里主要介绍KV组件在设计写平衡特性时的一些考量。
What -- KV组件的写平衡特性是什么设计
对于flash介质而言,它是有必定的擦写次数限制的。若是针对介质上一个固定地址进行重复的擦除、写入,将会致使该区域的使用寿命下降,甚至出现介质损坏的状况。KV组件的写平衡(磨损平衡)特性就是经过异地更新、垃圾回收等策略来平衡flash介质各个存储区块的磨损程度,以免某些“特定”存储区块因过分使用而造成坏区,从而延长flash的使用寿命。
Why -- KV组件为什么须要写平衡特性
KV组件的设计初衷是为了给基于nor flash的小型MCU设备提供一个能够存储配置信息的模块。对于单个配置信息而言,通常所需存储的字节数大多在十几个字节~几百个字节量级,而通常nor flash的最小擦除单位(sector)都在4K字节以上,且根据flash介质需先擦再写的特色,若是没有写平衡特性,每次新写入或更新配置信息都会带来一次flash介质擦除操做,这将大大影响flash介质的使用寿命(通常nor flash的擦除次数限制大约10万次左右)。code
下表是flash介质在有无写平衡特性下重复写入使用寿命的理论计算对比:
(限制条件:flash擦除sector大小为4k, 擦除次数限制为10W次,每日写入次数5000次)
有无写平衡特性 每次写入数据量(byte) 平均每日擦除次数 使用寿命
yes 50 ≈62 ≈4.4年
no 50 5000 20天
yes 500 ≈610 ≈163天
no 500 5000 20天接口
根据上表的对比,KV组件的写平衡特性在几百个字节量级的写入状况下起码能够延长flash 8倍以上的使用寿命。图片
How -- KV组件写平衡特性的实现考量
因为小型物联网嵌入式设备的硬件资源较为匮乏,对code size以及RAM的占用size比较敏感。因此基于资源消耗的考量,写平衡特性在KV组件中的实现遵循make it simple原则,主要依赖如下两个策略来实现:资源
Key-Value键值对采用顺序写入、异地更新的方式,即再也不在原存储位置擦除重写,而是在其他空闲位置写入新键值并将原键值标记无效等待回收。这样既能够减小flash的擦除操做次数,又能够提升flash的空间利用率,也避免了对“特定”存储区块过分使用的问题。
示意图以下:get
当flash存储区块的剩余可用空间达到阈值时,会触发垃圾回收机制。垃圾回收机制采用基础的SGC算法进行资源回收释放,即当系统触发垃圾回收时,从当前写入块的下一个存储块开始依次检查存储块的管理状态,若存储块的管理状态为Dirty状态,则将该存储块中的有效数据依次挪向垃圾回收预留的空闲存储块,当数据迁移完成后,会擦除Dirty存储块并标记可用空闲状态。
示意图以下:flash
小结
KV组件的写平衡特性,在兼顾footprint需求的同时,也能有效的提高flash的使用寿命。不过也是因为footprint的要求,写平衡特性在算法的实现相对较为简单,在资源更丰富的场景下,能够采用更复杂高效一些的平衡算法。
点此查看原文it