摘要: KV组件的写平衡(磨损平衡)特性就是通过异地更新、垃圾回收等策略来平衡flash介质各个存储区块的磨损程度,以避免某些“特定”存储区块因过度使用而形成坏区,从而延长flash的使用寿命。

前言

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万次左右)。

下表是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原则,主要依赖以下两个策略来实现:

  1. 异地更新策略:

Key-Value键值对采用顺序写入、异地更新的方式,即不再在原存储位置擦除重写,而是在其余空闲位置写入新键值并将原键值标记无效等待回收。这样既可以减少flash的擦除操作次数,又可以提高flash的空间利用率,也避免了对“特定”存储区块过度使用的问题。
示意图如下:

  1. 垃圾回收策略:

当flash存储区块的剩余可用空间达到阈值时,会触发垃圾回收机制。垃圾回收机制采用基础的SGC算法进行资源回收释放,即当系统触发垃圾回收时,从当前写入块的下一个存储块开始依次检查存储块的管理状态,若存储块的管理状态为Dirty状态,则将该存储块中的有效数据依次挪向垃圾回收预留的空闲存储块,当数据迁移完成后,会擦除Dirty存储块并标记可用空闲状态。
示意图如下:

小结
KV组件的写平衡特性,在兼顾footprint需求的同时,也能有效的提升flash的使用寿命。不过也是由于footprint的要求,写平衡特性在算法的实现相对较为简单,在资源更丰富的场景下,可以采用更复杂高效一些的平衡算法。
点此查看原文

AliOS Things KV组件的写平衡特性相关推荐

  1. AliOS Things KV组件的写平衡特性 1

    摘要: KV组件的写平衡(磨损平衡)特性就是通过异地更新.垃圾回收等策略来平衡flash介质各个存储区块的磨损程度,以避免某些"特定"存储区块因过度使用而形成坏区,从而延长flas ...

  2. AliOS Things 3.3.0 : KV组件介绍

    概述 对于嵌入式系统应用中,频繁使用的参数存储,过程变量存储等操作,AliOS-Things为用户提供了一种更加直观易于理解的基于键值对的存储方式,如报警温度=50度,可以通过定义一个键值对:{&qu ...

  3. AliOS Things 基于组件化思想的多bin特性

    摘要: 今年杭州云栖大会上,AliOS Things正式发布,其中有一个基于组件化思想的多bin特性,这是AliOS Things有专利保护的多bin fota升级解决方案的核心 今年杭州云栖大会上, ...

  4. [vue] vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么?

    [vue] vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么? 需要,原生DOM事件必须要手动销毁,否则会造成内存泄漏 个人简介 我是歌谣,欢迎和大家一起交流前后 ...

  5. [vue] 组件中写name选项有什么作用?

    [vue] 组件中写name选项有什么作用? 项目使用keep-alive时,可搭配组件name进行缓存过滤 DOM做递归组件时需要调用自身name vue-devtools调试工具里显示的组见名称是 ...

  6. 【SLF4j】使用日志组件SLF4j写系统日志

    为什么要写日志? 在程序中添加日志的好处: 1. 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作 2. 跟踪代码运行时轨迹,作为日后审计的依据 3. 担当集成开发环境中的调试 ...

  7. 【React组件】写一个模仿蓝湖的图片查看器

    前言 最近公司让写一个可以自由拖拽放大的图片查看器,我寻思这还不简单,一顿操作猛如虎,俩小时后: 事实证明,一旦涉及到 DOM 的变换操作,如果很多细节考虑不全,抓过来就写,那基本就凉了.于是我仔细分 ...

  8. vue_组件_非prop特性

    非prop特性指的是,一个未被组件注册的特性.当组件接收了一个非prop特性时,该特性会被添加到这个组件的根元素上. 1.替换/合并已有的特性 对于绝大多数特性来说,从外部供给组件的值会替换掉组件内部 ...

  9. java 通用组件_写一个通用数据访问组件

    出处:http://www.csharp-corner.comwillsound(翻译)我收到过数据库 出处:http://www.csharp-corner.com willsound(翻译) 我收 ...

最新文章

  1. Android SoundPool.play方法的音量与系统音量的关系
  2. Windows Phone中Wallet钱包的使用
  3. how does SAP CRM partner function work - how is account change working
  4. Spark技术内幕: Task向Executor提交的源代码解析
  5. javaone_JavaOne 2014 –有关提交的一些初步分析
  6. leetcode937.ReorderLogFiles
  7. 在window10上安装miniconda
  8. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_1_今日内容(1)...
  9. php 和 java_Java和php怎么选择??
  10. iocomp控件使用教程-V5版本
  11. (可更新)计算机算法设计与分析 第4版 (王晓东) 课后答案[1-9章]
  12. Xv6 traps and system calls
  13. UVA 10098 Generating Fast
  14. vim下载安装 配置方法(图)
  15. faster-rcnn.pytorch-1.0的jwyang当前最火版本代码复现与讲解
  16. 泰森多边形(Voronoi图)生成算法
  17. arduino控制寻迹传感器
  18. SEO 小白攻略 to replace
  19. 如何免费给PDF文件添加标注?
  20. Go语言-实现单链表反转算法

热门文章

  1. PS常用快捷键就这些了,记住绘图事半功倍
  2. android--------Socket的简单了解
  3. [java]OutOfMemoryError 原因及解决办法
  4. 大数据,只是为了赚钱么?
  5. usaco dec 2012 first!
  6. asp.net调用百度地图API,实现电子地图
  7. python字典经典例题_python 字典(Dictionary)的一些内置函数和经典例题
  8. FOC驱动器和无刷电调的区别
  9. 电动滑板改装 特斯拉电机 120A FVT电调的使用
  10. Head First设计模式之策略模式(Strategy)