APP下载

Smartphone 类手机数据库设计

2013-03-19刘洲洲

微处理机 2013年3期
关键词:数据库系统字节数据库

刘洲洲

(西安航空学院,西安 710077)

1 引言

随着多媒体移动终端(PDA,智能手机)的快速发展,手机已经不再只是用于语音通信的手持设备,而成为集成了MP3、MP4 以及上网移动办公等附加功能的嵌入式通信平台。同时移动通信网络的服务能力和承载能力也取得大幅度的提升,其发展也趋于智能化,各种功能都将变得更为强劲[1-2]。与此同时,手机需要管理的数据量也越来越大,传统的手机软件系统很难适应新的需要。现在的主流手机都是简单地从存储介质上直接读取短信、电话簿和通话记录等,也就是基于文件系统实现的,这样的架构有一个最大的弊端,那就是数据库受到了文件系统的牵制,文件系统的低效率会直接影响到数据库的存取速度。现在要改为基于数据库设备,直接面向Flash 驱动的方案进行设计研究。

2 数据库方案设计

文中的Smartphone是Accelerator Technology 公司开发的一种嵌入式RTOS 产品,其操作系统为Nucleus,只需一次性购买Licenses,就可以获得操作系统的源码,目前手机行业有很多使用Nucleus 操作系统。测试平台采用展讯的SC6600 基带处理芯片,多媒体芯片则采用广达的QCP1880 芯片平台,音频编解码芯片采用Wolfson 8750 芯片。

数据库设备是这样一个概念,用一块Flash的一段连续空间构成数据库存储介质,在此基础上加上数据库驱动和一个简单的FMM,就构成了数据库设备,它向数据库系统提供一个可逆的连续逻辑地址空间。所谓可逆就是在Flash 整理的时候,物理地址改动而逻辑地址不变。所谓连续指的是数据库设备向数据库系统提供的是一个线性连续的地址空间,但是在设备低层,依然是一个块设备,一个块定义为一个擦除块的大小,根据Flash的硬件特性可能是64K 或者16K。

本中所描述的数据库并不是一个关系数据库,每个数据库由一个个数据库名和若干个变长的记录外加一个或者多个索引表构成。索引表按照一定的规则对记录进行排序。记录主要由一个类别加上一个目录信息再加上记录数据构成。目录是一种特别的记录,它的类别表明它是一个目录,它的数据是一个字符串表示目录名。索引表以一个记录的形式保存到数据库里,并用记录类别加以区分。数据库基于数据库设备,与文件系统以及注册表无关,这可能会对数据库初始化及打开数据库带来不便,但是这种独立性有两个好处,一是便于移植,二是其他模块的BUG 甚至崩溃都不会直接影响数据库系统。

2.1 数据库设备

文中采取的方案为数据库设备向下直接面向Flash 驱动,向上向数据库系统提供线性的寻址空间,它用一个地址映射表来实现将Flash的一个个擦除块映射成为一个连续的可逆逻辑地址空间。逻辑地址从0 开始编址,如果设备大小是2M,那么逻辑地址就是0x00000000 到0x00200000。数据库设备是和数据库相关的,表现在几个方面。第一,虽然逻辑地址是连续的,但是数据库要求每个记录不能跨Bank(注:文中提到的Bank 就是一个擦除块,大小为64K),也就是说记录必需写在同一个擦除块中,以便整理脏块;这要求数据库设备要提供动态分配记录空间的能力。第二,整理脏块时,数据库设备不能独立完成,必须依赖于记录索引表,因为已经删除的记录在索引表中有删除标记。第三,为了完成动态分配记录空间的功能,数据库设备必需记录每个查处块的使用情况,包括已经用掉多少、剩余多少、脏块多少等等,这些数据的来源都是数据库操作。第四,有关掉电保护,块擦除时掉电保护由设备层独立完成,但是记录在增、删、改等操作时的掉电保护要靠数据库系统的操作次序保障。

为了便于描述,假定数据库设备大小为2M,每个擦除块大小为64K,这样一共有32个擦除块,其中有一个块作为Bank0的交换块,可用的只有31个块。为了实现地址映射,给这31个擦除块每个块的前四个字节写入块ID 号,ID 号由28 位Bank 号加上4 位Flag 构成,数据结构如下:

0~27Bits,Bank 号

28~31Bits,Flag

其中,Bank 号是地址映射表的下标序号,取值范围0~30。Flag是掉电保护标志,具体含义如下:

Flag=0xF 表示该Bank 空闲(Free)。

Flag=0xE 表示正在整理过程中,该Bank是交换块,而且数据转存完成,系统正在擦除原来的脏块。

Flag=0xC 表示该Bank 在使用中,其中的记录有效。

Flag=0x8 表示该Bank为脏块,需要擦除。

Flag=其他 无效标志,该Bank 需要擦除。

在系统启动,数据库设备初始化时,扫描这32个块ID 号,并在内存中动态生成一个映射表,因为有一个保留的交换块,所以可以填写的只有31个节点,定义最后一个节点记录保留块的地址信息,其余各个节点内容除了包含该节点的物理地址信息,还应该包含该Bank的使用情况信息(如:剩余,脏多少),这些信息在数据库设备的其他功能中会用到。

数据库设备向数据库系统提供动态分配记录空间的功能。为了回收脏块的方便,数据库记录必需存放在同一个擦除块,不能跨Bank 存放。分配的依据是地址映射表中的Free 字段,为了减少碎片以及均匀使用各个物理块,分配原则是优先分配那些Free 较小的Bank。同时删除、修改记录会产生脏块,这些脏块需要回收才能再次被利用。回收的触发发生在写记录时,当设备空间分配引擎报告没有剩余空间时,触发脏块回收功能。脏块回收需要先选中一个回收的目标块,根据地址映射表中的Dirty字段,原则是Dirty 越大越优先。选定一个目标块后,需要将该块中的有效记录全部搬至其他Bank,这一步可以理解为一个修改记录的过程,修改记录可以将记录转存到其他Bank,然后再删除原来的记录。当该Bank的所有记录转移后,调用Flash 驱动的块擦除函数,擦除完成后再写入ID 号,同时修改地址映射表,Dirty 和Free 字段清零。

2.2 数据块初始化和架构

数据库系统初始化分两步,首先是数据库设备初始化,其次才是数据库自身初始化。设备初始化类似于FMM 初始化,它的主要工作是扫描整个设备,获得地址映射表的各项数据。首先要扫描各个Bank ID,填写Addr 字段。然后扫描各个Bank 记录,获取该Bank 已经用掉的空间和删除的记录空间,计算出剩余空间(Free)和脏块大小(Dirty)。

整个数据库系统由一个记录索引表和数据记录区构成,索引表占用一个Bank,并且定义固定在逻辑Bank0(下面提到的都是逻辑Bank 号)。交换块不占地址空间,只是临时存放在所引表的最后一个节点上。记录区占用其余的所有Bank(1~30)。索引表记录每条数据库记录的地址、记录ID、类别、大小、所属目录等信息,每个表项占12 字节。每个记录有一个唯一的ID,整个数据库系统的所有数据库的所有记录,ID 号不能冲突,而且ID 号可以区分是那个数据库以及记录类别。为了便于管理,数据库系统有一个自己内定的管理数据库(sysdb),它的每一条记录标识着一个用户建立的数据库,内容包含数据库名、索引表的个数、比较函数等信息,数据库名不能重复,大小写不敏感。用户创建、打开数据库时就要访问到sysdb。数据库系统有一个自己内定的管理数据库sysdb,数据库系统初始化时打开这个数据库。sysdb 没有索引记录,它的记录类别只有一种,而且每条记录注册着一个用户创建的数据库。

索引表在Bank0,由32 字节的HEAD 和一个索引表构成,索引表的每项占12 字节,共有5458 项,最后剩余4个字节保留。

数据记录区里面是用户加入数据库的数据信息,系统对这样的信息不做任何解析,只是把它当作一个二进制的数据包,用户必需指明该数据记录所在的目录,目录实际上是一种分类信息,目录信息将加入到Bank0 中记录所引表的目录号字段中。数据记录的大小是用户数据包加上时间戳的大小,也就是说系统打包后的实际大小,数据库设备在存储时,会自动向4 字节对齐。数据记录的格式如下:

4byte时间戳 N byte 用户数据

时间戳用一个DWORD 记录,高字表示Date,低字表示Time,Size=N +4;并赋值给记录所引表的size 字段。每个数据库记录有一个目录属性,表明该记录属于哪个目录,目录实际上是记录的归类信息。目录本身也当作记录存储在数据库中,目录作为记录也有一个所属目录的属性,表明自己的父目录,由此可见整个是一个树状结构,数据记录是叶子节点,树根是sysdb。一个数据库的根目录没有记录和它对应,定义根目录的记录ID 等于0。

目录作为记录,它的格式和数据记录的格式是一样的,也是有一个时间戳加上数据构成。它的数据是目录名,是一个null 结束的字符串,计算记录大小时结束符null 也算一个字节。和文件系统一样,同一个目录下的子目录名不能有重复。本数据库系统对目录的级数以及子目录的个数不做限制,但是受到数据结构的限制,目录的最大个数等于记录的最大个数5458,实际可用5400。

3 关于掉电保护

掉电保护是数据库设备层的基本功能之一,要做到在突然掉电的情况下,资料的完整性不受破坏,这就要求在写操作时,按照一定的步骤,还要依赖于相应的标志位。掉点保护有两个必要条件,一是系统启动后在初始化时,有能力知道上次关机是正常关机还是异常掉电关机。二是系统在任何时候突然掉电,有能力追溯到掉电前的资料信息。

数据库系统用于掉电保护的信息有两个,分别是每个Bank的ID 号和Bank0 索引表中的每个节点的addr。这两个4 字节数据的最后4bit是掉电保护Flag,其含义基本相同,下面详细介绍。

数据库的完整性包括三个方面:①各个擦除块的完整,也就是逻辑地址空间完整、连续、有效;②记录索引表的完整;③记录的完整。只有在写操作过程中突然掉电,才可能对数据库的完整性造成破坏,这些写操作包括记录脏块的整理、Bank0的整理、增加删除修改记录等。

另外,除了数据库设备层的掉电保护,数据库系统还要做好数据库本身的数据相关性保护,保证数据的完整。这些相关性包括目录名不得冲突、排序方法不能相同、排序表必需和排序方法一一对应,排序记录要完整有效等,当然这些都与掉电保护没有关系,它依赖于数据库本身的鲁棒性。

4 测试环境

通过在SC6600(ARM9)+ nucleus+QCP1880的平台上进行测试,比原来的方案存取速度提高10倍以上,而且占用内存也大大减少,仅需要几十个字节。本软件模组在PC 机上开发,经过编译工具embedded Visual C ++编译后,可在CPU为ARM920T的硬件平台下运行[3]。

编程语言:C 语言

操作系统:Nucleus

Nucleus 内核版本:2.4.20

交叉编译工具:VC++&ADS

编译环境:Visual C++

硬件平台:SC6600 或ARM920T

[1]龚星宇,许佳,龚尚福.嵌入式数据库的研究[J].现代电子技术,2007(9):46-49.

[2]张永.嵌入式数据库系统的设计与实现[D].北京:清华大学,2004.

[3]吴飞,王昕.嵌入式移动数据库SQL Server for Windows CE的应用研究[J].微计算机信息,2006 (17):56-59.

猜你喜欢

数据库系统字节数据库
No.8 字节跳动将推出独立出口电商APP
No.10 “字节跳动手机”要来了?
简谈MC7字节码
微细铣削工艺数据库系统设计与开发
江苏省ETC数据库系统改造升级方案探讨
数据库
实时数据库系统数据安全采集方案
数据库
数据库
数据库