发明内容
本发明所要解决的技术问题是提供一种实现保存内存中的数据的方法及装置,能够将具有链表数据结构的内存数据进行有效地保存,以便于该数据的恢复。
为了解决上述技术问题,本发明提供了一种实现保存内存中的数据的方法,包括:
应用程序为在内存中保存数据预先构建以块内块单元为单位的内存结构及块单元结构,该内存结构至少包括块大小及每块的块单元数目,该块单元结构至少包括块单元标识;将块单元标识和每块的块单元数目映射为块单元的块地址及块内地址;
应用程序在需要保存块内块单元中的数据时,将该内存结构保存在一文件中,并按块单元标识依次将块单元中的数据保存到该文件中。
进一步地,该内存结构通过内存池结构实现,该内存池结构还包括块地址索引,用于索引块单元在内存中的块地址;该块单元结构还包括数据地址;块单元标识用块单元的序号表示;
将块单元标识和每块的块单元数目映射为块单元的块地址及块内地址是指,将块单元的序号对每块的块单元数目进行除法取整运算,获取块单元的块序号,按该块序号从块地址索引中获取该块单元的块地址;将块单元的序号对每块的块单元数目进行除法取余运算,获取块单元的块内地址;获取的块单元的块地址和块内地址由数据地址表述;
将该内存结构和所述块单元中的数据保存在所述文件中是指,将含有内存池结构的头部信息保存在该文件的首部,然后按块单元的序号依次将块单元中的数据保存到该文件中。
进一步地,应用程序在需要恢复一文件中保存的数据时,首先恢复该文件中保存的含内存池结构的头部信息,根据该头部信息在内存中依次恢复块及块地址索引。
进一步地,内存池结构还包括块链表,用于以块为单位按块单元的块序号依次存放块单元;根据该头部信息依次恢复块及块地址索引具体包括:
获取头部信息中的块大小,并创建包含块序号和块地址的地址索引的结构;
按块序号从文件中依次读取块并置入块链表的尾部,并更新块地址索引。
进一步地,内存池结构还包括空闲块单元链表,用于按空闲块单元的序号依序存放空闲单元;
应用程序在需要将数据保存在内存池中时,申请分配空闲块单元链表中一个或多个块单元,用于数据的保存;或者,应用程序在需要将保存数据的块单元释放时,申请释放块链表中一个或多个块单元,并将释放的块单元置入空闲块单元链表的尾部。
进一步地,所述内存池结构还包括当前申请块的数目,用于表示内存池当前已经申请块的数目;
申请分配空闲块单元链表中一个或多个块单元具体包括:若查找空闲块单元链表还有足够分配的块单元,则从空闲块单元链表取出要分配的块单元,并返回分配的块单元的块地址和块单元数目;若查找空闲块单元链表没有足够分配的块单元,则从内存中申请一个块到内存池中所述块链表的尾部,并更新当前申请块的数目,同时将申请块的块单元置入空闲块单元链表的尾部,然后从空闲块单元链表取出要分配的块单元,并返回分配的块单元的块地址和块单元数目。
进一步地,应用程序在需要访问保存在内存池中的数据成员时,根据数据成员的块单元序号和块单元数目在块链表中查找到块单元的数据地址,依据该数据地址对相应块单元中的数据进行读写访问。
为了解决上述技术问题,本发明提供了一种实现保存内存中的数据的装置,包括依次连接的内存池结构构建模块以及内存池数据保存模块,其中:
内存池结构构建模块,用于预先构建以块内块单元为单位的内存池结构及块单元结构,该内存池结构至少包括块大小及每块的块单元数目,该块单元结构至少包括块单元标识;将块单元标识和每块的块单元数目映射为块单元的块地址及块内地址;
内存池数据保存模块,作为应用程序的接口,在应用程序需要保存存池中的数据时被调用,用于将含有内存池结构的头部信息保存一文件中,并按块单元标识依次将块单元中的数据保存到该文件中。
进一步地,内存池结构还包括块地址索引,用于索引块单元在内存中的块地址;块单元的结构还包括数据地址;块单元标识用块单元的序号表示;
内存池结构构建模块,将块单元的序号对每块的块单元数目进行除法取整运算,获取块单元的块序号,按该块序号从块地址索引中获取块单元的块地址;将块单元的序号对每块的块单元数目进行除法取余运算,获取块单元的块内地址;获取的块单元的块地址和块内地址由数据地址表述;
内存池数据保存模块,将头部信息保存在文件的首部,然后按块单元序号依次将块单元中的数据保存到该文件中。
进一步地,还包括与内存池数据保存模块连接的内存池数据恢复模块,其中:
内存池数据恢复模块,作为应用程序的接口,在应用程序要恢复一文件中保存的数据时被调用,用于恢复该文件中保存的含内存池结构的头部信息,根据该头部信息在内存池中依次恢复块及块地址索引。
进一步地,内存池结构还包括块链表,用于以块为单位按块单元的块序号依次存放块单元;
内存池数据恢复模块,获取头部信息中的块大小,并创建包含块序号和块地址的地址索引的结构;按块序号从该文件中依次读取块置入块链表的尾部,并更新块地址索引。
进一步地,该装置还包括与内存池结构构建模块连接的内存池访问模块;内存池结构还包括空闲块单元链表,用于按空闲块单元的序号依序存放空闲单元;
内存池访问模块,作为应用程序的接口,在应用程序需要将数据保存在内存池中时被调用,用于申请分配空闲块单元链表中一个或多个块单元来保存数据;或者,在应用程序需要将保存数据的块单元释放时被调用,用于申请释放块链表中一个或多个块单元,并将释放的块单元置入空闲块单元链表的尾部;或者,在应用程序需要访问保存在内存池中的数据成员时被调用,根据数据成员的块单元序号和块单元数目在块链表中查找到块单元的数据地址,依据该数据地址对相应块单元中的数据进行读写访问。
进一步地,内存池结构还包括当前申请块的数目,用于表示内存池当前已经申请块的数目;
内存池访问模块,若查找空闲块单元链表还有足够分配的块单元,则从空闲块单元链表取出要分配的块单元,并返回分配的块单元的块地址和块单元数目;若查找空闲块单元链表没有足够分配的块单元,则从内存中申请一个块到内存池中块链表的尾部,并更新当前申请块的数目,同时将申请块的块单元置入空闲块单元链表的尾部,然后从空闲块单元链表取出要分配的块单元,并返回分配的块单元的块地址和块单元数目。
采用本发明的方法及装置,将内存池技术与文件系统相结合,通过将链表这类较为复杂的数据结构的数据连续保存在结构简化的内存池中,并将该内存池中的数据映射到文件中,便于将该数据结构的数据以文件的形式保存在永久性存储媒介上,以及从该永久性存储媒介中的文件恢复该数据结构的数据到内存中,从而解决该数据结构的数据在多任务之间进行传递过程中关机后再开机所面临的问题。
具体实施例
以下结合附图和优选实施例来详细阐述本发明的技术方案。以下实施例仅仅用于说明和解释本发明,而不用于限制本发明。
为了便于下面技术方案的阐述,先定义以下几个技术名词。
文件关联内存池:用于存储应用程序中较为复杂的链表类数据结构的数据;并且,该存储的数据可以文件的形式进行保存。
块:内存池中分配的最大存储空间。
块单元:内存池中每个块被均分为n个小块,称为块单元,作为内存分配的基本单位;块单元标识称为块单元序号。
本发明的实现保存内存中的数据的方法,包括:
(1)应用程序构建文件关联内存池及其内块中块单元的结构,并将块单元序号和每块的块单元数目映射为块单元的块地址及其块内地址;
内存池有很多实现的方法,本发明的主要目的不是内存池的实现,而是将内存池技术与文件系统结合,实现对较为复杂的链表类数据结构的数据保存在文件中及从文件中恢复的目的。
因此,本发明需要构建具有简化结构的文件关联内存池,亦即对于每一个内存池的实例(即针对应用程序中一种链表类数据结构而引用),每一个块的大小都是一致且固定的,而且,块单元的大小也都是一致且固定的,也就是说一旦在内存池创建时被初始化,块单元的大小及块的大小均被固定而不能被更改。
该文件关联内存池的定义如下:
ADT文件关联内存池
{
块大小; //块所具有的存储空间
每块的块单元数目; //每块内含有的块单元数目
空闲块单元链表; //以链表形式存放可分配的空闲的块单元
块地址索引表; //用于以块序号为索引查找块在内存的块地址
当前申请块的数目; //内存池中当前已申请的块的数目
块链表; //用于以块为单位按块单元序号依次存放块单元
};
其中,ADT表示抽象数据类型(Abstract Data Type)。
上述用于查找块在内存的真实地址的块地址索引表,在每当将数据从文件载入内存时都需要重建的。
本发明用文件关联内存池的头部来存放上述数据结构内的各个参数或链表。该头部由应用程序用来对整个文件关联内存池进行内存管理,包括内存的申请、释放、地址映射以及内存数据的恢复等,正是因为该头部的重要性,当需要将该内存池保存到文件中时,该头部的信息总是保存在文件的首部。
构建块单元的数据结构,综合考虑了块单元的各种实现方案后,最终选择了用结构体(struct)来定义块单元结构。该结构主要包含两个参数字段:块单元序号和数据地址。因为所有的块单元要统一编排序号,故一个字节无法表示块单元序号,至少需要16位(bit)长度的数据类型。
块单元的定义如下:
ADT块单元
{
块单元序号; //对内存池中所有的块单元统一编排的序号
数据地址; //块单元的块地址及其块内地址
};
在构建了上述文件关联内存池及其块单元的数据结构之后,便可进行数据地址的映射,亦即将块单元序号和每块的块单元数目映射为块单元的块地址及块单元的块内地址。
由于针对每一内存池实例,每一个块包含的块单元的数目是固定的,块单元的大小也都是固定的,而且块单元又是统一编排序号的,例如,第一个块中的块单元:0~99,第二块中的块单元:100-199,......;通过计算便可以得到块单元的块序号(亦即该块单元属于哪一个块),以及该块单元在块内的相对地址,计算方式如下:
块序号=(块单元序号/每块的块单元数目)取整;
其中,(块单元序号/每块的块单元数目)取整,表示将块单元序号对每块的块单元数目进行除法取整运算;
块内地址=(块单元序号)%(每块的块单元数目);
其中,符号“%”表示将块单元序号对每块的块单元数目进行除法取余运算。
如图1所示,就是用本发明进行内存池地址映射的示意图,其中包括对内存池头部、块地址索引表以及块链表的展示。可以看出,块地址索引表用于以块序号为索引,存放在该块在内存中的块地址;块链表用于以块为单位,按块单元的序号依序存放每一块内的块单元。
应用程序通过块单元块序号及其块内地址的运算,并依据块地址索引表以及块链表即可找到块单元在内存中真实的块地址及其块内地址。
(2)在应用程序需要对链表类数据结构的数据进行操作,调用相应的接口执行相应的申请、释放或访问流程;
其中,申请流程如图2所示,包括如下步骤:
210:查找空闲块单元链表;
220:判断空闲块单元链表内是否有足够分配的块单元,是则执行230,否则执行250;
230:从空闲块单元链表中取出要分配的块单元;
240:返回分配的块单元地址和块单元数目,结束流程;
250:从内存中申请一个块到内存池中;
260:判断申请是否成功,即内存是否还有块可分配,是则执行270,否则执行290;
270:将申请的块加入块链表的尾部,并更新当前申请块的数目;
280:将申请块内的块单元加入空闲块单元链表,转步骤230执行;
290:返回内存申请失败信息,结束流程。
释放流程,即查找块链表,根据块单元的数据地址找到相应的块单元序号,并根据申请时的块单元数目将要释放的块单元置入空闲块单元链表。
访问流程,当要访问链表类数据结构内一个成员的数据时,根据该成员的块单元序号和块单元数目在块链表中查找到块单元的数据地址,然后对相应块单元中的数据进行读写访问。
在采用了内存池技术后,块单元的数据结构不同于以往的链表,其中不再有next、prev等指针,而是32位的整形数,包含的内容是块单元序号和块单元的数据地址。
如果要访问链表类数据结构内下一个成员的数据,就要通过下一个成员的块单元序号来找到下一个块单元的数据地址,然后对相应的数据进行访问。
(3)在应用程序需要将文件关联内存池中的数据保存到文件中,或需要将文件中保存的数据恢复到内存(文件关联内存池)时,调用相应的接口执行相应的保存、恢复流程。
其中,保存流程,即先将文件关联内存池的头部保存在文件的首部,然后按块及块单元的顺序依次将块单元、块保存到文件中。
恢复流程如图3所示,包括如下步骤:
310:从文件的首部读取文件关联内存池的头部信息;
320:根据头部信息获取块大小;
330:创建块地址索引表的结构;
地址索引表的结构如图1中所示。
340:从文件中读取一个块,将其加入块链表的尾部,并更新块地址索引表;
350:判断文件中是否还有块未读取,是则返回步骤340执行,否则结束流程。
本发明针对上述方法相应地提出实现保存内存中的数据的装置,其实施例的结构如图4所示,该装置400包括依次连接的内存池结构构建模块410、内存池数据保存模块420、内存池数据恢复模块430,还包括文件关联内存池访问模块440;其中:
内存池结构构建模块410,用于应用程序构建保存链表类数据结构的数据的文件关联内存池4201及其块单元的结构,并将文件关联内存池4201中块单元序号和每块的块单元数目映射为块单元的块地址及其块内地址;
其中,构建的文件关联内存池4201及其块单元的结构如前所述,此不再赘述。
内存池数据保存模块420,作为应用程序的接口,在应用程序需要将文件关联内存池中的数据保存到文件系统4201中的文件中时被调用,用于先将文件关联内存池4101的头部保存在该文件的首部,然后按块及块单元的顺序依次将块单元、块保存到该文件中;
内存池数据恢复模块430,作为应用程序的接口,在应用程序需要将文件系统4201中的文件恢复到文件关联内存池4101时被调用,用于从该文件的首部读取文件关联内存池4101的头部信息,根据该头部信息获取块大小,并创建块地址索引表的结构,按块单元的序号从该文件中依次读取每一个块,加入块链表的尾部,并更新块地址索引表;
文件关联内存池访问模块440,作为应用程序的接口与内存池结构构建模块410构建的文件关联内存池4101连接,在应用程序需要对链表类数据结构的数据进行操作时被调用,用于对文件关联内存池4101进行相应的块单元申请、块单元访问或块单元释放操作。
其中,块单元申请、块单元访问或块单元释放操作如前所述,此不再赘述。
以上本发明的实现在内存中保存数据的装置实施例,还可以有其它变化的结构,譬如内存池数据保存模块420与内存池数据恢复模块430合为一个内存池数据保存/恢复模块,等等。
综上可以看出,本发明将内存池技术与文件系统相结合,通过将链表这类较为复杂的数据结构的数据保存在结构简化的内存池中,并将该内存池中的数据映射到文件中,便于将该数据结构的数据以文件的形式保存在永久性存储媒介上,以及从该永久性存储媒介中的文件恢复该数据结构的数据到内存中,从而解决该数据结构的数据在多任务之间进行传递过程中关机后再开机所面临的问题。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。