嵌入式数据库
Flash基础
- FLASH分层结构为块(Block)>扇区(Sector)>页(Page), 以LPC55S69-EVK为例,其包含一个块(Block),块大小为640K,每个块包含20个扇区(Sector),扇区大小为32K,每个扇区包含64个页(Page),页大小为512B
- FLASH写入,先判断如果不是FF就要先擦除. 写入只能把数据(bit)从1改为0;擦除只能把所有数据(bit)从0改为1. 所以某些数据更新的时候有备份、再写入这个步骤
- 原来flash芯片不支持覆盖写,只能在擦除过的区域进行写操作,想要重写数据,必须进行擦除,而且擦除一般是按照扇区或者是块进行擦除。根本原因其实是flash芯片的写操作只能将1变为0,而不能将0变为1,擦除之后,flash中是全1的状态,若想将0变为1则只能通过擦除操作。所以严格来说不是不支持覆盖写,因为对于特定的数据(只要不涉及0变1)也可以进行覆盖写。
Nor Flash 和 Nand Flash的差别
- 使用寿命上,nand flash的擦除次数是nor的数倍。而且nand flash可以标记坏块,从而使软件跳过坏块。nor flash一旦损坏便无法再用
- 结构:Nor Flash和Nand Flash的存储单元结构不同。Nor Flash采用并行结构,每个存储单元都有自己的地址,数据可直接读取。而Nand Flash采用串行结构,数据必须通过多级地址转换才能读取。
- 读写速度:Nor Flash的读写速度比Nand Flash快,因为它可以直接访问每个存储单元,而Nand Flash需要多级地址转换,因此读写速度较慢。
- 寿命:Nor Flash的寿命比Nand Flash长,因为它可以进行单个存储单元的擦写和读取,而Nand Flash只能进行整块擦写和读取,容易出现坏块,缩短寿命。(nandflash按块来擦除,按页来读,norflash没有页?)
- 成本:Nand Flash的成本比Nor Flash低,因为它采用串行结构和块擦写技术,可以实现更高的存储密度和更低的制造成本。
- 应用:Nor Flash主要用于嵌入式系统、通讯设备、汽车电子等需要快速读写和稳定性的领域(AlithingOS 的 kv组件目前仅针对Nor flash设备)。 Nand Flash主要用于大容量数据存储领域,如闪存卡、USB闪存驱动器、SSD固态硬盘等。
总的来说,Nor Flash和Nand Flash各有优劣,应根据具体的应用场景和需求选择适合的存储器。
AliOS things KV阅读笔记
- 采用make it simple原则 ,
- 适用场景: 适用于kv量小且kv长度小的应用
- 初始化
- 检查所有的块,无效的块格式化,包含无效kv item的设置为dirty块(包含脏数据和有效数据) ; 最后确定写位置到最后使用的块
- 根据clean 块和剩余空间的情况决定是否触发垃圾回收
- 垃圾回收就是从当前写入块的下一个存储块开始依次检查存储块的管理状态,若存储块的管理状态为Dirty状态,则将该存储块中的有效数据(有效kv item)依次挪向垃圾回收预留的空闲存储块(最后的空闲块,就是还没轮到的块,写入是往后循环的写,用来回收的就是还没写入的空闲块),当数据迁移完成后,会擦除Dirty存储块并标记可用空闲状态。
- 回收后,写入指针会更新到新的块的位置。 垃圾回收调用一次只会回收一个脏块,如果不满足,会继续回收(手动调用)。
- 写数据
- 先查找kv, 找的话,做更新,
- 如果老值等于新值,则直接返回,不用做处理。
- 否则的话,保存这个新kv
- 保存的时候先查找要存放的位置,
- 在查找前检查剩余的干净block是否小于最小阈值,是的话,触发垃圾回收。
- 如果存在老kv, 则先写新kv,再写老kv。
- 掉电保护
- 由 crc和Origin_off(老kv位置)来实现掉电保护。
- 在写新kv的过程中掉电,则上电初始化时新kv的crc校验会不通过,此时会直接删掉新kv。
- 如果是在新kv写完成,老kv未删的时候掉电,则在初始化的时候,会判断一个kv是否有老kv, 是的话(再次检查新老kv的键名是否相同,不同的话,就不用恢复,直接返回),相同的话,就把老kv设置成已删除状态(对应扇区也改成脏)。
- 读数据
- 先kv搜索时,是依次从falsh读取并比对。 kv查找速度同kv个数成正比, 查找效率还可以,几百个kv的话,也就查几百次就好了,当kv个数大时,查找效率差 。
- 删除
- 就是查找到key,然后删除,与读操作相比,就是把读取改为删除。
- 怎么实现擦除平衡
- 异地更新策略:Key-Value键值对采用顺序写入、异地更新的方式,即不再在原存储位置擦除重写,而是在其余空闲位置写入新键值并将原键值标记无效等待回收。这样既可以减少flash的擦除操作次数,又可以提高flash的空间利用率,也避免了对“特定”存储区块过度使用的问题
- 一直往后面写,包括垃圾回收时,也是写入到后面的块