APP下载

基于YAFFS2文件系统的分区管理对载荷数据存储效率的研究

2018-12-15吴灿强芮晔潘东梅

电子设计工程 2018年23期
关键词:数据结构分区载荷

吴灿强,芮晔,潘东梅

(上海航天电子技术研究所上海201100)

如今我国航天技术不断提高,卫星应用需求也随之扩大,其存储的载荷数据种类、数据量逐渐增加,数据存储管理难度日益加大[1]。虽然星载数据存储器经传统的基于FPGA的方式设计后将读写方式由最初以字节为单位线性编址的流读写方式发展为基于文件分配表的文件读写方式[2],但是为了解决Flash存储器应用存在的不覆盖写、磨损均衡问题并实现文件系统的完整功能,使用嵌入式文件系统管理星载数据存储器在未来星载数据存储技术的发展上显得尤为必要。

目前常用的嵌入式文件系统主要有两种:一种是JFFS/JFFS2文件系统[3-4],其专门针对NOR FLASH存储介质设计,因此用于NAND FLASH存储介质上效果不佳;另外一种则是YAFFS/YAFFS2文件系统[5-6],其专门针对NAND FLASH存储介质的特性设计,具有崩溃恢复、坏块管理、损耗均衡、垃圾回收及错误探测/错误更正(EDC/ECC)的FLASH文件系统必须具备的功能。同时YAFFS/YAFFS2文件系统比JFFS/JFFS2文件系统加载和执行速度更快且占用内存更少[7-8]。此外,YAFFS/YAFFS2文件系统自带NAND FLASH存储芯片驱动程序[9],为嵌入式系统提供了直接访问文件系统的API,支持多种CPU架构,因此YAFFS/YAFFS2文件系统更便于在嵌入式系统中移植开发。

但YAFFS版本只支持512 B的小页NAND FLASH存储芯片[10]。而YAFFS2版本在YAFFS版本的基础上进行升级,不仅能向下兼容小页NAND FLASH,而且能更好地支持2 KB以上的大页NAND FLASH,同时在性能上也有很大提高[11]。综上,本文选用了YAFFS2文件系统作为研究基础。

在星载环境中,载荷数据种类多且数据量多,同时对于数据的查找方式一般既要区分载荷又得区分时间段等多重信息。通过对YAFFS2文件系统的深入研究和分析,本文发现如果将YAFFS2文件系统直接应用于星载环境下,会因为YAFFS2文件系统的类日志型结构而带来对多载荷/多任务数据管理难和数据存储效率较低等问题。

目前,针对Flash文件系统的研究途径主要有两个方向:一是对现有的Flash文件系统进行优化设计[12-13],例如JFFS3文件系统的设计方案的提出则是为了迎合闪存容量不断增加的发展趋势,利用B+树算法将原来在内存中的索引信息存储到闪存上,即在闪存上存储和维护索引[14];二是开发新的适用于Flash的文件系统[15-16]。

考虑到新研发文件系统研制周期长、可靠性以及功能完整性需要一定时间验证等缺点,本文基于第一种研究途径,针对YAFFS2文件系统在设计性能上的不足和在特定应用环境下的需求问题,对其进行部分优化设计,引入分区管理功能,使其在多任务环境下对复杂的大数据检索效率得到一定提高。

1 YAFFS2文件系统研究与分析

文件系统实现对数据存储与检索的有效管理主要是依赖于其内部数据结构和数据流关系的巧妙设计。在YAFFS2文件系统中的主要数据结构设计如下:

1)文件。在YAFFS2文件系统中,无论是正常文件、目录,还是链接或设备文件等一切可记录或可被描述的内容都被统一当作文件来处理。

2)对象。在YAFFS2文件系统挂载时,YAFFS2文件系统会在内存中为每个文件建立一个对应的yaffs_obj对象。yaffs_obj数据结构主要包含3种内容:一是用户ID、修改时间等文件属性;二是用于实现对YAFFS2文件系统存储信息作更新和维护的各种标记位,例如删除标记等;三是用于表示YAFFS2文件系统中各存储数据之间的组织结构关系的,如指向对象所属父目录的Parent指针等;此外,针对不同类型的对象实例,yaffs_obj中有与之对应的数据内容,例如普通文件类型对应的数据内容中主要包括用于快速查找文件数据块的yaffs_tnode树的指针等。

3)tag信息。在YAFFS2文件系统中,数据结构yaffs_ext_tags定义了NAND FLASH存储介质物理页上空闲区(OOB)的数据存储格式。为了节省占用OOB区的空间,YAFFS2对yaffs_ext_tags信息进行了打包处理,最后以yaffs_packed_tags2结构存入OOB区。但为了规避在文件系统加载时扫描所有物理页OOB区获取yaffs_obj相关信息以建立文件结构,YAFFS2文件系统在每个物理块的最后一个或多个物理页以yaffs_summary_tags数据结构集中保存yaffs_obj浓缩版信息。

4)设备信息。在YAFFS2文件系统中,数据结构yaffs_dev等同于Linux系统中VFS的超级块结构,为整个文件系统建立层次结构,记录着与NAND Flash器件相关的属性值和系统运行过程中的一些统计值,维护着一组NAND Flash存储介质读写删除有关的操作函数指针,是YAFFS2文件系统最核心的数据结构。

除了以上列举的几种数据结构之外,YAFFS2文件系统中还有许多复杂的数据结构,导致在YAFFS2文件系统上实现分区策略的设计存在着以下3个问题:

1)需要对YAFFS2文件系统的部分数据结构进行改进,而不是简单引进新的数据结构即可;

2)需要将数据结构的改进落实到YAFFS2文件系统中与之相关的访问机制里面,否则易造成数据的不可控;

3)需要考虑YAFFS2文件系统在启动和退出时保存至NAND Flash中的快照信息的同步更新,以及原数据结构在保存至Flash块上的位对齐与位数设计上是否有预留区,否则直接加入新的数据信息可能会造成位溢出,例如OOB区对Flash块来说是固定的,无法保存过多信息,因此在分区策略的数据结构设计上应当尽可能的简练。

2 基于YAFFS2文件系统的分区策略架构设计

2.1 分区策略架构设计

为解决在星载环境中YAFFS2文件系统对多载荷/多任务数据数据管理难和数据存储效率较低等问题,本文在YAFFS2文件系统原有数据结构的基础上提出了分区策略架构设计,如图1所示。

图1 基于YAFFS2文件系统的分区策略架构设计

针对上文中对YAFFS2文件系统的研究和分析,本文提出的基于YAFFS2文件系统的分区策略架构设计主要分为以下3个部分:

1)数据结构的改进

该部分主要针对YAFFS2文件系统原有部分数据结构无法满足分区策略需求的问题,通过对YAFFS2文件系统中的一些数据结构进行成员变量增删改移以及引入一些新的数据结构,实现分区的数据存储结构设计。

在YAFFS2文件系统的“超级块”结构yaffs_dev中加入分区的划分属性,参考FAT文件映射表的设计方式,分区的划分属性以链表的方式实现,称为分区属性表(sector_table),其描述信息包括分区名称、分区ID、分区信息结构入口等,目的在于可通过yaffs_dev实现对分区的访问。

引入分区数据结构yaffs_sector用以保存各个分区相应信息,主要包括分区核心信息、分区下属数据结构指针、分区管理函数入口指针等。其中分区核心信息包括分区ID、分区名称等能表述分区身份的基本信息,以及分区大小、分区起始块、分区结束块、分区预留块大小等限制属性信息,分区锁、分区垃圾回收阈值等操作控制信息;分区下属数据结构指针包括Handle分区池、FileDes分区池、Inode分区池、块信息数组block_info、分区位图chunk_bits数据、分区访问控制列表等数据结构入口指针;分区管理函数入口指针包括分区块分配、分区块回收、分区越界检查等一些区内管理机制中的功能函数入口,以及分区文件查找、分区创建文件、分区删除文件等文件操作函数入口。

在块信息相关结构、tag信息相关结构、OOB信息相关结构中,均需引入结构所属哪个分区的标识,以便在加载和访问的时候能够直接区分数据所属不同分区。

2)分区内管理机制的设计

该部分主要解决如何通过改进后的数据结构实现对分区内数据的访问以及对分区存储空间管理的问题,将原先YAFFS2文件系统中管理整个NAND Flash存储区的函数改造成只对分区内存储区域操作的函数,其中一些功能仍沿用原先YAFFS2文件系统的设计,只是对其中的操作范围添加限制。例如yaffs2_scan_chunk扫描函数,其扫描原理不变,只修改其扫描范围,并将扫描结果反映至分区信息数据结构中,而不再反映至设备信息结构yaffs_dev中。

其中,分区块分配管理机制主要解决分区内部Flash块分配的问题,防止沿用原有YAFFS2文件系统中的分配函数时不对所分配的块进行分区越界检查,导致出现分区A的数据存储至分区B所属区域等分区间数据混乱现象。

分区垃圾回收管理机制同样一改原有YAFFS2文件系统中垃圾回收的扫描范围,仅对分区内部的脏块进行判断和回收。

区内磨损均衡管理机制主要解决让分区内部各Flash块擦除次数尽可能均匀的问题,沿用原YAFFS2文件系统中的设计,即块分配策略和垃圾回收策略相结合。

分区访问控制管理机制通过分区信息结构yaffs_sector中访问控制列表实现,访问控制列表记录着不同载荷/任务ID以及对应的访问权限。

分区快照机制将分区对应的checkpoint数据信息存储至本分区存储区域,实现在掉电重启时只需遍历扫描掉电时存在有数据修改且未保存的分区Flash块的功能,而其它快照信息正常的分区通过YAFFS2 checkpoint机制启动。

3)分区间管理机制的设计

该部分主要实现YAFFS2文件系统对各分区之间的协调管理以追求最大化发挥整个NAND Flash的利用效率,以及实现对各分区的统一管理,来解决分区内管理机制在实现上带来的分区数据分化失衡、分区大小初始配置不合理等问题。

其中,分区动态划分机制主要解决某个载荷/任务分区实际存储空间远小于初始分配大小而造成存储空间浪费的分区大小初始配置不合理问题,以及解决某个载荷/任务产生数据量较大,以致其对应的载荷/任务分区大小在后期无法满足存储需要,而存在另一个载荷/任务分区数据存储需求较小,空闲Flash块较多的数据分化失衡问题。

分区数据动态迁移管理机制实现将分区Flash块的数据移动到另一空闲Flash块的功能,目的在于将某一分区的已分配块紧凑或已分配的数据往后移,从而为前后分区空出多余的空闲区,以实现分区动态划分功能。

分区数据映射机制实现对区间管理机制与分区内管理机制之间的数据对接功能,保证数据能分配到正确对应的分区操作中。

区间磨损均衡机制实现将冷热分区数据对换的功能,以此延长NAND Flash芯片的平均使用寿命。

分区缓存机制作为实现区间磨损均衡的基础,通过扩充文件缓存数目至3个,同时减少每一个文件缓存的cache数目,以减少总的文件缓存占用的内存空间,实现数据暂存的功能。

分区管理实现与文件系统间的对接机制主要实现文件系统对各个分区的统一管理以及初始分区的划分等功能。

2.2 分区策略架构实现

分区策略架构的实现主要包括两个方面:数据结构的改进以及对YAFFS2文件系统原先各种功能实现机制的修改。

其中对YAFFS2文件系统数据结构的改进部分区别于原文件系统的关键之处在于新增了sector_table、yaffs_sector等数据结构,而对于原有的YAFFS2文件系统数据结构通过成员变量增删改移的方式实现,由于篇幅限制,不作详述。

1)sector_table

分区属性表sector_table通过YAFFS2文件系统系统中封装的链表管理list_head数据结构实现。

链表节点具体内容通过数据结构sector_info表示。每一个分区对应一个sector_info实例对象,并在分区属性表sector_table中注册,其结构设计如图2所示。

图2 sector_info数据结构设计

其中,分区ID用以实现文件系统后台程序对分区的快速访问,分区名称实现通过路径名对分区的访问。分区信息结构入口保存了对应的分区实际管理结构指针。

2)yaffs_sector

yaffs_sector数据结构是分区YAFFS2文件系统实现分区管理的核心数据结构,其分担了原先由yaffs_dev管理的部分功能,实现对分区界限、分区对象分配、分区垃圾回收过程信息等的管理。其具体实现如图3所示。

图3 yaffs_sector数据结构设计

其中成员变量主要包括分区核心信息、分区下属数据结构实例、分区管理函数入口指针等。其中分区管理函数由结构体sector_behaviors统一管理,其实现过程如图4所示。

图4 sector_behaviors数据结构设计

而对于其他YAFFS2文件系统数据结构在原来的基础上进行成员变量增删改移。yaffs_dev数据结构中将yaffs_obj对象实例桶结构信息、块信息数组和chunk位图等block与chunk统计信息、tnode分配器信息、垃圾回收相关过程信息、tag数组信息等移至分区结构yaffs_sector中,经由各分区各自统计,不再统一管理以避免分区数据混乱。yaffs_file、yaffs_obj、yaffs_ext_tags、yaffs_summary_tags、yaffs_packed_tags2_tags_only等数据结构中引入新的整型成员变量sector_id,表示分区ID以区分数据结构对象实例所属分区。

对YAFFS2文件系统原先各种功能实现机制的修改包括对YAFFS2文件系统垃圾回收机制、checkpoint机制、文件系统加载机制等的改进,由于篇幅限制,下面只进行部分介绍。

3)垃圾回收机制

分区YAFFS2文件系统的垃圾回收过程改为在yaffs_bg_start函数启动的线程当中通过循环分别扫描每个分区的块页分配情况,并根据各分区的分配情况只针对有垃圾回收需求的分区启动紧急回收策略或者非紧急回收策略,对于存储空间不紧张的分区不采取垃圾回收行动。也就是在分区YAFFS2文件系统中,垃圾回收过程针对每个分区来说是独立进行的,互不干扰。

4)checkpoint机制

checkpoint信息不再在整个NAND Flash存储介质上任意存储,而是每个分区独立保存各自对应的checkpoint信息,防止在加载分区文件系统时造成跨分区数据访问。

其中,yaffs_calc_checkpt_blocks_required(dev)原本是计算整个NAND Flash存储介质上是否有足够空间来保存整个YAFFS2文件系统的checkpoint信息,已修改为计算分区内的剩余空间能否满足分区checkpoint需求。

5)文件系统加载机制

分区的加载是独立的,如果通过checkpoint加载失败则转而通过扫描整个分区区域加载,而通过checkpoint加载成功的分区则无需再通过扫描进行加载。

3 实验和结果分析

3.1 实验环境

本文使用的实验环境软件平台为Ubuntu 12.04,操作系统内核版本号为3.11.0-15-generic;实验硬件平台基础采用的CPU处理器型号为Intel Core i7 CPU 2.74 GHz,内存大小和型号为4G DDR3 1 600 MHz,并使用Linux操作系统自带的NANDSIM模块在内存中模拟NAND Flash存储器作为分区YAFFS2文件系统的测试载体。模拟生成的NAND Flash存储芯片其总容量为1G,其物理块数为8 192块,每块页数为62页,每个物理页大小为2 kb。

3.2 实验结果分析

本文借助IOzone测试工具实现对分区YAFFS2文件系统的读写性能测试和评估。由于本文针对载荷数据研究YAFFS2文件系统分区管理对存储效率的影响,因此本文选择IOzone工具的多线程测试模式,相当于每个载荷各自对应于一个线程,测试命令为:iozone-s 4m-i 0-i 1-r 2m-l 1-u 4-I-o-Rb/home/wucanqiang/test/4m-2m-1-4.xls

其中,配置项-s表示文件大小,-r表示记录块大小(在测试过程中手动配置,测试范围为2K~4M),-l表示最小线程数为1个,-u表示最大线程数为4个。

为保证实验数据可信度,本文将底层文件访问粒度(文件大小)设置为4 M,缓存大小设置为1 M,并通过IOzone对物理存储设备直接写入读出的方式(配置项-I-o)进行100次读写操作,计算其平均读写速度值,规避缓存对读写速度产生的影响。根据IOzone测试工具生成的报表数据,文中为了便于实验数据分析,将其转化为图5和图6的折线图。

图5 分区前后YAFFS2文件系统读速度变化情况

如图5所示,其横坐标表示记录块大小,即从4 M的文件大小下所读取数据大小,纵坐标表示分区前后YAFFS2文件系统的读速率,图中浅色曲线表示分区YAFFS2文件系统的读速度变化情况,深色曲线表示原YAFFS2文件系统的读速度变化情况。从图中数据可以明显看出,分区YAFFS2文件系统相对了原YAFFS2文件系统在实现对文件数据大小记录块的读操作时,其读速度稳定优于原YAFFS2文件系统。

图6 分区前后YAFFS2文件系统写速度变化情况

如图6所示,其横坐标表示写入文件数据大小,纵坐标表示分区前后YAFFS2文件系统的写速率,图中浅色曲线表示分区YAFFS2文件系统的写速度变化情况,深色曲线表示原YAFFS2文件系统的写速度变化情况。从图中数据可以看出,YAFFS2文件系统引入分区管理功能之后并没有对原YAFFS2文件系统的写速度造成影响,同时又能保证在多任务环境下对复杂的大数据检索效率得到一定提高,并使得载荷数据能分类独立存储,提高载荷数据的可靠性。

4 结 论

在星载环境中,载荷/任务数据种类和数据量多,对于数据的查找方式一般既要区分载荷类型又得区分时间段等多重信息。通过对YAFFS2文件系统优缺点的深入研究和分析,本文提出在YAFFS2文件系统的基础上实现分区策略架构,通过引入分区管理功能,实现对多种载荷/任务数据的隔离管理和对分区的访问控制。使得对于上层用户来说,底层存储介质存放的数据是安全独立的,不会掺杂其它无关数据内容和其它载荷/任务数据,以此增加多载荷/任务数据的可靠性以及提高对复杂数据的检索效率。实验结果表明,分区YAFFS2文件系统分区管理功能正常,同时分区YAFFS2文件系统读写速度均稳定优于原YAFFS2文件系统。但在实验过程中发现,因为YAFFS2文件系统在数据结构设计上的复杂性,使得YAFFS2文件系统只能管理几十GB的数据量,无法满足未来星载数据存储管理要求,因此提出针对YAFFS2文件系统管理空间的优化设计将是本文下一步的研究重点方向。

猜你喜欢

数据结构分区载荷
交通运输部海事局“新一代卫星AIS验证载荷”成功发射
上海实施“分区封控”
浪莎 分区而治
滚转机动载荷减缓风洞试验
“翻转课堂”教学模式的探讨——以《数据结构》课程教学为例
高职高专数据结构教学改革探讨
基于SAGA聚类分析的无功电压控制分区
基于多种群遗传改进FCM的无功/电压控制分区
一种基于白噪声响应的随机载荷谱识别方法
底排药受力载荷及其分布规律