摘要: 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次)

根据上表的对比,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相关推荐

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

    摘要: 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. 北大博士干了半年外卖骑手,写出AI伦理论文登上顶刊,“系统知道一切”
  2. Python3基础-分数运算
  3. 游戏市场阴影下的手游厂商,和他们无法触碰的未来
  4. python Requests登录GitHub
  5. java二级缓存技术_Java二级缓存
  6. 用U盘给苹果电脑装Win7系统教程
  7. Python之 面向对象封装案例
  8. 程序员面试金典——5.5整数转化
  9. PostgreSQL数据库的安装与配置
  10. python实现黑客帝国动画效果
  11. NXP IMX6ULL芯片时钟系统全概况
  12. Python获取高德POI(关键词搜索法)
  13. Jenkins不能正常trigger
  14. 没有学历可以做程序员吗?
  15. php三层架构 注册登陆,什么是三层架构
  16. with as的update写法
  17. (静态,动态,文件)三个版本的通讯录
  18. SAP License:ERP系统是什么意思
  19. (前端学习)寒假第一周周报
  20. JS判断是否IE浏览器

热门文章

  1. laravel框架中文手册_node.js 后端框架star 排名 2020年11月更新,fastify 超 egg
  2. matplotlib 子图超过4个_Matplotlib从入门到精通
  3. 群晖 百度网盘_海康威视联合百度网盘推出NAS私有存储 贡献带宽获积分兑网盘会员...
  4. 聘用计算机高级职称,关于咨询高级职称聘用的问题
  5. html盒模型中border的写法,HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手...
  6. linux awk if 多个条件,linux shell awk 流程控制语句(if,for,while,do)详细介绍
  7. “牛津第一,16岁上大学”,中国美女学霸被骂学术媛?学术人“光鲜亮丽”就是错?...
  8. 处理32人!永久取消申报基金/报奖资格……又一批科研不端案例被通报批评
  9. 留守女孩携笔从戎,被录取为空军飞行员
  10. 开学典礼上,施一公寄语:西湖大学绝不允许任何形式的学术不端!