具体实施方式
为了能够更加详尽地了解本公开实施例的特点与技术内容,下面结合附图对本公开实施例的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本公开实施例。在以下的技术描述中,为方便解释起见,通过多个细节以提供对所披露实施例的充分理解。然而,在没有这些细节的情况下,一个或多个实施例仍然可以实施。在其它情况下,为简化附图,熟知的结构和装置可以简化展示。
本公开实施例的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开实施例的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。
除非另有说明,术语“多个”表示两个或两个以上。本公开实施例中,字符“/”表示前后对象是一种“或”的关系。例如,A/B表示:A或B。术语“和/或”是一种描述对象的关联关系,表示可以存在三种关系。例如,A和/或B,表示:A或B,或,A和B这三种关系。术语“对应”可以指的是一种关联关系或绑定关系,A与B相对应指的是A与B之间是一种关联关系或绑定关系。
由于Flash的擦除最小单位比较大(几K字节),而且擦除的时间比较长(毫秒),而用户的数据一般比较小(一般几十或者几百字节),所以为了保证用户能最快的更新数据,且充分利用Flash空间,一般采用追加的方式使用Flash介质,即在旧数据后面追加新数据,这样就只要完成数据写就行了,避免了擦除操作。但是当Flash空间写完的时候,需要进行一次数据整理,只保留最新的数据,擦除旧数据,从而为后续的数据更新腾出空间。
本公开实施例中,结合图6a所示,将Flash单向链表的存储空间划分为两种功能区,一种是数据(功能)D区,一种是索引表(功能)T区。
数据D区分成第一数据D1区和第二数据D2区,其中,第一数据D1区用于存储用户数据,第二数据D2用于在数据整理的过程中存储用户数据,第一数据D1区的大小大于第二数据D2区的大小。第二数据D2区的大小至少大于最小删除单元Sector的大小,且比所有用户数据块大,用来做数据中转。
索引表T区分成第一索引表T1区和第二索引表T2区,其中,第一索引表T1区用于存储用户数据块的地址索引,第二索引表T2区用于在数据整理的过程中存储用户数据块的地址索引,第一索引表T1区的大小等于第二索引表T2区的大小。第一索引表T1区能放下所有用户数据块的定位信息。
本公开实施例的Flash单向链表,采用追加的方式更新用户数据,即当用户更新已经写入的数据(块)Bn时,不在原数据位置更新,而是采用追加的方式。用户数据块Bn写入第一数据D1区:如果是第一次写入Bn,则在写完Bn后,将Bn的地址记录索引到第一索引表T1中;如果第一数据D1区已经存在Bn,将新数据写入第一数据D1区后,再将本次的新地址索引记录到上一个数据块Bn的末尾,也就是形成一个单向链表。
结合图1所示,本公开实施例提供一种用于单向链表的数据管理方法,包括以下步骤:
S101,将单向链表的存储空间划分为数据D区和索引表T区;其中,数据D区包括第一数据D1区,索引表T区包括第一索引表T1区和第二索引表T2区。
S102,在第一数据D1区的剩余存储空间不足的情况下,将第一数据D1区中数据的有效地址索引记录到第二索引表T2区。
这里的有效地址索引,是指用户多次更新的同一个数据块Bn中,最后一次写入的数据块的地址索引。
S103,删除第一索引表T1区的数据。
结合图6b所示,当第一数据D1区有足够的存储空间时,数据直接写入。如果是第一次写入数据,将地址索引记录在第一索引表T1中。
结合图6c所示,用户数据之间留一段空间,用来记录下一次更新的同一个数据块的地址,即next指针。
结合图6d所示,当第一数据D1区没有足够的存储空间时,无法写入新数据,进入数据整理阶段。先将所有数据块Bn的有效地址索引记录到第二索引表T2区,当所有数据块的地址都记录到第二索引表T2区后,删除第一索引表T1区的数据。此时第二索引表T2区存储的是所有用户数据块的有效地址索引,而第一索引表T1区的数据为空。
S104,按照最小删除单元Sector整理第一数据D1区的数据,并将第一数据D1区中数据的新地址索引记录到第一索引表T1区。
采用本公开实施例提供的用于单向链表的数据管理方法,将单向链表的存储空间划分为数据D区和索引表T区,在第一数据D1区的剩余存储空间不足的情况下,首先将第一数据D1区中数据的有效地址索引记录到第二索引表T2区,然后删除第一索引表T1区的数据,再按照最小删除单元Sector整理第一数据D1区的数据,并将第一数据D1区中数据的新地址索引记录到第一索引表T1区。如此,在Flash空间的单向链表的整个数据整理过程中,第一索引表T1区或第二索引表T2区指向数据块的有效地址,或者指向可以索引到有效地址的单向链表表头,能够实现数据块的快速定位,数据查找更加方便、快捷。
结合图2所示,本公开实施例提供一种用于单向链表的数据管理方法,其按照最小删除单元Sector整理第一数据D1区的数据,并将第一数据D1区中数据的新地址索引记录到第一索引表T1区,包括以下步骤:
S201,在第一数据D1区的第一个Sector中存在有效数据的情况下,将第一个Sector中的有效数据拷贝到第二数据D2区,并将第一个Sector中的有效数据的新地址索引记录到第一索引表T1区。
这里的有效数据,是指用户多次更新的同一个数据块Bn中,最后一次写入的数据块。
S202,删除第一个Sector中的数据。
结合图6e所示,删除第一数据D1区的第一个最小删除单元Sector,如果第一个Sector中存在有效数据,将第一个Sector中的有效数据拷贝到第二数据D2区,并将第一个Sector中的有效数据的新地址索引记录到第一索引表T1区后,删除第一个Sector中的数据。
S203,在第一数据D1区的第二个Sector中存在有效数据的情况下,将第二个Sector中的有效数据拷贝到第一个Sector中,并将第二个Sector中的有效数据的新地址索引记录到第一索引表T1区。
S204,删除第二个Sector中的数据。
结合图6g所示,删除第一个Sector中的数据后,继续删除第二个Sector。由于第一个Sector已经空了,所以第一数据D1的空间基本可以应对第二个Sector中存在有效数据的情况。如果第二个Sector中存在有效数据,将第二个Sector中的有效数据拷贝到第一个Sector中,并将第二个Sector中的有效数据的新地址索引记录到第一索引表T1区,再删除第二个Sector中的数据。
按照最小删除单元Sector整理第一数据D1区的数据,并将第一个Sector和第二个Sector中的有效数据的新地址索引记录到第一索引表T1区,第一索引表T1区指向数据块的有效地址,或者指向可以索引到有效地址的单向链表表头,能够实现数据块的快速定位,数据查找更加方便、快捷。
结合图3所示,本公开实施例提供一种用于单向链表的数据管理方法,其按照最小删除单元Sector整理第一数据D1区的数据,并将第一数据D1区中数据的新地址索引记录到第一索引表T1区,包括以下步骤:
S301,在第一数据D1区的第一个Sector中存在有效数据的情况下,将第一个Sector中的有效数据拷贝到第二数据D2区,并将第一个Sector中的有效数据的新地址索引记录到第一索引表T1区。
S302,删除第一个Sector中的数据。
S303,在第一数据D1区的第二个Sector中存在有效数据的情况下,将第二个Sector中的有效数据拷贝到第一个Sector中,并将第二个Sector中的有效数据的新地址索引记录到第一索引表T1区。
S304,删除第二个Sector中的数据。
S305,将第一数据D1区的数据整理完后,在第二数据D2区中存在有效数据的情况下,将第二数据D2区中的有效数据拷贝到第一数据D1区,并将第二数据D2区中的有效数据的新地址索引记录到第一索引表T1区。
S306,删除第二数据D2区中的数据。
S307,删除第二索引表T2区的数据。
结合图6i所示,将第一数据D1区的数据整理完后,如果第二数据D2区存在有效数据,将第二数据D2区中的有效数据拷贝到第一数据D1区,并将第二数据D2区中的有效数据的新地址索引记录到第一索引表T1区,然后删除第二数据D2区中的数据以及第二索引表T2区的数据,数据整理完成。
将第一数据D1区的数据整理完后,在第二数据D2区中存在有效数据的情况下,将第二数据D2区中的有效数据拷贝到第一数据D1区,并将第二数据D2区中的有效数据的新地址索引记录到第一索引表T1区。这样,保证Flash单向链表的数据整理过程中的数据准确性和完整性。
结合图4所示,本公开实施例提供一种用于单向链表的数据管理方法,其按照最小删除单元Sector整理第一数据D1区的数据,并将第一数据D1区中数据的新地址索引记录到第一索引表T1区,包括以下步骤:
S401,在第一数据D1区的第一个Sector中不存在有效数据的情况下,删除第一个Sector中的数据。
结合图6f所示,删除第一数据D1区的第一个最小删除单元Sector,如果第一个Sector中不存在有效数据,直接删除第一个Sector中的数据。
S402,在第一数据D1区的第二个Sector中存在有效数据的情况下,将第二个Sector中的有效数据拷贝到第一个Sector中,并将第二个Sector中的有效数据的新地址索引记录到第一索引表T1区。
S403,删除第二个Sector中的数据。
按照最小删除单元Sector整理第一数据D1区的数据,并将第二个Sector中的有效数据的新地址索引记录到第一索引表T1区,第一索引表T1区指向数据块的有效地址,或者指向可以索引到有效地址的单向链表表头,能够实现数据块的快速定位,数据查找更加方便、快捷。
在一些实施例中,按照最小删除单元Sector整理第一数据D1区的数据,并将第一数据D1区中数据的新地址索引记录到第一索引表T1区,还包括:在第一数据D1区包括N个Sector,且第一数据D1区的第N个Sector中存在有效数据的情况下,删除第二个Sector中的数据后,将第N个Sector中的有效数据拷贝到位于第N个Sector前的存在剩余存储空间的Sector中,并将第N个Sector中的有效数据的新地址索引记录到第一索引表T1区;其中,N为大于2的整数;删除第N个Sector中的数据。
例如,在第一数据D1区包括三个Sector,且第一数据D1区的第三个Sector中存在有效数据的情况下,删除第二个Sector中的数据后:如果第一个Sector中存在剩余存储空间,将第三个Sector中的有效数据拷贝到第一个Sector中;如果第一个Sector中不存在剩余存储空间,第二个Sector中不存在剩余存储空间,将第三个Sector中的有效数据拷贝到第二个Sector中。接着,删除第三个Sector中的数据。
用户的有效数据块可能存在跨Sector的情况,在此情况下拷贝数据,把跨Sector的数据都拷贝到位于第N个Sector前的存在剩余存储空间的Sector中,才算完整拷贝。在位于第N个Sector前的存在剩余存储空间的Sector的存储空间不足的情况下,将有效数据块拷贝到第二数据D2区。
例如,用户的有效数据块存在跨Sector一部分第二个Sector和一部分第三个Sector的情况,此时拷贝的数据,应该把跨Sector的数据,即一部分第二个Sector和一部分第三个Sector上存储的数据,都拷贝到第一个Sector,才算完整拷贝。结合图6h所示,在第一个Sector存在存储空间不足的情况下,将有效数据块拷贝到第二数据D2区。
删除第二个Sector中的数据后,顺次将第N个Sector中的有效数据拷贝到位于第N个Sector前的存在剩余存储空间的Sector中,并将第N个Sector中的有效数据的新地址索引记录到第一索引表T1区,处理第一数据D1区的所有Sector,第一索引表T1区指向数据块的有效地址,或者指向可以索引到有效地址的单向链表表头,能够实现数据块的快速定位。同时,在用户的有效数据块存在跨Sector的情况下,把跨Sector的数据都拷贝到位于第N个Sector前的存在剩余存储空间的Sector中,实现数据的完整拷贝,保证Flash单向链表的数据整理过程中的数据准确性和完整性。
结合图5所示,本公开实施例提供一种用于单向链表的数据管理方法,包括以下步骤:
S501,将单向链表的存储空间划分为数据D区和索引表T;其中,数据D区包括第一数据D1区,索引表T区包括第一索引表T1区和第二索引表T2区。
S502,在第一数据D1区的剩余存储空间不足的情况下,将第一数据D1区中数据的有效地址索引记录到第二索引表T2区。
S503,删除第一索引表T1区的数据。
S504,按照最小删除单元Sector整理第一数据D1区的数据,并将第一数据D1区中数据的新地址索引记录到第一索引表T1区。
S505,按照最小删除单元Sector整理第一数据D1区的数据的过程中,判断第一数据D1区的存储空间是否足够。
判断第一数据D1区的存储空间是否足够,包括:判断第一数据D1区的当前存储空间是否足够新数据的写入,以及在第一数据D1区写入这个数据后,下一个Sector的有效数据是否还能搬到空Sector。在第一数据D1区的当前存储空间足够新数据的写入,且在第一数据D1区写入这个数据后,下一个Sector的有效数据还能搬到空Sector的情况下,判定第一数据D1区的存储空间足够;在第一数据D1区的当前存储空间不够新数据的写入,和/或在第一数据D1区写入这个数据后,下一个Sector的有效数据不能搬到空Sector的情况下,判定第一数据D1区的存储空间不够。
S506,在第一数据D1区的存储空间足够的情况下,在第一数据D1区中写入新数据。
为了保证数据不会因断电而丢失,一般的做法是将Flash空间分成2个区域,先写满一个区域,再把最新的数据都拷贝到另一个区域,然后清空之前写满数据的区域。在搬运数据的过程中,用户很难更新数据块,这是因为:(1)旧区没多少空间剩余,也很难预测留多少空间给用户更新数据;(2)若是将用户新数据更新到了新区,那么如果这个过程断电再上电,此时旧区存在有效数据,且已满,新区存在部分有效数据,也不能删,只能继续从旧区往新区搬数据,而且已经搬过的数据不能再搬了(否则可能导致新区空间不足)。这会导致上电期间需要遍历整个Flash,要解析所有数据,处理逻辑复杂,且非常耗时。本公开实施例中,使用单向数据链表来管理数据块,支持数据整理期间的用户数据更新,用户体验更佳。
在一些实施例中,用于单向链表的数据管理方法还包括:在第一数据D1区中写入新数据后:在第一索引表T1区不存在新数据的地址索引的情况下,在第一索引表T1区记录新数据的新地址索引;在第一索引表T1区存在新数据的地址索引的情况下,在新数据后记录新数据的地址索引,形成链表。
结合图6j所示,在空间足够的情况下,如果第一索引表T1区不存在新数据的地址索引,也就是说,这个数据块目前在第一数据D1区上的有效数据还没开始搬,例如用户想要更新用户数据1的第N+1次,那么写入用户新数据,并将新数据的新地址索引记录到第一索引表T1区,此时用户数据1的第N次不再是有效数据,后续无需再搬。
结合图6k所示,在空间足够的情况下,如果第一索引表T1区存在新数据的地址索引,也就是说,这个数据块目前在第一数据D1区上的有效数据已经搬了,那么将新数据的新地址索引记录到上一个数据块的next指针处,形成链表,例如更新用户数据x的第Y+1次。
在Flash空间的单向链表的整个数据整理和更新的过程中,第一索引表T1区或第二索引表T2区指向数据块的有效地址,或者指向可以索引到有效地址的单向链表表头,能够在上电期间实现数据块的快速定位,数据查找更加方便、快捷。
在一些实施例中,用于单向链表的数据管理方法还包括:在第一数据D1区的存储空间不够的情况下,暂缓写入新数据。
在第一数据D1区的存储空间不够的情况下,暂缓写入新数据的请求,直到第一数据D1区的存储空间足够写入时再启动,避免新数据写入而影响单向链表的数据管理工作,有利于单向链表的数据管理工作的顺利进行。
结合图7所示本公开实施例提供一种用于单向链表的数据管理装置,包括处理器(processor)70和存储器(memory)71,还可以包括通信接口(Communication Interface)72和总线73。其中,处理器70、通信接口72、存储器71可以通过总线73完成相互间的通信。通信接口72可以用于信息传输。处理器70可以调用存储器71中的逻辑指令,以执行上述实施例的用于单向链表的数据管理方法。
此外,上述的存储器71中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。
存储器71作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序,如本公开实施例中的方法对应的程序指令/模块。处理器70通过运行存储在存储器71中的程序指令/模块,从而执行功能应用以及数据处理,即实现上述方法实施例中的用于单向链表的数据管理方法。
存储器71可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端设备的使用所创建的数据等。此外,存储器71可以包括高速随机存取存储器,还可以包括非易失性存储器。
采用本公开实施例提供的用于单向链表的数据管理装置,将单向链表的存储空间划分为数据D区和索引表T区,在第一数据D1区的剩余存储空间不足的情况下,首先将第一数据D1区中数据的有效地址索引记录到第二索引表T2区,然后删除第一索引表T1区的数据,再按照最小删除单元Sector整理第一数据D1区的数据,并将第一数据D1区中数据的新地址索引记录到第一索引表T1区。如此,在Flash空间的单向链表的整个数据整理过程中,第一索引表T1区或第二索引表T2区指向数据块的有效地址,或者指向可以索引到有效地址的单向链表表头,能够实现数据块的快速定位,数据查找更加方便、快捷。
本公开实施例提供了一种用于单向链表的数据管理系统,包含上述的用于单向链表的数据管理装置。
本公开实施例提供了一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为执行上述用于单向链表的数据管理方法。
本公开实施例提供了一种计算机程序产品,所述计算机程序产品包括存储在计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,使所述计算机执行上述用于单向链表的数据管理方法。
上述的计算机可读存储介质可以是暂态计算机可读存储介质,也可以是非暂态计算机可读存储介质。
本公开实施例的技术方案可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括一个或多个指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开实施例所述方法的全部或部分步骤。而前述的存储介质可以是非暂态存储介质,包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等多种可以存储程序代码的介质,也可以是暂态存储介质。
以上描述和附图充分地示出了本公开的实施例,以使本领域的技术人员能够实践它们。其他实施例可以包括结构的、逻辑的、电气的、过程的以及其他的改变。实施例仅代表可能的变化。除非明确要求,否则单独的部件和功能是可选的,并且操作的顺序可以变化。一些实施例的部分和特征可以被包括在或替换其他实施例的部分和特征。本公开实施例的范围包括权利要求书的整个范围,以及权利要求书的所有可获得的等同物。当用于本申请中时,虽然术语“第一”、“第二”等可能会在本申请中使用以描述各元件,但这些元件不应受到这些术语的限制。这些术语仅用于将一个元件与另一个元件区别开。例如,在不改变描述的含义的情况下,第一元件可以叫做第二元件,并且同样第,第二元件可以叫做第一元件,只要所有出现的“第一元件”一致重命名并且所有出现的“第二元件”一致重命名即可。第一元件和第二元件都是元件,但可以不是相同的元件。而且,本申请中使用的用词仅用于描述实施例并且不用于限制权利要求。如在实施例以及权利要求的描述中使用的,除非上下文清楚地表明,否则单数形式的“一个”(a)、“一个”(an)和“所述”(the)旨在同样包括复数形式。类似地,如在本申请中所使用的术语“和/或”是指包含一个或一个以上相关联的列出的任何以及所有可能的组合。另外,当用于本申请中时,术语“包括”(comprise)及其变型“包括”(comprises)和/或包括(comprising)等指陈述的特征、整体、步骤、操作、元素,和/或组件的存在,但不排除一个或一个以上其它特征、整体、步骤、操作、元素、组件和/或这些的分组的存在或添加。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法或者设备中还存在另外的相同要素。本文中,每个实施例重点说明的可以是与其他实施例的不同之处,各个实施例之间相同相似部分可以互相参见。对于实施例公开的方法、产品等而言,如果其与实施例公开的方法部分相对应,那么相关之处可以参见方法部分的描述。
本领域技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,可以取决于技术方案的特定应用和设计约束条件。所述技术人员可以对每个特定的应用来使用不同方法以实现所描述的功能,但是这种实现不应认为超出本公开实施例的范围。所述技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本文所披露的实施例中,所揭露的方法、产品(包括但不限于装置、设备等),可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,可以仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例。另外,在本公开实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
附图中的流程图和框图显示了根据本公开实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这可以依所涉及的功能而定。在附图中的流程图和框图所对应的描述中,不同的方框所对应的操作或步骤也可以以不同于描述中所披露的顺序发生,有时不同的操作或步骤之间不存在特定的顺序。例如,两个连续的操作或步骤实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这可以依所涉及的功能而定。框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。