|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本期我们将为大家讲解YoC的KV组件,通过KV组件的简介、设计概述、主要原理描述以及示例四部分内容,带大家全面了解该组件。- ^ C8 ~' ~* E. {
' J2 e+ V. b, B: b- y1、介绍
+ d7 l; p- e5 uKV是基于Nor Flash的一种Key-Value 数据存储系统,该系统采用极小的代码及内存开销(最小资源 rom:3K bytes,ram:100bytes),在小规模的Nor Flash上实现数据的存储管理能力,支持断电保护、磨损均衡、坏块处理等功能,并提供标准的aos kv接口进行访问。) V0 M) l! `: x+ H- e! X Y
KV 存储系统支持只读模式与读写模式共存,只读模式可以用于工厂生产数据,读写模式可用于运行时的数据存储。. h( Z. ^8 G+ ^; @/ v2 `$ r
' r3 d4 [/ r- i) i( [1 M; u2、设计概述
! s/ j+ k e! Q' W) R2.1 数据格式8 @% c$ Q1 A+ s
为了简化设计,降低复杂性,减少代码规模及内存开销,又考虑到只读KV与读写KV的兼容性,KV系统未采用传统KV系统或文件系统中采用的HEAD描述结构,采用的链式遍历方式设计。
% r" W/ j5 ?6 \8 X0 M- \, ?根据FLASH 的特点,以block 为单位,每一个block 都是一个独立的存储单元,限制一个KV必须存储在一个block上。
) r$ _* s2 ^/ J+ u5 QKV格式:* n- _4 Q: S, h0 [, @; D& x Z* ^. B
只读:=\n+ _4 K; n8 E0 R3 h9 V' h/ l
读写:<key><\0><size_lo><size_hi><version>=<value><size_hi><erase_flag>/ ?* u( v9 I( _8 }3 }8 t
字段具体说明:
" y$ u( z/ s: s0 n字段 | 空间(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已被删除 |
6 x1 w9 O" o# l) P% X/ E/ L9 l d. }5 j! V2 H) ]8 p" r2 E
2.2 重点功能设计概述
8 b3 T$ d5 {: p- p1 a c9 N( o2.2.1 断电保护" A; ~. t3 v# l! n% M3 a
断电保护的设计是为了在修改KV时,能保证KV不会被破坏的事务处理机制,即要写入失败,要么写入成功,对于已经存的KV,写失败后,KV的值仍然为旧值。对于不存在的KV,写失败后,KV不存在。- _% z1 a6 P1 ^8 B; T6 ~0 b
]) ?: e% X+ I, ?! v- E
2.2.2 磨损均衡# d! [/ r4 Z0 ^/ K, j& c$ A }
在通常的应用中,部分KV被经常修改,由于FLASH物理特性,擦写的次数有一定的限制,擦写次数超过次数时,该块会损坏不能使用。磨损均衡的设计是将KV的写入分散到多 block上,避免存储在固定的位置上,达到磨损均衡的效果。磨损均衡主要依赖以下两个策略来实现:
" \- B3 J# x# ? F异地更新策略 Key-Value键值对采用顺序写入、异地更新的方式,即不再在原存储位置擦除重写,而是在其余空闲位置写入新键值并将原键值标记无效等待回收。这样既可以减少flash的擦除操作次数,又可以提高flash的空间利用率,也避免了对“特定”存储区块过度使用的问题。
! e2 n# L8 K! H垃圾回收策略 当free block总数接近gc下限时,会触发gc操作。flash数据在gc前,存在有效键值和无效键值交织的情况;gc后,把有效文件数据归并到free block,原区域则被擦除并置入free block。gc循环向后搬运键值。 ! v, W4 y' p* v; {' h) o( f: ?
3 ^, D( F; _, d- D
2.2.3 坏块处理* g& z, Q+ g* d8 W4 V. W$ r% q- L4 X5 V
Nor flash有一定的擦写次数限制,如果达到这个限制,或者由于物理方面的损坏,会导致这些block写入有问题。KV系统采用直接片上链式读取,擦除与写入时校验数据正确性,不采用特殊的标识信息来处理坏块,当block 擦除失败或者写失败后,会重新申请新的数据块,避免坏块被错误使用。
4 f7 I+ v. k; q/ y+ \7 I) I
4 s, V% _$ o' W/ V5 k) N3、主要原理描述
1 R# v& K$ _# i6 L1 A3.1 关键过程处理流程& ^; |9 l0 V2 k4 T, b
格式化* @+ ]: o$ V$ y5 z6 e6 F5 ]: `
将所有块擦除后,若擦除失败则置为坏块。
$ b0 E& R) S4 P* p" G0 u4 q8 d& G9 x1 h5 k8 M+ n! h' I( x
初始化
4 g* d8 ^% H% b8 `: w% y# W, N. F/ K遍历整个系统,统计每个block 上KV的个数、占用空间、可用位置,删除KV的数量,清理无效的KV,回收无用的block,若cache功能打开,则还会将所有key信息存入cache中。
' |: |+ T% h2 b" q' I
1 H5 U0 B4 x1 U) e- Q! H) J; }, j3 |写键值9 b. z' U- z0 L0 Q+ \
3.1 查找系统中是否已存在该键值0 h* b/ U$ `! C4 `6 p, s6 `3 c' s
3.2 分配新的kvnode,计算版本号、长度,将kvnode 写入block
! W q! ?7 r6 u, r# F3.3 删除已存在的键值
5 X; m; Z/ H$ I2 l) X2 V6 S
9 }0 q; }4 h9 q4 E% K1 d/ V8 B读取及删除键值
7 l! H+ `. g1 E' `4.1 查找系统中是否已存在该键值. [7 w3 g/ @% v+ l# I9 n) u
4.2 读取或删除已存在的键值3 {( L& w0 v! {9 V4 H
* i/ N- y" O( \& N6 d- X* F# d6 z' U4 y; Y# Q8 F
|
|