一种小块内存的管理方法和装置与流程

文档序号:11950053阅读:186来源:国知局
一种小块内存的管理方法和装置与流程

本发明属于软件存储技术领域,特别是涉及一种小块内存的管理方法和装置。



背景技术:

现有技术中,写代码时,分配一块内存会用malloc,在内核态用kmalloc,释放时候用free或kfree,这种方式容易造成内存碎片,导致后面要分配一块大块的内存时没有连续的空间来进行分配,正常的linux内核中用的内存管理的方式是伙伴系统和slub系统共用的方式,slub分配的时候,是按照2的幂次方对齐的,当需要分配不是2的幂次方的小块内存时,分配的空间会大于实际用到的空间,造成了空间浪费,系统之所以这样做,是为了它的通用性,做到了一种折中。另外创建一块固定大小的内存池时,分配一块内存是顺序查找空闲内存的,分配的时间复杂度最坏情况为O(n),可以说效率不是很高。在存储开发的情况下,处理上游发下来的数据,经常和数据打交道,处理数据的时候大多数用到描述符,基本上描述符是一种小型的数据结构体,用来管理和记录大块数据的流向。这种小型的数据结构体用的次数频繁,使用kmalloc或者malloc的话,不仅分配的时间长,而且会导致内存碎片,用内存池的话也会有分配时间的缺陷。



技术实现要素:

为解决上述问题,本发明提供了一种小块内存的管理方法和装置,移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。

本发明提供的一种小块内存的管理方法,包括:

在初始化过程中,分配一整块内存;

对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;

利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;

当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。

优选的,在上述小块内存的管理方法中,还包括:

当需要释放所述预设内存时,将所述预设内存对应的结构插入到所述链表的tail后面,并将所述tail指向插入的所述结构。

优选的,在上述小块内存的管理方法中,所述当需要使用一块预设内存之后,还包括:

判断所述head是否等于所述tail,如果等于,则判断所述链表为空。

优选的,在上述小块内存的管理方法中,所述从所述链表的所述head的索引号中找到对应的小块内存包括:

利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。

本发明提供的一种小块内存的管理装置,包括:

分配单元,用于在初始化过程中,分配一整块内存;

划分单元,用于对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;

串联单元,用于利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;

小块内存寻找单元,用于当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。

优选的,在上述小块内存的管理装置中,还包括:

插入单元,用于当需要释放所述预设内存时,将所述预设内存对应的结构插入到所述链表的tail后面,并将所述tail指向插入的所述结构。

优选的,在上述小块内存的管理装置中,还包括:

判断单元,用于判断所述head是否等于所述tail,如果等于,则判断所述链表为空。

优选的,在上述小块内存的管理装置中,所述小块内存寻找单元具体用于利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。

通过上述描述可知,本发明提供的上述小块内存的管理方法和装置,由于该方法包括:先在初始化过程中,分配一整块内存;然后对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;再利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;最后,当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点,因此该方法和装置移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。

附图说明

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

图1为本申请实施例提供的第一种小块内存的管理方法的示意图;

图2为本申请实施例提供的第一种小块内存的管理装置的示意图。

具体实施方式

本发明的核心思想在于提供一种小块内存的管理方法和装置,移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。

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

本申请实施例提供的第一种小块内存的管理方法如图1所示,图1为本申请实施例提供的第一种小块内存的管理方法的示意图,该方法包括如下步骤:

S1:在初始化过程中,分配一整块内存;

具体的,在初始化的时候,定义一个专门管理内存的结构体,另外分配一整块内存,固定用来做后期分配用。

S2:对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;

具体的,管理结构体用链表的方式来管理整块内存,对后期将要分配的内存做划分,分成固定的大小,逐个对这些内存做索引,以便后续分配的时候使用。另外定义一块数组来管理这些内存,数组的序号和内存的序号相同,例如管理区的第1号管理结构体对应着内存块中第1块内存。

S3:利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;

具体的,用单向链表的方式将这些小块内存串联起来,管理结构体有next变量,初始化时指向下一个序号的结构体指针,这样把这些结构体以链表的方式连接起来,并用head和tail来标记这个链表的头结构和尾结构,初始化完成。

S4:当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点。

具体的,当需要用一块内存的时候,就从这个链表的head中的索引号中找到对应的小块内存,然后head指向下一个节点。

通过上述描述可知,本申请实施例提供的上述小块内存的管理方法,由于先在初始化过程中,分配一整块内存;然后对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引;再利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构;最后,当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点,因此该方法和装置移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。

本申请实施例提供的第二种小块内存的管理方法,是在上述第一种小块内存的管理方法的基础上,还包括如下技术特征:

当需要释放所述预设内存时,将所述预设内存对应的结构插入到所述链表的tail后面,并将所述tail指向插入的所述结构。

具体的,当这块内存用完要释放的时候,就把这块内存所对应的结构插入到这个链表的tail后面,并且tail指向刚插入的这个结构。这样在有空间可用的情况下,每次分配的时间复杂度都是O(1),而且不会产生内存碎片的问题。初始化,分配和释放的代码量很少。可以很方便将代码的移到其他项目。

本申请实施例提供的第三种小块内存的管理方法,是在上述第一种小块内存的管理方法的基础上,还包括如下技术特征:

所述当需要使用一块预设内存之后,还包括:

判断所述head是否等于所述tail,如果等于,则判断所述链表为空。当链表为空时,就不能再继续分配内存,需要等释放后再行分配。

本申请实施例提供的第四种小块内存的管理方法,是在上述第一种小块内存的管理方法的基础上,还包括如下技术特征:

所述从所述链表的所述head的索引号中找到对应的小块内存包括:

利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。

具体的,分配一块内存的时候,就从head所指向的结构体中获取索引号,获取索引号的方法如下:用该结构体的地址减数组0所对应的地址的差值就是这个结构体所对应的索引值,找到这个索引值之后,就可以根据这个索引值去获取内存区的这块内存。将这个结构体的指针值交给调用者,以备后续释放。

本申请实施例提供的第一种小块内存的管理装置如图2所示,图2为本申请实施例提供的第一种小块内存的管理装置的示意图。该装置包括:

分配单元201,用于在初始化过程中,分配一整块内存,具体的,在初始化的时候,定义一个专门管理内存的结构体,另外分配一整块内存,固定用来做后期分配用;

划分单元202,用于对所述一整块内存划分成多个小块内存,并对所述小块内存进行索引,具体的,管理结构体用链表的方式来管理整块内存,对后期将要分配的内存做划分,分成固定的大小,逐个对这些内存做索引,以便后续分配的时候使用。另外定义一块数组来管理这些内存,数组的序号和内存的序号相同,例如管理区的第1号管理结构体对应着内存块中第1块内存;

串联单元203,用于利用单向链表将所述小块内存串联起来,并用head和tail来标记所述链表的头结构和尾结构,具体的,用单向链表的方式将这些小块内存串联起来,管理结构体有next变量,初始化时指向下一个序号的结构体指针,这样把这些结构体以链表的方式连接起来,并用head和tail来标记这个链表的头结构和尾结构,初始化完成;

小块内存寻找单元204,用于当需要使用一块预设内存时,从所述链表的所述head的索引号中找到对应的小块内存,并将所述head指向下一个节点,具体的,当需要用一块内存的时候,就从这个链表的head中的索引号中找到对应的小块内存,然后head指向下一个节点。

通过上述描述可知,本申请实施例提供的上述小块内存的管理装置,移植操作简单,使用灵活,使用范围广,高效利用内存空间,而且分配效率高。

本申请实施例提供的第二种小块内存的管理装置,是在上述第一种小块内存的管理装置的基础上,还包括:

插入单元,用于当需要释放所述预设内存时,将所述预设内存对应的结构插入到所述链表的tail后面,并将所述tail指向插入的所述结构。

具体的,当这块内存用完要释放的时候,就把这块内存所对应的结构插入到这个链表的tail后面,并且tail指向刚插入的这个结构。这样在有空间可用的情况下,每次分配的时间复杂度都是O(1),而且不会产生内存碎片的问题。初始化,分配和释放的代码量很少。可以很方便将代码的移到其他项目。

本申请实施例提供的第三种小块内存的管理装置,是在上述第一种小块内存的管理装置的基础上,还包括:

判断单元,用于判断所述head是否等于所述tail,如果等于,则判断所述链表为空。当链表为空时,就不能再继续分配内存,需要等释放后再行分配。

本申请实施例提供的第四种小块内存的管理装置,是在上述第一种小块内存的管理装置的基础上,还包括:

所述小块内存寻找单元具体用于利用所述预设内存的地址减数组0所对应的地址的差值,得到对应的所述索引号,利用所述索引号找到对应的小块内存。具体的,分配一块内存的时候,就从head所指向的结构体中获取索引号,获取索引号的方法如下:用该结构体的地址减数组0所对应的地址的差值就是这个结构体所对应的索引值,找到这个索引值之后,就可以根据这个索引值去获取内存区的这块内存。将这个结构体的指针值交给调用者,以备后续释放。

本申请实施例提供的上述方法和装置,在空闲内存查找的时间上做到了尽可能的短,在内存空间上没有多余的浪费,只有一个管理结构体,很好的避免了内存空间的浪费。

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

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