RISC-V生态全景解析(十五):YoC组件介绍系列五: KV组件

简介: 芯片开放社区(OCC)面向开发者推出RISC-V系列内容,通过多角度、全方位解读RISC-V,系统性梳理总结相关理论知识,构建RISC-V知识图谱,促进开发者对RISC-V生态全貌的了解。

编辑语:

芯片开放社区(OCC)面向开发者推出RISC-V系列内容,通过多角度、全方位解读RISC-V,系统性梳理总结相关理论知识,构建RISC-V知识图谱,促进开发者对RISC-V生态全貌的了解。


为了帮助广大开发者快速上手YoC基础软件平台,实现RISC-V生态应用的极简开发,我们推出了YoC组件介绍系列内容,并向大家介绍了其中的CSI组件AT组件AV(多媒体)PARTITION组件。本期我们将为大家讲解YoC的KV组件,通过KV组件的简介、设计概述、主要原理描述以及示例四部分内容,带大家全面了解该组件。


01 介绍

KV是基于Nor Flash的一种Key-Value 数据存储系统,该系统采用极小的代码及内存开销(最小资源 rom:3K bytes,ram:100bytes),在小规模的Nor Flash上实现数据的存储管理能力,支持断电保护、磨损均衡、坏块处理等功能,并提供标准的aos kv接口进行访问。


KV 存储系统支持只读模式与读写模式共存,只读模式可以用于工厂生产数据,读写模式可用于运行时的数据存储。


02 设计概述

2.1 数据格式

为了简化设计,降低复杂性,减少代码规模及内存开销,又考虑到只读KV与读写KV的兼容性,KV系统未采用传统KV系统或文件系统中采用的HEAD描述结构,采用的链式遍历方式设计。


根据FLASH 的特点,以block 为单位,每一个block 都是一个独立的存储单元,限制一个KV必须存储在一个block上。


KV格式:

  • 只读:=\n
  • 读写:<key><\0><size_lo><size_hi><version>=<value><size_hi><erase_flag>


如下表

字节数

n

1

1

1

1

1

n

1

4

字段

KEY

0

SIZE_LO

SIZE_HI

VERSION

=

VALUE

SIZE_HI

ERASE FLAG


  • 字段具体说明

字段

空间(Byte)

说明

KEY

n

用户传入的key,由字母、数字等可打印字符组成

0位

1

数值0的特殊值,紧跟在KEY后,是检索的关键标记值

SIZE_LO/

SIZE_HI

2

占两个字节,保存KEY的长度与Value的长度,Value占高10位,KEY占低6位(允许最大KEY长度为63字节,Value理论长度为1023,但由到block 的大小限制,最大长度不得超出block)SIZE_LO为value 长度的低8位,SIZE_HI 的低2位为value 长度的高2位

Version

1

版本,用于保存KEY被修改的次数,当一个KV被多次修改时,Version最累加,累加到255时掉头为1;该字符用于保证KV修改的有效性,在写入时断电可能会造成KV的重复,采用最新版本的KV为有效KV,删除历史版本的KV;

等号位

1

即字符”c”,占位及检索标记位,用于识别有效KV

Value

n

用户传入的value值,长度由实际Value 长度决定,受block 及 key 长度限制

SIZE_HI

/

保存上述SIZE_HI 数据,该位用于校检KV的有效性

Erase flag

4

KV删除标记位,由四个字节组成,非0时为有效KV,为0时,表示该KV已被删除


2.2 重点功能设计概述

2.2.1 断电保护

断电保护的设计是为了在修改KV时,能保证KV不会被破坏的事务处理机制,即要写入失败,要么写入成功,对于已经存的KV,写失败后,KV的值仍然为旧值。对于不存在的KV,写失败后,KV不存在。


2.2.2 磨损均衡

在通常的应用中,部分KV被经常修改,由于FLASH物理特性,擦写的次数有一定的限制,擦写次数超过次数时,该块会损坏不能使用。磨损均衡的设计是将KV的写入分散到多 block上,避免存储在固定的位置上,达到磨损均衡的效果。磨损均衡主要依赖以下两个策略来实现:


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


  • 垃圾回收策略 当free block总数接近gc下限时,会触发gc操作。flash数据在gc前,存在有效键值和无效键值交织的情况;gc后,把有效文件数据归并到free block,原区域则被擦除并置入free block。gc循环向后搬运键值。


2.2.3 坏块处理

Nor flash有一定的擦写次数限制,如果达到这个限制,或者由于物理方面的损坏,会导致这些block写入有问题。KV系统采用直接片上链式读取,擦除与写入时校验数据正确性,不采用特殊的标识信息来处理坏块,当block 擦除失败或者写失败后,会重新申请新的数据块,避免坏块被错误使用。


03 主要原理描述

3.1 关键过程处理流程

  • 格式化

将所有块擦除后,若擦除失败则置为坏块。


  • 初始化

遍历整个系统,统计每个block 上KV的个数、占用空间、可用位置,删除KV的数量,清理无效的KV,回收无用的block,若cache功能打开,则还会将所有key信息存入cache中。


  • 写键值

3.1 查找系统中是否已存在该键值

3.2 分配新的kvnode,计算版本号、长度,将kvnode 写入block

3.3 删除已存在的键值


  • 读取及删除键值

4.1 查找系统中是否已存在该键值

4.2 读取或删除已存在的键值


3.2 GC处理流程

当free block总数接近gc下限时,会触发gc操作。如下图,flash数据在gc前,存在有效键值和无效键值交织的情况;gc后,把有效文件数据归并到free block,原区域则被擦除并置入free block。gc循环向后搬运键值

截屏2021-11-22 下午9.53.30.png


3.3 CACHE功能

对于资源相对丰富的芯片,可以通过打开在package.yaml中配置CONFIG_KV_ENABLE_CACHE来打开cache功能,cache打开后,KV初始化时会统一将所有key的信息存储到cache中,之后的读写删等操作通过cache可快速定位到flash上的位置,减少对flash的遍历操作,从而可提升读速率30%,写速率95%,删除速率50%。

截屏2021-11-22 下午9.54.05.png


04 示例

#include <aos/kv.h>
void kv_test(void)
{
    int ret =aos_kv_init("kv"); //初始化kv,注意需要将partition先处理化
    if (ret != 0) {
      printf("kv init failed");
        return;
    }
    aos_kv_set("test_key", "hello"); //向kv里写入"hello"
    char buffer[6];
    aos_kv_get("test_key", buffer, 6); //从kv里读取数据到buffer
    printf("kv read: %s\r\n", buffer);
}


05 下期预告

本文是YoC组件介绍系列的完结篇,下期内容将为大家讲解如何上传组件到OCC进行开源。欢迎大家持续关注RISC-V系列内容。

相关文章
|
前端开发 JavaScript
React 步骤条组件 Stepper 深入解析与常见问题
步骤条组件是构建多步骤表单或流程时的有力工具,帮助用户了解进度并导航。本文介绍了在React中实现简单步骤条的方法,包括基本结构、状态管理、样式处理及常见问题解决策略,如状态管理库的使用、自定义Hook的提取和CSS Modules的应用,以确保组件的健壮性和可维护性。
342 17
|
12月前
|
机器学习/深度学习 存储 缓存
LLM高效推理:KV缓存与分页注意力机制深度解析
随着大型语言模型(LLM)规模和复杂性的增长,高效推理变得至关重要。KV缓存和分页注意力是优化LLM推理的两项关键技术。KV缓存通过存储键值对减少重复计算,而分页注意力则通过将序列分割成小块来降低内存消耗,从而有效处理长序列。本文深入剖析这些技术的工作原理及其在仅解码器模型中的应用,探讨其优势与挑战,并展示其实现示例。
827 16
LLM高效推理:KV缓存与分页注意力机制深度解析
|
11月前
|
索引
【Flutter 开发必备】AzListView 组件全解析,打造丝滑索引列表!
在 Flutter 开发中,AzListView 是实现字母索引分类列表的理想选择。它支持 A-Z 快速跳转、悬浮分组标题、自定义 UI 和高效性能,适用于通讯录、城市选择等场景。本文将详细解析 AzListView 的核心参数和实战示例,助你轻松实现流畅的索引列表。
538 7
|
前端开发 UED
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
436 9
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
248 1
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
1536 2
|
机器学习/深度学习 编解码 算法
深入解析MaxFrame:关键技术组件及其对视频体验的影响
【10月更文挑战第12天】随着流媒体服务和高清视频内容的普及,用户对于视频质量的要求越来越高。为了满足这些需求,许多技术被开发出来以提升视频播放的质量。其中,MaxFrame是一种旨在通过一系列先进的图像处理算法来优化视频帧的技术。本文将深入探讨构成MaxFrame的核心组件,包括运动估计、超分辨率重建以及时间插值算法,并讨论这些技术如何协同工作以改善视频播放效果。
266 1
|
机器学习/深度学习 自然语言处理 数据管理
GraphRAG核心组件解析:图结构与检索增强生成
【10月更文挑战第28天】在当今数据科学领域,自然语言处理(NLP)和图数据管理技术的发展日新月异。GraphRAG(Graph Retrieval-Augmented Generation)作为一种结合了图结构和检索增强生成的创新方法,已经在多个应用场景中展现出巨大的潜力。作为一名数据科学家,我对GraphRAG的核心组件进行了深入研究,并在此分享我的理解和实践经验。
662 0
|
11月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1084 29
|
11月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
464 4

热门文章

最新文章

推荐镜像

更多
  • DNS