一种闪存文件系统及其数据管理方法与流程

文档序号:15163733发布日期:2018-08-14 17:10阅读:133来源:国知局

本发明涉及但不限于存储技术领域,具体涉及一种闪存文件系统及其数据管理方法。



背景技术:

闪存(flashmemory)是一种电子式可擦除编程存储器,与传统的磁盘介质相比,闪存具有读写带宽高、访问延迟低、功耗低、稳定性强的特点,目前,闪存已经开始在数据中心、个人电脑、移动设备上普及。闪存以页为单位进行读写,当闪存重写一个页之前,需要先进行擦除操作。闪存以块为单位进行擦除,一个闪存块中包含几百个闪存页。闪存的单元具有有限次的擦写操作,即每个闪存单元具有有限的寿命。

在文件系统中,使用页高速缓存来缓存最近操作的数据,以加速读写过程。当需要读取数据时,首先在页高速缓存中查找该部分内容是否驻留在内存中,如果找到,则直接返回数据;如果没找到,再到闪存中进行读取。当需要进行写操作时,不再直接把数据写入到设备中,而是把数据写入到页高速缓存后将相应页面标记为脏页,然后直接返回。当用户发出同步调用或操作系统后台线程启动同步操作时,将页高速缓存中的脏页写入到闪存设备中。

由于一次写操作将整个页面标记为脏页,这样,即使本次写操作仅仅涉及到该页面的很少一部分,当执行同步操作时,仍会将整个页面写入到闪存设备中。这使得写入数据量大大增加,不仅增加了同步操作的延时,降低了系统的性能,而且增加了闪存设备的磨损,大大降低了其寿命。



技术实现要素:

本发明实施例提供一种闪存文件系统及其数据管理方法,能够避免不必要的数据写入。

为了达到本发明目的,本发明实施例的技术方案是这样实现的:

本发明实施例提供了一种闪存文件系统,包括:创建模块、标记模块、同步模块和回填模块;其中,

创建模块,用于在创建文件系统时,将闪存划分成文件系统区和闪存缓冲区;

标记模块,用于在有数据写入且写入的数据量小于或等于预设标记阈值时,在内存缓存中将写入数据标记为脏数据,其中,所述标记阈值用于表示写入内存缓存的需要按数据粒度进行标记的数据量大小;

同步模块,用于在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入闪存缓冲区,并当闪存缓冲区已满时,通知回填模块;

回填模块,用于接收到同步模块的通知,读出闪存缓冲区中的脏数据并将其写入文件系统区,并擦除闪存缓冲区。

进一步地,所述闪存缓冲区包括第一闪存缓冲区和第二闪存缓冲区;其中,

所述同步模块具体用于:在需要进行数据同步时,将所述内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入第一闪存缓冲区;当第一闪存缓冲区已满时,发送第一通知至回填模块,并在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入第二闪存缓冲区;第二闪存缓冲区已满时,发送第二通知至回填模块,并在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入第一闪存缓冲区;

所述回填模块具体用于:当接收到所述同步模块的第一通知时,读出第一闪存缓冲区中的脏数据并将其写入文件系统区,并擦除第一闪存缓冲区;当接收到同步模块的第二通知时,读出第二闪存缓冲区中的脏数据并将其写入文件系统区,并擦除第二闪存缓冲区。

进一步地,所述标记模块具体用于:在有数据写入且写入的数据量小于或等于所述标记阈值时,将所述写入数据对应的文件的索引节点号、数据段所在的页面号、页面内的偏移量、数据段的长度以及数据段内容封装成记录,将记录添加至预设的脏数据列表;并将写入数据对应的内存缓存页面的引用计数加一。

进一步地,所述同步模块具体用于:

根据所述写入数据对应的文件的索引节点号查找该文件的所有记录,申请新的内存页面,将多个记录的内容顺序拷贝至所述新的内存页面,将所述新的内存页面的内容顺序写入到闪存缓冲区。

进一步地,所述系统还包括:恢复模块,用于在闪存文件系统重启时,检测闪存缓冲区中是否有脏数据;

如果闪存缓冲区中有脏数据,读出闪存缓冲区的所有脏数据,根据每条脏数据更新所述内存缓存的内容。

本发明实施例还提供了一种闪存文件系统的数据管理方法,包括:

在创建文件系统时,将闪存划分成文件系统区和闪存缓冲区;

在有数据写入且写入的数据量小于等于预设标记阈值时,在内存缓存中将写入数据标记为脏数据,其中,所述标记阈值用于表示写入内存缓存的需要按数据粒度进行标记的数据量大小;

在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入闪存缓冲区;

当闪存缓冲区已满时,读出闪存缓冲区中的脏数据并将其写入文件系统区,并擦除闪存缓冲区。

进一步地,所述闪存缓冲区包括第一闪存缓冲区和第二闪存缓冲区;其中,

在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入第一闪存缓冲区;

当第一闪存缓冲区已满时,将第二闪存缓冲区设成当前缓冲区,用于在需要进行数据同步时,写入数据使用;同时读出第一闪存缓冲区中的脏数据并将其写入文件系统区,并擦除第一闪存缓冲区;

当第二闪存缓冲区已满时,将第一闪存缓冲区设成当前缓冲区,用于在需要进行数据同步时,写入数据使用;同时读出第二闪存缓冲区中的脏数据并将其写入文件系统区,并擦除第二闪存缓冲区。

进一步地,所述在内存缓存中将写入数据标记为脏数据,具体包括:将所述写入数据对应的文件的索引节点号、数据段所在的页面号、页面内的偏移量、数据段的长度以及数据段内容封装成记录,将记录添加至预设的脏数据列表;并将写入数据对应的内存缓存页面的引用计数加一。

进一步地,所述将脏数据列表中的脏数据合并后写入闪存缓冲区,具体包括:

根据写入数据对应的文件的索引节点号查找该文件的所有记录,申请新的内存页面,将多个记录的内容顺序拷贝至所述新的内存页面,将所述新的内存页面的内容顺序写入到闪存缓冲区。

进一步地,所述的数据管理方法,还包括:

在闪存文件系统重启时,检测闪存缓冲区中是否有脏数据;

如果闪存缓冲区中有脏数据,读出闪存缓冲区的所有脏数据,根据每条脏数据更新所述内存缓存的内容。

本发明的闪存文件系统及其数据管理方法,通过对脏数据进行标记,并将脏数据合并后写入闪存,避免了不必要的数据写入,从而降低了同步操作的延时,提高了闪存的使用寿命;

进一步地,通过设置第一闪存缓冲区和第二闪存缓冲区,在系统回填其中一个闪存缓冲区期间,由另一缓冲区充当当前缓冲区,期间的同步操作均顺序写入到另一缓冲区中,因此不会因为回填造成整个系统停下来等待的情况;两块缓冲区轮流交替使用,保证了系统的正常运转。

附图说明

图1是本发明实施例提供的一种闪存文件系统的结构示意图;

图2是本发明实施例提供的闪存文件系统的数据结构示意图;

图3是本发明实施例的合并记录的数据结构示意图;

图4是本发明实施例的写入闪存缓冲区的数据结构示意图;

图5是本发明实施例的回填操作的数据结构示示意图。

图6是本发明实施例提供的另一种闪存文件系统的结构示意图;

图7是本发明实施例的故障恢复的数据结构示意图;

图8是本发明实施例提供的闪存文件系统的数据管理方法的流程示意图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚明白,下文中将结合附图对本申请的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。

在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。

在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。

参照下面的描述和附图,将清楚本发明的实施例的这些和其他方面。在这些描述和附图中,具体公开了本发明的实施例中的一些特定实施方式,来表示实施本发明的实施例的原理的一些方式,但是应当理解,本发明的实施例的范围不受此限制。相反,本发明的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。

如图1所示,根据本发明的一种闪存文件系统,包括:创建模块11、标记模块12、同步模块13和回填模块14;其中,

创建模块11,用于在创建文件系统时,将闪存划分成文件系统区和闪存缓冲区;

标记模块12,用于在有数据写入且写入的数据量小于等于预设标记阈值时,在内存缓存中将写入数据标记为脏数据,其中,所述标记阈值用于表示写入内存缓存的需要按数据粒度进行标记的数据量大小;

同步模块13,用于在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入闪存缓冲区,并当闪存缓冲区已满时,通知回填模块;

回填模块14,用于接收到同步模块的通知,读出闪存缓冲区中的脏数据并将其写入文件系统区,并擦除闪存缓冲区。

需要说明的是,本发明所述的脏数据,指的是被进程修改了的内存缓存里的数据。现有的文件系统以页作为内存缓存的单位,当进程修改了内存缓存里的数据时,该页就被标记为脏页。本发明以字节为粒度,将所述写入数据标记为脏数据,以避免不必要的数据写入。

进一步地,所述闪存缓冲区的大小,由用户指定或者系统预先设置。

具体地,如果由用户指定闪存缓冲区的大小,在创建和挂载文件系统时,根据用户传递的缓冲区大小参数,在闪存设备上划分出一块单独的区域充当缓冲区。文件系统进行物理空间分配时,分配的空间都不在此闪存缓冲区之内,因此闪存缓冲区不会被文件系统所索引。

进一步地,所述闪存缓冲区包括第一闪存缓冲区和第二闪存缓冲区;其中,

所述同步模块具体用于:在需要进行数据同步时,将所述内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入第一闪存缓冲区;第一闪存缓冲区已满时,发送第一通知至回填模块,并在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入第二闪存缓冲区;第二闪存缓冲区已满时,发送第二通知至回填模块,并在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入第一闪存缓冲区;

所述回填模块具体用于:当接收到同步模块的第一通知时,读出第一闪存缓冲区中的脏数据并将其写入文件系统区,并擦除第一闪存缓冲区;当接收到同步模块的第二通知时,读出第二闪存缓冲区中的脏数据并将其写入文件系统区,并擦除第二闪存缓冲区。

通过设置两块闪存缓冲区,在系统回填其中一个闪存缓冲区期间,由另一缓冲区充当当前缓冲区,期间的同步操作均顺序写入到另一缓冲区中,因此不会因为回填造成整个系统停下来等待的情况;两块缓冲区轮流交替使用,保证了系统的正常运转。

进一步地,所述内存缓存为页高速缓存。

进一步地,所述标记模块12还用于,在有数据写入且写入的数据量大于预设标记阈值时,按现有的输入输出(io)路径进行处理。

在本发明的一实施例中,所述按现有的io路径进行处理,具体为:将写入数据写入页高速缓存,将数据对应的页面标记为脏页,然后返回。

进一步地,所述标记阈值的大小,可以根据具体的加速读取过程设置。例如,可以将标记阈值设置为内存页面大小的一半(4096*50%=2048字节),或者为内存页面大小的80%(4096*80%=3276.8字节)。

进一步地,标记模块12具体用于:在有数据写入且写入的数据量小于等于预设标记阈值时,将写入数据对应的文件的索引节点号(inodenumber)、数据段所在的页面号(pagenumber)、页面内的偏移量(pageoffset)、数据段的长度(length)以及数据段内容(data)封装成记录(record),即<inodenumber,pagenumber,pageoffset,length,data>的形式,将记录添加至预设的脏数据列表;并将相应的页高速缓存页面的引用计数加一。

需要说明的是,本发明的标记模块12既可以使用预设的脏数据列表来标记脏数据,也可以使用其他的方法来标记脏数据。所述的脏数据列表可以使用任意的数据结构,如数组、树形列表、链表等。

值得注意的是,标记模块12将写入数据添加至脏数据列表时,并不将相应的页高速缓存页面标记为脏页,而是强制将相应的页高速缓存页面的引用计数加一,从而使得页高速缓存中的写入数据不被写入到闪存设备上,强制保留这部分页高速缓存页面,以供快速读取。

进一步地,所述记录中的数据段内容可以是数据段的具体内容,也可以是一个指向页高速缓存对应页面的指针(datapointer)。

进一步地,标记模块12使用基树和链表来组织和管理同一个文件的所有记录。使用基树是为了方便检索,使用链表是为了方便遍历。基树(radix_tree)是一种不太常用的数据结构,是linux文件系统的一种存储方式,树结构主要包含三个指针:根指针(root):指向树的根结点;空闲指针(free):指向空闲的结点链表;开始指针(start):指向空闲的内存块,每个使用中的节点使用parent、left、right指针相互连接,空闲的结点通过right指针连成一个链表。索引节点(inode)是在许多类unix文件系统中的一种数据结构,每个索引节点保存了文件系统中的一个文件系统对象的元信息数据,但不包括数据内容或者文件名。

如图2所示,标记模块12维护了一棵基树,所述基树以索引节点号为索引,相应的叶子节点代表了一个文件;为了方便遍历,将基树中的所有叶子结点使用链表链接起来。该基树中的每一个叶子节点也维持了一棵基树,以页面号为索引,每个叶子节点表示某个页面的记录。每条记录包括五个元素:索引节点号、页面号、页内偏移值、数据段长度和一个指向页高速缓存对应页面的指针,即<inodenumber,pagenumber,offset,length,datapointer>的形式,为了方便遍历,同一文件的所有记录也用链表链接起来。

在接收到写入请求时,标记模块12根据本次写操作的索引节点号在图2中的基树中进行搜索查找,如果没有找到相应的叶子节点,则新建一个叶子节点,并将其插入基树和链接叶子节点的链表中;然后在该叶子节点的基树中以本次写操作涉及的页面号为索引,查找相应的记录;如果没有找到相应的记录,则新建一条记录,将其索引节点号、页面号、页内偏移值、数据段长度和内存页面指针相应赋值;如果找到了相应的记录,则两条记录需要进行合并,索引节点号、页面号和内存页面指针不变,对页内偏移值和数据段长度,有如下更新:

newoffset=min(oldoffset,currentoffset)

newlength=max(oldoffset+oldlength,currentoffset+currentlength)–newoffset

其中newoffset表示新纪录的页内偏移值,oldoffset表示原纪录的页内偏移值,currentoffset表示当前写入操作的页内偏移值,newlength表示新纪录的数据段长度,oldlength表示原纪录的数据段长度,currentlength表示当前写入操作的数据段长度。根据以上情况计算得到新纪录的各项值以后,将其插入基树和链表中。然后仍然对页高速缓存中的内存页面进行更新,但是为了防止文件系统将该内存页面整页写入闪存设备,系统不再将该页面标记为脏。由于页面不再标记为脏,随时有被文件系统回收的危险,为了维护数据的高效读取和一致性,强制将内存页面的引用计数加一,从而强制保证其不被回收。这样,后续的读取操作仍然通过页高速缓存中的页面读取。

进一步地,同步模块13具体用于:根据写入数据对应的文件的索引节点号查找该文件的所有记录,申请新的内存页面,将多个记录的内容顺序拷贝至所述新的内存页面,将所述新的内存页面的内容顺序写入到闪存缓冲区。

具体地,如图3所示,在需要进行数据同步时,同步模块13在图2所示的基树中根据索引节点号找到相应的叶子节点,申请新的内存页面,然后遍历该叶子节点的所有记录,对于每一条记录所指向的页高速缓存数据段,把它们从页高速缓存中拷贝到所述新的内存页面,并把当前记录的信息,包括索引节点号、页面号、页面内偏移、数据段长度等值也一并拷贝到所述新的内存页面,然后将记录结构从图2的数据结构中删除;然后,参照图4,将所述新的内存页面中的内容顺序写入到闪存缓冲区;接着重复上述过程,直到属于该文件的所有记录处理完毕。

进一步地,当写入到闪存缓冲区的新的内存页面的内容不满一页或不是内存页面大小的整数倍时,填充无意义数据,以使得新的内存页面的内容满一页或是内存页面大小的整数倍。

进一步地,参照图5,回填模块14具体用于:当接收到同步模块13的通知时,首先,回填模块14遍历图2所示的数据结构,对其中的每一个叶子节点,再遍历其所有的记录,每一个记录指向页高速缓存中的一个内存页面,将这些由记录指向的内存页面全都标记为脏,并将引用计数减一(在接收到写入请求时,形成记录,并将记录指向的内存页面的引用计数加一,以强制保留内存页面);然后从图2的数据结构中删除该记录,当一个节点的所有记录处理完毕时,将该节点从基树中删除;当基树中的所有节点都处理完毕时,将整个缓冲区擦除。

进一步地,参照图6,还包括恢复模块15,用于在闪存文件系统重启时,检测闪存缓冲区中是否有脏数据;

如果闪存缓冲区中有脏数据,读出闪存缓冲区的所有脏数据,根据每条脏数据更新所述内存缓存的内容。

当发生突然掉电等意外事件时,需要进行系统故障恢复。具体地,如图7所示,在闪存文件系统重启时,回复模块15检测闪存缓冲区中是否有脏数据;如果闪存缓冲区中有脏数据,从闪存缓冲区中读出所有的记录,对于其中的每一条记录,根据其中的索引节点号和页面号,从文件系统区读出相应的数据(该数据为陈旧数据),然后根据页内偏移值,将记录中的内容拷贝到页高速缓存相应的页面;重复上述过程直到所有的记录都处理完毕。此时整个系统已经恢复到最新状态,故障恢复过程结束。

如图8所示,根据本发明的一种闪存文件系统的数据管理方法,包括:

在创建文件系统时,将闪存划分成文件系统区和闪存缓冲区;

在有数据写入且写入的数据量小于等于预设标记阈值时,在内存缓存中将写入数据标记为脏数据,其中,所述标记阈值用于表示写入内存缓存的需要按数据粒度进行标记的数据量大小;

在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入闪存缓冲区;

当闪存缓冲区已满时,读出闪存缓冲区中的脏数据并将其写入文件系统区,并擦除闪存缓冲区。

需要说明的是,本发明所述的脏数据,指的是被进程修改了的内存缓存里的数据。现有的文件系统以页作为内存缓存的单位,当进程修改了内存缓存里的数据时,该页就被标记为脏页。本发明以字节为粒度,将所述写入数据标记为脏数据,以避免不必要的数据写入。

进一步地,所述闪存缓冲区的大小,由用户指定或者系统预先设置。

具体地,如果由用户指定闪存缓冲区的大小,在创建和挂载文件系统时,根据用户传递的缓冲区大小参数,在闪存设备上划分出一块单独的区域充当缓冲区。文件系统进行物理空间分配时,分配的空间都不在此闪存缓冲区之内,因此闪存缓冲区不会被文件系统所索引。

进一步地,所述闪存缓冲区包括第一闪存缓冲区和第二闪存缓冲区;其中,

在需要进行数据同步时,将内存缓存中的所有脏数据或要同步的文件的脏数据合并后写入第一闪存缓冲区;

当第一闪存缓冲区已满时,将第二闪存缓冲区设成当前缓冲区,用于需要进行数据同步时,写入数据使用;同时读出第一闪存缓冲区中的脏数据并将其写入文件系统区,并擦除第一闪存缓冲区;

当第二闪存缓冲区已满时,将第一闪存缓冲区设成当前缓冲区,用于需要进行数据同步时,写入数据使用;同时读出第二闪存缓冲区中的脏数据并将其写入文件系统区,并擦除第二闪存缓冲区。通过设置两块闪存缓冲区,在系统回填其中一个闪存缓冲区期间,由另一缓冲区充当当前缓冲区,期间的同步操作均顺序写入到另一缓冲区中,因此不会因为回填造成整个系统停下来等待的情况;两块缓冲区轮流交替使用,保证了系统的正常运转。

进一步地,所述数据管理方法还包括,在有数据写入且写入的数据量大于标记阈值时,按现有的输入输出(io)路径进行处理。

在本发明的一实施例中,所述按现有的io路径进行处理,具体为:将写入数据写入页高速缓存,将数据对应的页面标记为脏页,然后返回。

进一步地,所述内存缓存为页高速缓存。

进一步地,所述标记阈值的大小,可以根据具体的加速读取过程设置。例如,可以将标记阈值设置为内存页面大小的一半(4096*50%=2048字节),或者为内存页面大小的80%(4096*80%=3276.8字节)。

进一步地,所述在内存缓存中将写入数据标记为脏数据,具体包括:将写入数据对应的文件的索引节点号(inodenumber)、数据段所在的页面号(pagenumber)、页面内的偏移量(pageoffset)、数据段的长度(length)以及数据段内容(data)封装成记录(record),即<inodenumber,pagenumber,pageoffset,length,data>的形式,将记录添加至预设的脏数据列表;并将相应的页高速缓存页面的引用计数加一。

需要说明的是,本发明既可以使用预设的脏数据列表来标记脏数据,也可以使用其他的方法来标记脏数据。所述的脏数据列表可以使用任意的数据结构,如数组、树形列表、链表等。

值得注意的是,本发明的数据管理方法,将写入数据添加至脏数据列表时,并不将相应的页高速缓存页面标记为脏页,而是强制将相应的页高速缓存页面的引用计数加一,从而使得页高速缓存中的写入数据不被写入到闪存设备上,强制保留这部分页高速缓存页面,以供快速读取。

进一步地,所述记录中的数据段内容可以是数据段的具体内容,也可以是一个指向页高速缓存对应页面的指针(datapointer)。

进一步地,所述数据管理方法使用基树和链表来组织和管理同一个文件的所有记录。使用基树是为了方便检索,使用链表是为了方便遍历。基树(radix_tree)是一种不太常用的数据结构,是linux文件系统的一种存储方式,树结构主要包含三个指针:根指针(root):指向树的根结点;空闲指针(free):指向空闲的结点链表;开始指针(start):指向空闲的内存块,每个使用中的节点使用parent、left、right指针相互连接,空闲的结点通过right指针连成一个链表。索引节点(inode)是在许多类unix文件系统中的一种数据结构,每个索引节点保存了文件系统中的一个文件系统对象的元信息数据,但不包括数据内容或者文件名。

如图2所示,本发明的文件系统维护了一棵基树,所述基树以索引节点号为索引,相应的叶子节点101代表了一个文件;为了方便遍历,将基树中的所有叶子结点101使用链表链接起来。该基树中的每一个叶子节点也维持了一棵基树,以页面号为索引,每个叶子节点表示某个页面的记录。每条记录包括五个元素:索引节点号、页面号、页内偏移值、数据段长度和一个指向页高速缓存对应页面的指针,即<inodenumber,pagenumber,offset,length,datapointer>的形式,为了方便遍历,同一文件的所有记录也用链表链接起来。

在有数据写入时,根据本次写操作的索引节点号在图2中的基树中进行搜索查找,如果没有找到相应的叶子节点,则新建一个叶子节点,并将其插入基树和链接叶子节点的链表中;然后在该叶子节点的基树中以本次写操作涉及的页面号为索引,查找相应的记录;如果没有找到相应的记录,则新建一条记录,将其索引节点号、页面号、页内偏移值、数据段长度和内存页面指针相应赋值;如果找到了相应的记录,则两条记录需要进行合并,索引节点号、页面号和内存页面指针不变,对页内偏移值和数据段长度,有如下更新:

newoffset=min(oldoffset,currentoffset)

newlength=max(oldoffset+oldlength,currentoffset+currentlength)–newoffset

其中newoffset表示新纪录的页内偏移值,oldoffset表示原纪录的页内偏移值,currentoffset表示当前写入操作的页内偏移值,newlength表示新纪录的数据段长度,oldlength表示原纪录的数据段长度,currentlength表示当前写入操作的数据段长度。根据以上情况计算得到新纪录的各项值以后,将其插入基树和链表中。然后仍然对页高速缓存中的内存页面进行更新,但是为了防止文件系统将该内存页面整页写入闪存设备,系统不再将该页面标记为脏。由于页面不再标记为脏,随时有被文件系统回收的危险,为了维护数据的高效读取和一致性,强制将内存页面的引用计数加一,从而强制保证其不被回收。这样,后续的读取操作仍然通过页高速缓存中的页面读取。

进一步地,将要同步的文件的脏数据合并后写入闪存缓冲区,具体包括:根据写入数据对应的文件的索引节点号查找该文件的所有记录,申请新的内存页面,将多个记录的内容顺序拷贝至所述新的内存页面,将所述新的内存页面的内容顺序写入到闪存缓冲区。

具体地,如图3所示,在需要进行数据同步时,在图2所示的基树中根据索引节点号找到相应的叶子节点,申请新的内存页面,然后遍历该叶子节点的所有记录,对于每一条记录所指向的页高速缓存数据段,把它们从页高速缓存中拷贝到所述新的内存页面,并把当前记录的信息,包括索引节点号、页面号、页面内偏移、数据段长度等值也一并拷贝到所述新的内存页面,然后将记录结构从图2的数据结构中删除;然后,参照图4,将所述新的内存页面中的内容顺序写入到闪存缓冲区;接着重复上述过程,直到属于该文件的所有记录处理完毕。

进一步地,当写入到闪存缓冲区的新的内存页面的内容不满一页或不是内存页面大小的整数倍时,填充无意义数据,以使得新的内存页面的内容满一页或是内存页面大小的整数倍。

进一步地,当当前缓冲区已满时,如图5所示,首先,遍历图2所示的数据结构,对其中的每一个叶子节点,再遍历其所有的记录,每一个记录指向页高速缓存中的一个内存页面,将这些由记录指向的内存页面全都标记为脏页,并将引用计数减一(在接收到写入请求时,形成记录,并将记录指向的内存页面的引用计数加一,以强制保留内存页面),将脏页写入文件系统区中;然后从图2的数据结构中删除该记录,当一个节点的所有记录处理完毕时,将该节点从基树中删除;当基树中的所有节点都处理完毕时,将整个缓冲区擦除。

进一步地,所述数据管理方法还包括,在闪存文件系统重启时,检测闪存缓冲区中是否有脏数据;

如果闪存缓冲区中有脏数据,读出闪存缓冲区的所有脏数据,根据每条脏数据更新所述内存缓存的内容。

当发生突然掉电等意外事件时,需要进行系统故障恢复。具体地,如图7所示,在闪存文件系统重启时,检测闪存缓冲区中是否有脏数据;如果闪存缓冲区中有脏数据,从闪存缓冲区中读出所有的记录,对于其中的每一条记录,根据其中的索引节点号和页面号,从文件系统索引区读出相应的数据(该数据为陈旧数据),然后根据页内偏移值,将记录中的内容拷贝到页高速缓存相应的页面;重复上述过程直到所有的记录都处理完毕。此时整个系统已经恢复到最新状态,故障恢复过程结束。

本发明的闪存文件系统及其数据管理方法,通过对脏数据进行标记,并将脏数据合并后写入闪存,避免了不必要的数据写入,从而降低了同步操作的延时,提高了闪存的使用寿命;

进一步地,通过设置第一闪存缓冲区和第二闪存缓冲区,在系统回填其中一个闪存缓冲区期间,由另一缓冲区充当当前缓冲区,期间的同步操作均顺序写入到另一缓冲区中,因此不会因为回填造成整个系统停下来等待的情况;两块缓冲区轮流交替使用,保证了系统的正常运转。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现,相应地,上述实施例中的各模块/模块可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本申请不限制于任何特定形式的硬件和软件的结合。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1