一种利用链表实现内存连续的方法和装置与流程

文档序号:12887036阅读:473来源:国知局
一种利用链表实现内存连续的方法和装置与流程

本发明属于内存技术领域,特别是涉及一种利用链表实现内存连续的方法和装置。



背景技术:

一个系统往往在使用过程中需要在堆中申请很多内存块用来保存数据,在一些系统(例如文件系统)中经常会将一些内存块中的数据合并之后进行处理,即多个小内存块合并成一个大的内存块。常规的做法是先申请一个大内存块,然后将多个小内存块中的数据依次拷贝到大内存块中,释放小内存块,但是,这种做法需要从操作系统中频繁的申请内存和数据拷贝,这就对系统的性能造成不利影响。



技术实现要素:

为解决上述问题,本发明提供了一种利用链表实现内存连续的方法和装置,能够避免频繁的从操作系统申请和拷贝内存,增强系统的性能。

本发明提供的一种利用链表实现内存连续的方法,包括:

从操作系统申请预设数量的大块内存;

利用buffer记录所述大块内存的首地址、起始偏移量和长度,并将所述buffer标记为unused;

将所述标记为unused的buffer按照buffer的起始地址升序排序,利用链表组织起来,得到list-unused;

当需要利用小块内存保存数据时,从所述list-unused的头部查找长度不小于所述小块内存长度的buffer进行数据的保存,并标记为used,将其他部分标记为unused。

优选的,在上述利用链表实现内存连续的方法中,还包括:

当需要利用多个小块内存保存数据时,将多个小块内存按照业务需要依次插入list-used中;

当所述list-used或其中的小块内存不再使用时,将所述list-used删除,或者,将所述小块内存从所述list-used中删除并标记为unused,按照buffer的起始地址升序排序插入所述list-unused中。

优选的,在上述利用链表实现内存连续的方法中,还包括:

当所述list-unused中的相邻的buffer具有相同的首地址,且前一个buffer的终止地址和后一个buffer的起始地址相等时,将二者进行合并。

优选的,在上述利用链表实现内存连续的方法中,还包括:

当大块内存不足时,从操作系统中再申请另一块大块内存,直到内存足够。

本发明提供的一种利用链表实现内存连续的装置,包括:

申请单元,用于从操作系统申请预设数量的大块内存;

记录单元,用于利用buffer记录所述大块内存的首地址、起始偏移量和长度,并将所述buffer标记为unused;

组织单元,用于将所述标记为unused的buffer按照buffer的起始地址升序排序,利用链表组织起来,得到list-unused;

查找单元,用于当需要利用小块内存保存数据时,从所述list-unused的头部查找长度不小于所述小块内存长度的buffer进行数据的保存,并标记为used,将其他部分标记为unused。

优选的,在上述利用链表实现内存连续的装置中,还包括:

插入单元,用于当需要利用多个小块内存保存数据时,将多个小块内存按照业务需要依次插入list-used中;

删除单元,用于当所述list-used或其中的小块内存不再使用时,将所述list-used删除,或者,将所述小块内存从所述list-used中删除并标记为unused,按照buffer的起始地址升序排序插入所述list-unused中。

优选的,在上述利用链表实现内存连续的装置中,还包括:

合并单元,用于当所述list-unused中的相邻的buffer具有相同的首地址,且前一个buffer的终止地址和后一个buffer的起始地址相等时,将二者进行合并。

优选的,在上述利用链表实现内存连续的装置中,还包括:

所述申请单元还用于当大块内存不足时,从操作系统中再申请另一块大块内存,直到内存足够。

通过上述描述可知,本发明提供的上述利用链表实现内存连续的方法和装置,由于该方法包括从操作系统申请预设数量的大块内存;利用buffer记录所述大块内存的首地址、起始偏移量和长度,并将所述buffer标记为unused;将所述标记为unused的buffer按照buffer的起始地址升序排序,利用链表组织起来,得到list-unused;当需要利用小块内存保存数据时,从所述list-unused的头部查找长度不小于所述小块内存长度的buffer进行数据的保存,并标记为used,将其他部分标记为unused,因此能够避免频繁的从操作系统申请和拷贝内存,增强系统的性能。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请实施例提供的第一种利用链表实现内存连续的方法的示意图;

图2为本申请实施例提供的第一种利用链表实现内存连续的装置的示意图;

图3为申请的大块内存与buffer和虚拟连续内存之间关系的示意图;

图4为一个buffer分裂为两个buffer的示意图;

图5为申请的物理大块内存、保存数据的小块内存和合并后的虚拟连续内存块之间的关系的示意图;

图6为相邻的buffer合并成一个buffer的示意图。

具体实施方式

本发明的核心思想在于提供一种利用链表实现内存连续的方法和装置,能够避免频繁的从操作系统申请和拷贝内存,增强系统的性能。

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本申请实施例提供的第一种利用链表实现内存连续的方法如图1所示,图1为本申请实施例提供的第一种利用链表实现内存连续的方法的示意图,该方法包括如下步骤:

s1:从操作系统申请预设数量的大块内存;

假设该大块内存的大小是1gb,内存地址从0x0~0x3fffffff(十六进制),然后业务系统需要申请内存时(一般申请的都是很小的内存,如几个kb,这里假设是4kb),就从之前预申请的1g内存中直接拿走需要的一段连续的4kb内存空间使用即可,这个过程属于内存操作,其速度比从操作系统中申请要快很多,当业务系统频繁申请内存时,就不需要频繁的从操作系统中去申请了,而直接从第一次预申请的1gb内存中截取需要的内存大小,这样就能够避免频繁的从操作系统申请内存。

s2:利用buffer记录所述大块内存的首地址、起始偏移量和长度,并将所述buffer标记为unused;

s3:将所述标记为unused的buffer按照buffer的起始地址升序排序,利用链表组织起来,得到list-unused;

具体的,参考图3,图3为申请的大块内存与buffer和虚拟连续内存之间关系的示意图,其中,利用buffer-n1记录大块内存1(physicalmemory1),利用buffer-n2记录大块内存2(physicalmemory2),利用buffer-n3记录大块内存3(physicalmemory3),然后将这些buffer插入list-unused中,形成虚拟连续内存。

s4:当需要利用小块内存保存数据时,从所述list-unused的头部查找长度不小于所述小块内存长度的buffer进行数据的保存,并标记为used,将其他部分标记为unused。

具体的,参考图4,图4为一个buffer分裂为两个buffer的示意图,在这种情况下,从buffer-unused1中找到buffer-block1用来保存数据之后,将剩余部分的buffer标记为buffer-unused2,在list-unused链表中替换分裂前的buffer-unused1,buffer分裂原则是addr保持不变,buffer-block1的起始地址和buffer-unused2的终止地址分别是buffer-ununsed1的起始地址和终止地址,buffer-block1的终止地址和buffer-unused2的起始地址相等。其中buffer-block1要标记为used,buffer-unused2标记为unused。

通过上述描述可知,本申请实施例提供的第一种利用链表实现内存连续的方法,由于包括从操作系统申请预设数量的大块内存;利用buffer记录所述大块内存的首地址、起始偏移量和长度,并将所述buffer标记为unused;将所述标记为unused的buffer按照buffer的起始地址升序排序,利用链表组织起来,得到list-unused;当需要利用小块内存保存数据时,从所述list-unused的头部查找长度不小于所述小块内存长度的buffer进行数据的保存,并标记为used,将其他部分标记为unused,因此能够避免频繁的从操作系统申请和拷贝内存,增强系统的性能。

本申请实施例提供的第二种利用链表实现内存连续的方法,是在上述第一种利用链表实现内存连续的方法的基础上,还包括如下技术特征:

还包括:

当需要利用多个小块内存保存数据时,将多个小块内存按照业务需要依次插入list-used中;

当所述list-used或其中的小块内存不再使用时,将所述list-used删除,或者,将所述小块内存从所述list-used中删除并标记为unused,按照buffer的起始地址升序排序插入所述list-unused中。

具体的,参考图5,图5为申请的物理大块内存、保存数据的小块内存和合并后的虚拟连续内存块之间的关系的示意图,多个buffer-block内存块按照业务需要依次插入链表list-used中,这个链表list-used中的buffer不要求按照起始地址排序,而是按照实际业务在系统中依次插入list-used中的,例如physicalmemory1中的b-11、b-12和physicalmemory2中的b-13插入到list-used1中,physicalmemory2中的b-21和physicalmemory3中的b-22插入到list-used2中,physicalmemory3中的b-31、b-32和b-33插入到list-used3中,而physicalmemory1中的b-n1、b-n2,physicalmemory2中的b-n3、b-n4、b-n5,physicalmemory3中的b-n6均插入到list-unused中。当某个buffer-block小块内存或者list-used不再使用时,将不再使用的buffer-block或不再使用的list-used中的buffer-block全部从list-used中删除并标记为unused,然后插入list-unused中并合并相邻buffer。

本申请实施例提供的第三种利用链表实现内存连续的方法,是在上述第一种或第二种利用链表实现内存连续的方法的基础上,还包括如下技术特征:

还包括:

当所述list-unused中的相邻的buffer具有相同的首地址,且前一个buffer的终止地址和后一个buffer的起始地址相等时,将二者进行合并。

具体的,参考图6,图6为相邻的buffer合并成一个buffer的示意图,可见addr1+offset1+length=addr1+offset2,因此将二者合并,合并之后的buffer的头部为addr1+offset1,尾部为addr1+offset1+length1+length2,

本申请实施例提供的第四种利用链表实现内存连续的方法,是在上述第三种利用链表实现内存连续的方法的基础上,还包括如下技术特征:

还包括:

当大块内存不足时,从操作系统中再申请另一块大块内存,直到内存足够。

例如,在第一次申请的大块内存为1gb时,当业务系统中零零散散申请的小内存加起来已经达到了1gb,这时候就再向操作系统第二次申请大块内存,其大小可以是但不限于1gb,以满足后续的需求。

综上所述,上述实施例用到的链表结构list只需要能够做到连续的访问每一个节点buffer,在用户角度来看,这就成为了一个大的连续内存块,因为这个连续内存块包含了多个buffer,而每个buffer对应到预申请的physicalmemory上有可能是不连续的,因此称之为虚拟的连续内存。将这多个小块内存按照链表形式组织起来,使之可以连续访问,就不需要把数据从一块内存拷贝到另一块内存了,同时在小块内存不使用的时候进行标记,当需要一个新的内存块时,直接将标记过不使用的内存块拿来使用,达到内存复用的目的,减少内存的频繁申请。

本申请实施例提供的第一种利用链表实现内存连续的装置如图2所示,图2为本申请实施例提供的第一种利用链表实现内存连续的装置的示意图,该装置包括:

申请单元201,用于从操作系统申请预设数量的大块内存,假设该大块内存的大小是1gb,内存地址从0x0~0x3fffffff(十六进制),然后业务系统需要申请内存时(一般申请的都是很小的内存,如几个kb,这里假设是4kb),就从之前预申请的1g内存中直接拿走需要的一段连续的4kb内存空间使用即可,这个过程属于内存操作,其速度比从操作系统中申请要快很多,当业务系统频繁申请内存时,就不需要频繁的从操作系统中去申请了,而直接从第一次预申请的1gb内存中截取需要的内存大小,这样就能够避免频繁的从操作系统申请内存;

记录单元202,用于利用buffer记录所述大块内存的首地址、起始偏移量和长度,并将所述buffer标记为unused;

组织单元203,用于将所述标记为unused的buffer按照buffer的起始地址升序排序,利用链表组织起来,得到list-unused;

查找单元204,用于当需要利用小块内存保存数据时,从所述list-unused的头部查找长度不小于所述小块内存长度的buffer进行数据的保存,并标记为used,将其他部分标记为unused。

本申请实施例提供的第二种利用链表实现内存连续的装置,是在上述第一种利用链表实现内存连续的装置的基础上,还包括如下技术特征:

还包括:

插入单元,用于当需要利用多个小块内存保存数据时,将多个小块内存按照业务需要依次插入list-used中;

删除单元,用于当所述list-used或其中的小块内存不再使用时,将所述list-used删除,或者,将所述小块内存从所述list-used中删除并标记为unused,按照buffer的起始地址升序排序插入所述list-unused中。

本申请实施例提供的第三种利用链表实现内存连续的装置,是在上述第一种或第二种利用链表实现内存连续的装置的基础上,还包括如下技术特征:

还包括:

合并单元,用于当所述list-unused中的相邻的buffer具有相同的首地址,且前一个buffer的终止地址和后一个buffer的起始地址相等时,将二者进行合并。

本申请实施例提供的第四种利用链表实现内存连续的装置,是在上述第三种利用链表实现内存连续的装置的基础上,还包括如下技术特征:

还包括:

所述申请单元还用于当大块内存不足时,从操作系统中再申请另一块大块内存,直到内存足够。

例如,在第一次申请的大块内存为1gb时,当业务系统中零零散散申请的小内存加起来已经达到了1gb,这时候就再向操作系统第二次申请大块内存,其大小可以是但不限于1gb,以满足后续的需求。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

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