管理内存池的方法及装置与流程

文档序号:12120677阅读:311来源:国知局
管理内存池的方法及装置与流程

本发明涉及计算机领域,具体而言,涉及一种管理内存池的方法及装置。



背景技术:

相关技术中的内存池管理采用一个独立的双向链表FreeBlockList来管理未分配的内存块;如图1所示,相关技术中的内存管理包括:内存分配和内存回收两个部分,其中,内存分配具体为返回FreeBlockList链表头部的空闲块,同时将当前分配的块从FreeBlockList链表中移除;而内存回收具体为将回收的内存块加入到FreeBlockList链表的头部或尾部。

可见,相关技术中需要专门的FreeBlockList链表来管理未分配的内存块,实现比较复杂;另外,FreeBlockList链表本身的内存可能是动态分配的,容易产生内存碎片,以及FreeBlockList链表本身额外需要内存空间,内存利用率不充分,FreeBlockList链表操作也会有时间开销,性能不是很高。即相关技术中的内存池管理方式比较复杂、内存利用率不充分、性能也不是很高。

针对上述的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种管理内存池的方法及装置,以至少解决相关技术中由于采用独立的FreeBlockList链表的方式来管理内存池造成内存池管理方式比较复杂、内存利用率不充分、性能不高的技术问题。

根据本发明实施例的一个方面,提供了一种管理内存池的方法,包括:从内存池中划分出多个内存块;对所述多个内存块中的每个内存块进行标记,得到所述每个内存块的标记信息,其中,所述多个内存块中的当前内存块的所述标记信息用于指示所述当前内存块与所述当前内存块的下一个内存块之间的链接关系;根据所述标记信息将所述多个内存块中的部分或全部内存块分配给待请求内存块的应用。

根据本发明的另一个方面,提供了一种管理内存池的装置,包括:划分模块,用于从内存池中划分出多个内存块;标记模块,用于对所述多个内存块中的每个内存块进行标记,得到所述每个内存块的标记信息,其中,所述多个内存块中的当前内存块的所述标记信息用于指示所述当前内存块与所述当前内存块的下一个内存块之间的链接关系;分配模块,用于根据所述标记信息将所述多个内存块中的部分或全部内存块分配给待请求内存块的应用。

在本发明实施例中,采用对从内存池中划分出的多个内存块中的每个内存块进行标记,并得到每个内存块的标记信息,由于多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系,通过标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用的方式,从而实现了不需要采用独立FreeBlockList链表对内存块管理的目的,达到了在内存池管理上内存利用率高且稳定的技术效果,进而解决了相关技术中由于采用独立的FreeBlockList链表的方式来管理内存池造成内存池管理方式比较复杂、内存利用率不充分、性能不高的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是相关技术中内一种存池管理示意图;

图2是根据本发明实施例的一种可选的管理内存池的方法应用环境示意图;

图3是根据本发明实施例的另一种可选的管理内存池的方法应用环境示意图;

图4是根据本发明实施例的一种可选的管理内存池方法的流程图;

图5是根据本发明实施例的另一种可选的管理内存池方法的流程图;

图6是根据本发明实施例的一种可选的管理内存池方法中内存块的示意图;

图7是根据本发明实施例的又一种可选的管理内存池方法的流程图;

图8是根据本发明实施例的再一种可选的管理内存池方法的流程图;

图9是根据本发明实施例的另一种可选的管理内存池方法中内存块的示意图;

图10是根据本发明实施例的一种可选的管理内存池装置的示意图;

图11是根据本发明实施例的另一种可选的管理内存池装置的示意图;

图12是根据本发明实施例的又一种可选的管理内存池装置的示意图;

图13是根据本发明实施例的再一种可选的管理内存池装置的示意图;

图14是根据本发明实施例的还一种可选的管理内存池装置的示意图;

图15是根据本发明实施例的再一种可选的管理内存池方法中内存块的示意图;

图16是根据本发明实施例的一种可选的管理内存池服务器或终端的示意图。

具体实施方式

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

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

实施例1

根据本发明实施例,提供了一种管理内存池的方法的实施例。作为一个可选的实施方式,该管理内存池的方法可以但不限于应用于如图2所示的应用环境中,内置有操作系统的终端202,该终端202在对内存池管理的过程可以是:首先在初始化过程中从内存池中划分出多个内存块,进而会对多个内存块中的每个内存块进行标记,以得到每个内存块的标记信息,其中,该多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系;最后,可以根据标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用。

作为另一种可选的实施方式,该管理内存池的方法还可以但不限于应用于图3所示的应用环境中,内置有操作系统的服务器302,该服务器302在对内存池管理的过程可以是:首先在初始化过程中从内存池中划分出多个内存块,进而会对多个内存块中的每个内存块进行标记,得到每个内存块的标记信息,其中,该多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系;最后,可以根据标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用。

需要说明的是,上述用于实施管理内存池的方法的服务器302可以但不限于替换为具有大数据处理能力的硬件设备,本实施例中对此不做任何限定。

可选地,在本实施例中,上述终端202可以包括但不限于以下至少之一:手机、平板电脑、笔记本电脑、台式PC机及其他安装有游戏客户端的终端。另外,上述只是一种示例,本发明对此不做任何限定。

下面基于上述可选实施方式,对本发明实施例进行详细描述,在本发明实施例中提供了一种管理内存池的方法,如图4所示,该方法的步骤包括:

S402,从内存池中划分出多个内存块;

S404,对多个内存块中的每个内存块进行标记,得到每个内存块的标记信息,其中,多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系;

S406,根据标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用。

可选地,上述步骤S402至步骤S406的执行主体可以是但不限于终端或服务器,或其他硬件设备中。上述仅是一种示例,本实施例中对此不做任何限定。在本实施例中以终端为例对本发明实施例进行详细说明。

可见,通过上述步骤S402至S406可知,在本实施例中,终端可以从内存池中划分出多个内存块,例如,该多个内存块为10个内存块;进而,该终端可以对多个内存块中的每个内存块进行标记,得到每个内存块的标记信息,即对10个内存块中的每一个内存块进行标记,得到每一个内存块的标记信息,其中,多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系,例如,内存块A的标记信息指示链接到内存块C,而内存块C的标记信息指示链接到内存块B,以此类推10个内存块中的标记信息都是可以指示链接到下一个内存块的;最后,终端可以根据该标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用,也就是说,终端可以根据应用的需要将10个内存块中的部分或全部分配给应用。

因此,由于多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系,即对内存块的标记信息可以用于将当前内存块与当前内存块的下一个内存块链接起来,从而可以在不需要采用独立的FreeBlockList链表的前提下,使得划分之后的多个内存块之间存在一种链接关系;也即,在本实施例中,终端采用根据标记信息将多个内存块中的全部或部分内存块分配给待请求内存块的应用的方式,避免了相关技术中采用独立的FreeBlockList链表的方式来管理内存池的方式,从而解决了相关技术中采用独立的FreeBlockList链表的方式来管理内存池,造成存池管理方式比较复杂、内存利用率不充分、性能不高的问题,达到了在内存池管理过程中提高内存利用率高且稳定的技术效果。

可选地,在本实施例中,如图5所示,本实施例S404中对多个内存块中的每个内存块进行标记,得到多个内存块的标记信息的方式,可以包括以下步骤:

S404-1,获取多个内存块中的当前内存块的块头字段中的第一字段,其中,第一字段用于存储控制信息;

S404-2,在第一字段中写入第一标记值,其中,写入有第一标记值的第一字段作为当前内存块的标记信息,第一标记值用于指向当前内存块的下一个内存块,所有多个内存块的标记信息所指示的链接关系构成一个单向的链表。

其中,所谓的单向链表在内存块A中的标记信息指向了内存块B之后,内存块B的标记信息不能指向内存块A,只能指向除了A和B之外的另一个内存块C,即A→B→C。

由本实施例的上述S404-1和S404-2可知,在从内存池中划分出多个内存块之后,会对该多个内存块中的每个内存块进行标记,即初始化过程中,划分出来的每个内存块都是具有对应的标记信息的。以及,本实施例中涉及到的标记信息是内存块的块头字段中的第一字段中的第一标记值,也就是说,该标记信息存在于内存块的块头字段中,不需要任何额外的管理空间来存储,相比较相关技术中采用独立FreeBlockList链表的方式,节省了内存池的存储空间,达到了充分利用内存池的效果。

另外,基于上述步骤S404-1和S404-2,在本实施例的一个可选实施方式中,如图6所示,一个内存块至少包括两个部分,一个部分是Buff部分,该Buff部分是缓冲区,即用来存储应用的空间,另一个部分是Next部分,该Next部分即是本实施例中的块头字段中的第一字段,对刚划分出来的内存块,则可以在该内存块的块头字段中的Next部分中可以写入第一标记值,该第一标记值用来链接到下一个内存块(下一个内存块的块头字段中也标记有链接到另下一个内存块的标记信息)。此外,本实施例中的所有划分的多个内存块的标记信息所指示的链接关系构成一个单向的链表。

例如,在一应用场景中,终端将从内存池中划分出4个内存块,包括:A、B、C、以及D四个内存块,其中,A中的第一字段中(Next)写入有链接到B的标记值,B中的第一字段中(Next)写入有链接到C的标记值,C中的第一字段中(Next)写入有链接到D的标记值。可见,在该应用场景中划分出来的4个内存块中的标记值指示的链接关系为A→B→C→D,所有划分出来的内存块的中与标记值对应的标记信息所指示的链接关系构成一个单向的链表。需要说明的是,上述示例仅仅是用来进行举例说明,并不构成对本发明的限定。

在另一应用场景中,终端将内存池划分为4个内存块,包括:A、B、C、以及D四个内存块,其中,D中的第一字段(Next)中写入有链接到C的标记值,C中的第一字段(Next)中写入有链接到B的标记值,B中的第一字段(Next)中写入有链接到A的标记值。可见,在该应用场景中,所有划分出来的内存块中的标记值指示的链接关系为D→C→B→A,所有划分出来的内存块的中与标记值对应的标记信息所指示的链接关系构成一个单向的链表。需要说明的是,上述示例仅仅是用来进行举例说明,并不构成对本发明的限定。

可选地,在本实施例中,如图7所示,在步骤S406中根据标记信息将多个内存块中未分配的内存块分配给待请求内存块的应用之后,本实施例的方法步骤还可以包括:

S408,回收已分配给应用的内存块;

S410,在已回收的内存块的块头字段中的第一字段中写入第二标记值,其中,第二标记值用于将已回收的内存块的下一个内存块指向链表的头部或尾部所对应的内存块。

由上述步骤S408和S410,对于已分配给应用的内存块,在该应用无需对应的内存块的情况下,终端会对该应用释放的内存块进行回收,并在已回收的内存块的块头字段中的第一字段中写入第二标记值,该第二标记值用于将已回收的内存块的下一个内存块指向单向链表的头部或尾部所对应的内存块,即回收后的内存块通过该第二标记值能够有效的与其他未分配给应用的内存块的第一标记值构成链接关系,通过该链接关系,能够对已回收的内存块进行重复分配,基于上述图6所示的内存块,即可以在内存块的Next部分中可以写入第二标记值。

例如,在一应用场景中,终端将内存池划分为4个内存块,包括:A、B、C、以及D四个内存块,其中,A中的第一字段(Next)中写入有链接到B的标记值,B中的第一字段(Next)中写入有链接到C的标记值,C中的第一字段(Next)中写入有链接到D的标记值。即未分配应用的内存块中的标记值指示的链接关系为A→B→C→D,所有划分出来的内存块的中与标记值对应的标记信息所指示的链接关系构成一个串联起来的单向链表。该单向链表也可以是一种FreeBlockList链表,只是说该单向FreeBlockList链表是由内存块中中的第一字段中的标记值构成,无需额外的空间。在给待请求内存块的应用分配内存块的过程中,在某一情况下,将上述2个内存块(内存块A和B)分配给了该给待请求内存块的应用,而在另外某一情况下,其中,内存块A被该应用所释放,因此,会对该内存块进行回收,回收后,在内存块A的Next部分中可以写入第二标记值,该第二标记值用于将内存块A的下一个内存块指向链表的头部或尾部所对应的内存块,即该内存块A中的第二标记值可以指向内存块C或内存块D。

在另一应用场景中,终端将内存池划分为6个内存块,包括:A、B、C、D、E以及F四个内存块,其中,F中的第一字段(Next)中写入有链接到E的标记值,E中的第一字段(Next)中写入有链接到D的标记值,D中的第一字段(Next)中写入有链接到C的标记值,C中的第一字段(Next)中写入有链接到B的标记值,B中的第一字段(Next)中写入有链接到A的标记值。可见,在该应用场景中未分配应用的内存块中的标记值指示的链接关系为F→E→D→C→B→A,所有划分出来的内存块的中与标记值对应的标记信息所指示的链接关系构成一个单向的链表。在给待请求内存块的应用分配内存块的过程中,在某一情况下,将上述3个内存块(内存块A、B和C)分配给了该给待请求内存块的应用,而在另外某一情况下,其中,内存块A被该应用所释放,因此,会对该内存块进行回收,回收后,在已分配给应用的内存块A被回收后,在内存块A的第一字段(Next)中可以写入第二标记值,该第二标记值用于将内存块A的下一个内存块指向链表的头部或尾部所对应的内存块,即该内存块A中的第二标记值可以指向内存块A或内存块F。

可选地,在本实施例中,如图8所示,在步骤S410中已回收的内存块的块头字段中的第一字段中写入第二标记值之后,本实施例方法的步骤还包括:

步骤S412,在已回收的内存块的块头字段中的第二字段中写入特定的校验码,其中,第二字段用于存储校验码。

由该步骤S412可知,在本实施例中涉及到的内存块中的块头字段除了上述图6中的第一字段后,还涉及到的第二字段,如图9所示,内存块块头字段至少包括两个部分,一个部分是Next部分,该Next部分即是本实施例中的块头字段中的第一字段,如果该内存块是未分配应用的内存块,则可以在该Next部分中可以写入第一标记值,该第一标记值用来链接到下一个未分配应用的内存块。另一个部分是Magic部分,该Magic部分即是本实施例中的块头字段的第二字段。

另外,该第二字段用于存储校验码,也就是说存在该校验码的内存块是已经被回收的内存块,进而通过该校验码能够避免对已回收的内存块进行重复回收,造成资源的浪费。

例如,在一应用场景中,终端将内存池划分为10个内存块,其中已分配应用的内存块有6个,剩下的4个是未分配应用的内存块,包括:A、B、C、以及D四个内存块,其中,A中的第一字段中写入有链接到B的标记值,B中的第一字段中写入有链接到C的标记值,C中的第一字段中写入有链接到D的标记值。可见,在该应用场景中未分配应用的内存块中的标记值指示的链接关系为A→B→C→D。而对于在已分配给应用的内存块E被回收后,在内存块E的第一字段(Next)中可以写入第二标记值,还需要在内存块E的第二字段(Magic)中写入特定的校验码。

在另一应用场景中,终端将内存池划分为10个内存块,其中已分配应用的内存块有6个,剩下的4个是未分配应用的内存块,包括:A、B、C、以及D四个内存块,其中,D中写入有链接到C的标记值,C中写入有链接到B的标记值,B中写入有链接到A的标记值。可见,在该应用场景中未分配应用的内存块中的标记值指示的链接关系为D→C→B→A,而对于在已分配给应用的内存块E被回收后,在内存块E的第一字段(Next)中可以写入第二标记值,还需要在内存块E的第二字段(Magic)中写入特定的校验码。

需要说明的是,在步骤S408中已分配给应用的内存块回收之前,已分配应用的内存块的块头字段中的第一字段和第二字段为空。也就是说,块头字段中用于分配和回收的控制的第一字段和第二字段,只对未分配的内存块有效。

可选地,在本实施例中,本实施例步骤S402中从内存池中划分出多个内存块包括:根据待请求内存块的应用所需的目标内存值从内存池中划分出多个内存块,其中,多个内存块的内存值之和等于目标内存值;

可见,在本实施例中,是根据待请求内存块的应用所需的目标内存值来从内存池中划分内存块,例如,在一应用场景中,待请求内存块的应用所需的目标内存值为1M,则可以从内存池中划分出10个内存值为100kb的内存块,也可以是5个内存值为200kb的内存块,最终所要到达的要求就是划分出来的所有内存块的内存值的和应该是等于该待请求内存块的应用所需的目标内存值。

基于此,本实施例S406中的根据标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用包括:从多个内存块中未分配的第一个内存块开始,根据内存块的标记信息所指示的链接关系查找到多个内存块中的部分或全部内存块,并将查找到的部分或全部内存块分配给待请求内存块的应用。

对于该步骤S406,在一应用场景中,待请求内存块的应用所需的目标内存值为1M,则可以从内存池中划分出5个内存值为200kb的内存块,其中,该5个内存块包括A、B、C、D、E,并且,该5个内存块的链接关系可以是A→B→C→D→E;此时,在某一情况下,该待请求内存块的应用所需要的内存块的数量为3,终端在获取到5个内存块中的其中一个内存块的块地址之后(如该内存块为B),将该一个内存块(内存块B)分配给引用,进而可以从该一个内存块的块头字段中的第一字段所链接的下一内存块(内存块B的所链接的下一内存块为C),并将该内存块C分配给应用,此时,已经满足了待请求内存块的应用所需要的内存块的数量,此次内存块的分配结束。

而在另一个应用场景中,待请求内存块的应用所需的目标内存值为1M,则可以从内存池中划分出8个内存值为200kb的内存块,其中,该8个内存块包括A、B、C、D、E、F、G、以及H,并且,该8个内存块的链接关系可以是A→B→C→D→E→F→G→H;此时,在某一情况下,该待请求内存块的应用所需要的内存块的数量为5,终端在获取到8个内存块中的其中一个内存块的块地址之后(如该内存块为B),将该一个内存块(内存块B)分配给应用,进而可以从该一个内存块的块头字段中的第一字段所链接的下一内存块(内存块B的所链接的下一内存块为C),并将该内存块C分配给应用,进而可以从该一个内存块的块头字段中的第一字段所链接的下一内存块(内存块C的所链接的下一内存块为D),并将该内存块D分配给应用,进而可以从该一个内存块的块头字段中的第一字段所链接的下一内存块(内存块D的所链接的下一内存块为E),将该内存块E分配给应用,此时,已经满足了待请求内存块的应用所需要的内存块的数量,此次内存块的分配结束。

可选地,在本实施例中,步骤S402中从内存池中划分出多个内存块的方式可以是:从内存池中划分出内存值相同的多个内存块。可见,在本实施例中,初始化的时候可以从操作系统中分配一块足够大的空间,然后将该空间平均分成指定大小的内存块,未分配的内存块通过块头字段串联起来形成一个单向的FreeBlockList链表。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例的方法。

实施例2

根据本发明实施例,还提供了一种用于实施上述管理内存池方法的管理内存池装置,如图10所示,该装置包括:

1)划分模块1002,用于从内存池中划分出多个内存块;

2)标记模块1004,与划分模块1002耦合链接,用于对多个内存块中的每个内存块进行标记,得到每个内存块的标记信息,其中,多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系;

3)分配模块1006,与标记模块1004耦合链接,用于根据标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用。

可选地,上述管理内存池装置的可以应用于但不限于终端或服务器,或其他硬件设备中。上述仅是一种示例,本实施例中对此不做任何限定。在本实施例中以终端为例对本发明实施例进行详细说明。

可见,终端中的划分模块1002可以从内存池中划分出多个内存块,,例如,该多个内存块为10个内存块,而标记模块1004会对多个内存块中的每个内存块进行标记,得到每个内存块的标记信息,即对10个内存块中的每一个内存块进行标记,得到每一个内存块的标记信息,其中,多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系;,例如,内存块A的标记信息指示链接到内存块C,而内存块C的标记信息指示链接到内存块B,以此类推10个内存块中的标记信息都是可以指示链接到下一个内存块的;最后,分配模块1006根据该标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用,也就是说,可以根据应用的需要将10个内存块中的部分或全部分配给应用。

因此,由于多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系,即对内存块的标记信息可以用于将当前内存块与当前内存块的下一个内存块链接起来,从而可以在不需要采用独立的FreeBlockList链表的前提下,使得划分之后的多个内存块之间存在一种链接关系;也即,在本实施例中,终端中的分配模块1006采用根据标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用的方式,避免了相关技术中采用独立的FreeBlockList链表的方式来管理内存池的方式,从而解决了相关技术中采用独立的FreeBlockList链表的方式来管理内存池,造成存池管理方式比较复杂、内存利用率不充分、性能不高的问题,达到了在内存池管理过程中提高内存利用率高且稳定的技术效果。

可选地,在本实施例中,如图11所示,本实施例中涉及到的标记模块1004可以包括:

1)获取单元1102,用于获取多个内存块中的当前内存块的块头字段中的第一字段,其中,第一字段用于存储控制信息;

2)写入单元1104,与获取单元1102耦合链接,用于在第一字段中写入第一标记值,其中,写入有第一标记值的第一字段作为当前内存块的标记信息,第一标记值用于指向当前内存块的下一个内存块,所有多个内存块的标记信息所指示的链接关系构成一个单向的链表。

其中,所谓的单向链表在内存块A中的标记信息指向了内存块B之后,内存块B的标记信息不能指向内存块A,只能指向除了A和B之外的另一个内存块C,即A→B→C。

由本实施例的上述写入单元1104和获取单元1102可知,在从内存池中划分出多个内存块之后,写入单元1104会对该多个内存块中的每个内存块进行标记,即初始化过程中,划分出来的每个内存块都是具有对应的标记信息的。以及,本实施例中涉及到的标记信息是写入单元1104写入在获取单元1102获取的内存块的块头字段中的第一字段中的第一标记值,也就是说,该标记信息存在于内存块块头字段中,不需要任何额外的管理空间来存储,相比较相关技术中采用独立FreeBlockList链表的方式,节省了内存池的存储空间,达到了充分利用内存池的效果。

另外,基于上述写入单元1104和获取单元1102,在本实施例的一个可选实施方式中,如图6所示,一个内存块至少包括两个部分,一个部分是Buff部分,该Buff部分是缓冲区,即用来存储应用的空间,另一个部分是Next部分,该Next部分即是本实施例中的块头字段中的第一字段,对刚划分出来的内存块,则可以在该内存块的块头字段中的Next部分中可以写入第一标记值,该第一标记值用来链接到下一个内存块(下一个内存块的块头字段中也标记有链接到另下一个内存块的标记信息)。此外,本实施例中的所有划分的多个内存块的标记信息所指示的链接关系构成一个单向的链表。

例如,在一应用场景中,终端将从内存池中划分出4个内存块,包括:A、B、C、以及D四个内存块,其中,A中的第一字段中(Next)写入有链接到B的标记值,B中的第一字段中(Next)写入有链接到C的标记值,C中的第一字段中(Next)写入有链接到D的标记值。可见,在该应用场景中划分出来的4个内存块中的标记值指示的链接关系为A→B→C→D,所有划分出来的内存块的中与标记值对应的标记信息所指示的链接关系构成一个单向的链表。需要说明的是,上述示例仅仅是用来进行举例说明,并不构成对本发明的限定。

在另一应用场景中,终端将内存池划分为4个内存块,包括:A、B、C、以及D四个内存块,其中,D中的第一字段(Next)中写入有链接到C的标记值,C中的第一字段(Next)中写入有链接到B的标记值,B中的第一字段(Next)中写入有链接到A的标记值。可见,在该应用场景中,所有划分出来的内存块中的标记值指示的链接关系为D→C→B→A,所有划分出来的内存块的中与标记值对应的标记信息所指示的链接关系构成一个单向的链表。需要说明的是,上述示例仅仅是用来进行举例说明,并不构成对本发明的限定。

可选地,在本实施例中,如图12所示,本实施例中的装置还可以包括:

1)回收模块1202,与分配模块1006耦合链接,用于在根据标记信息将多个内存块中未分配的内存块分配给待请求内存块的应用之后,回收已分配给应用的内存块;

2)第一写入模块1204,与回收模块1202耦合链接,用于在已回收的内存块的块头字段中的第一字段中写入第二标记值,其中,第二标记值用于将已回收的内存块的下一个内存块指向链表的头部或尾部所对应的内存块。

由上述第一写入模块1204和回收模块1202可知,对于已分配给应用应用释放的内存块,并在该应用无需对应的内存块的情况下,回收模块1202会对该内存块进行回收,进而第一写入模块1204在已回收的内存块的块头字段中的第一字段中写入第二标记值,该第二标记值用于将已回收的内存块的下一个内存块指向单向链表的头部或尾部所对应的内存块,即回收后的内存块通过该第二标记值能够有效的与其他未分配给应用的内存块的第一标记值构成链接关系,通过该链接关系,能够对已回收的内存块进行重复分配,基于上述图6所示的内存块,即可以在内存块的Next部分中可以写入第二标记值。

例如,在一应用场景中,终端将内存池划分为4个内存块,包括:A、B、C、以及D四个内存块,其中,A中的第一字段(Next)中写入有链接到B的标记值,B中的第一字段(Next)中写入有链接到C的标记值,C中的第一字段(Next)中写入有链接到D的标记值。即未分配应用的内存块中的标记值指示的链接关系为A→B→C→D,所有划分出来的内存块的中与标记值对应的标记信息所指示的链接关系构成一个串联起来的单向链表。该单向链表也可以是一种FreeBlockList链表,只是说该单向FreeBlockList链表是由内存块中中的第一字段中的标记值构成,无需额外的空间。在给待请求内存块的应用分配内存块的过程中,在某一情况下,将上述2个内存块(内存块A和B)分配给了该给待请求内存块的应用,而在另外某一情况下,其中,内存块A被该应用所释放,因此,会对该内存块进行回收,回收后,在内存块A的Next部分中可以写入第二标记值,该第二标记值用于将内存块A的下一个内存块指向链表的头部或尾部所对应的内存块,即该内存块A中的第二标记值可以指向内存块C或内存块D。

在另一应用场景中,终端将内存池划分为6个内存块,包括:A、B、C、D、E以及F四个内存块,其中,F中的第一字段(Next)中写入有链接到E的标记值,E中的第一字段(Next)中写入有链接到D的标记值,D中的第一字段(Next)中写入有链接到C的标记值,C中的第一字段(Next)中写入有链接到B的标记值,B中的第一字段(Next)中写入有链接到A的标记值。可见,在该应用场景中未分配应用的内存块中的标记值指示的链接关系为F→E→D→C→B→A,所有划分出来的内存块的中与标记值对应的标记信息所指示的链接关系构成一个单向的链表。在给待请求内存块的应用分配内存块的过程中,在某一情况下,将上述3个内存块(内存块A、B和C)分配给了该给待请求内存块的应用,而在另外某一情况下,其中,内存块A被该应用所释放,因此,会对该内存块进行回收,回收后,在已分配给应用的内存块A被回收后,在内存块A的第一字段(Next)中可以写入第二标记值,该第二标记值用于将内存块A的下一个内存块指向链表的头部或尾部所对应的内存块,即该内存块A中的第二标记值可以指向内存块A或内存块F。

可选地,在本实施例中,如图13所示,本实施例中的装置还可以包括:第二写入模块1302,与第一写入模块1204耦合链接,用于在已回收的内存块的块头字段中的第一字段中写入第二标记值之后,在已回收的内存块的块头字段中的第二字段中写入特定的校验码,其中,第二字段用于存储校验码。

也就是说,在本实施例中涉及到的内存块中的块头字段除了上述图6中的第一字段后,还涉及到的第二字段,如图9所示,内存块块头字段至少包括两个部分,一个部分是Next部分,该Next部分即是本实施例中的块头字段中的第一字段,如果该内存块是未分配应用的内存块,则可以在该Next部分中可以写入第一标记值,该第一标记值用来链接到下一个未分配应用的内存块。另一个部分是Magic部分,该Magic部分即是本实施例中的块头字段的第二字段。

另外,该第二字段用于存储校验码,也就是说,存在该校验码的内存块是已经被回收的内存块,进而通过该校验码能够避免对已回收的内存块进行重复回收,造成资源的浪费。

例如,在一应用场景中,终端将内存池划分为10个内存块,其中已分配应用的内存块有6个,剩下的4个是未分配应用的内存块,包括:A、B、C、以及D四个内存块,其中,A中的第一字段中写入有链接到B的标记值,B中的第一字段中写入有链接到C的标记值,C中的第一字段中写入有链接到D的标记值。可见,在该应用场景中未分配应用的内存块中的标记值指示的链接关系为A→B→C→D。而对于在已分配给应用的内存块E被回收后,在内存块E的第一字段(Next)中可以写入第二标记值,还需要在内存块E的第二字段(Magic)中写入特定的校验码。

在另一应用场景中,终端将内存池划分为10个内存块,其中已分配应用的内存块有6个,剩下的4个是未分配应用的内存块,包括:A、B、C、以及D四个内存块,其中,D中写入有链接到C的标记值,C中写入有链接到B的标记值,B中写入有链接到A的标记值。可见,在该应用场景中未分配应用的内存块中的标记值指示的链接关系为D→C→B→A,而对于在已分配给应用的内存块E被回收后,在内存块E的第一字段(Next)中可以写入第二标记值,还需要在内存块E的第二字段(Magic)中写入特定的校验码。

需要说明的是,对于本实施例中在已分配给应用的内存块回收之前,本实施例中涉及到的已分配应用的内存块的块头字段中的第一字段和第二字段为空。即块头字段中用于分配和回收的控制的第一字段和第二字段,只对未分配的内存块有效。

可选地,如图14所示,本实施例中的划分模块1002包括:第一划分单元1402,用于根据待请求内存块的应用所需的目标内存值从内存池中划分出多个内存块,其中,多个内存块的内存值之和等于目标内存值;

可见,在本实施例中,该第一划分单元1402根据待请求内存块的应用所需的目标内存值来从内存池中划分内存块,例如,在一应用场景中,待请求内存块的应用所需的目标内存值为1M,则可以从内存池中划分出10个内存值为100kb的内存块,也可以是5个内存值为200kb的内存块,最终所要到达的要求就是划分出来的所有内存块的内存值的和应该是等于该待请求内存块的应用所需的目标内存值。

基于此,本实施例中的分配模块1006包括:查找单元1404,用于从多个内存块中未分配的第一个内存块开始,根据内存块的标记信息所指示的链接关系查找到多个内存块中的部分或全部内存块,分配单元1406,与查找单元1404耦合链接,用于将查找到的部分或全部内存块分配给待请求内存块的应用。

在一应用场景中,待请求内存块的应用所需的目标内存值为1M,则可以从内存池中划分出5个内存值为200kb的内存块,其中,该5个内存块包括A、B、C、D、E,并且,该5个内存块的链接关系可以是A→B→C→D→E;此时,在某一情况下,该待请求内存块的应用所需要的内存块的数量为3,终端在获取到5个内存块中的其中一个内存块的块地址之后(如该内存块为B),将该一个内存块(内存块B)分配给引用,进而可以从该一个内存块的块头字段中的第一字段所链接的下一内存块(内存块B的所链接的下一内存块为C),并将该内存块C分配给应用,此时,已经满足了待请求内存块的应用所需要的内存块的数量,此次内存块的分配结束。

而在另一个应用场景中,待请求内存块的应用所需的目标内存值为1M,则可以从内存池中划分出8个内存值为200kb的内存块,其中,该8个内存块包括A、B、C、D、E、F、G、以及H,并且,该8个内存块的链接关系可以是A→B→C→D→E→F→G→H;此时,在某一情况下,该待请求内存块的应用所需要的内存块的数量为5,终端在获取到8个内存块中的其中一个内存块的块地址之后(如该内存块为B),将该一个内存块(内存块B)分配给应用,进而可以从该一个内存块的块头字段中的第一字段所链接的下一内存块(内存块B的所链接的下一内存块为C),并将该内存块C分配给应用,进而可以从该一个内存块的块头字段中的第一字段所链接的下一内存块(内存块C的所链接的下一内存块为D),并将该内存块D分配给应用,进而可以从该一个内存块的块头字段中的第一字段所链接的下一内存块(内存块D的所链接的下一内存块为E),将该内存块E分配给应用,此时,已经满足了待请求内存块的应用所需要的内存块的数量,此次内存块的分配结束。

可选地,在本实施例中,该划分单元1002包括:第二划分单元,用于从内存池中划分出内存值相同的多个内存块。即初始化的时候可以从操作系统中分配一块足够大的空间,然后将该空间平均分成指定大小的内存块,未分配的内存块通过块头字段串联起来形成一个单向的FreeBlockList链表。

实施例3

本发明实施例的应用环境可以但不限于参照实施例1中的应用环境,本实施例中对此不再赘述。本发明实施例提供了用于实施上述管理内存池方法的一种可选的具体应用示例。

作为一种可选的实施例,例如终端现已将内存池划分为8个内存块,包括A、B、C、D、E、F、G、H,因此,终端需要对该8个内存块进行标记,以得到该5个内存块的标记信息,其中,A中写入有链接到B的标记信息,B中写入有链接到C的标记信息,C中写入有链接到D的标记信息,D中写入有链接到E的标记信息。在该应用场景中未分配应用的内存块中的标记值指示的链接关系为A→B→C→D→E→F→G→H,所有内存块的中与标记值对应的标记信息所指示的链接关系构成一个单向的链表,但当在该8个内存块中的三个内存块已经分配应用了(内存块A、B和C),如图15所示。基于此,终端可以根据标记信息将多个内存块中未分配的内存块分配给待请求内存块的应用。在已分配给应用的内存块A被回收后,在内存块A的Next部分中可以写入第二标记值,该第二标记值用于将内存块A的下一个内存块指向链表的头部或尾部所对应的内存块,即该内存块A中的第二标记值可以指向内存块D或内存块H。具体实施方式可以参照上述实施例1及实施例2,在本实施例中对此不再限定。

在本实施例中,由于多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系,即对内存块的标记信息可以用于将当前内存块与当前内存块的下一个内存块链接起来,从而可以在不需要采用独立的FreeBlockList链表的前提下,使得划分之后多个内存块之间存在一种链接关系;也即,在本实施例中,终端采用根据标记信息将多个内存块中的全部或部分内存块分配给待请求内存块的应用的方式,避免了相关技术中采用独立的FreeBlockList链表的方式来管理内存池的方式,从而解决了相关技术中采用独立的FreeBlockList链表的方式来管理内存池,造成存池管理方式比较复杂、内存利用率不充分、性能不高的问题,达到了在内存池管理过程中提高内存利用率高且稳定的技术效果。

实施例4

根据本发明实施例,还提供了一种用于实施上述管理内存池方法的服务器或终端,如图16所示,该服务器或终端包括:

1)处理器1602;

2)用于存储处理器可执行指令的存储器1604;

3)用于根据处理器的控制进行信息收发通信的通讯接口1606;

其中,该处理器1602被配置为从内存池中划分出多个内存块,并对对多个内存块中每个内存块进行标记,得到每个内存块的标记信息,其中,多个内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系;根据标记信息将多个内存块中的全部或部分内存块分配给待请求内存块的应用。

可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示例,本实施例在此不再赘述。

实施例5

本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以位于服务器或终端,或其他硬件设备上。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:

S1,从内存池中划分出多个内存块;

S2,对多个内存块中的每个内存块进行标记,得到每个内存块的标记信息,其中,未分配的内存块中的当前内存块的标记信息用于指示当前内存块与当前内存块的下一个内存块之间的链接关系;

S3,根据标记信息将多个内存块中的全部或部分内存块分配给待请求内存块的应用。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:

S1,获取当前内存块的块头字段中的第一字段,其中,第一字段用于存储控制信息;

S2,在第一字段中写入第一标记值,其中,写入有第一标记值的第一字段作为当前内存块的标记信息,第一标记值用于指向当前内存块的下一个内存块,所有多个内存块的标记信息所指示的链接关系构成一个单向的链表。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:

S1,在根据标记信息将多个内存块中未分配的内存块分配给待请求内存块的应用之后,回收已分配给应用的内存块;

S2,在已回收的内存块的块头字段中的第一字段中写入第二标记值,其中,第二标记值用于将已回收的内存块的下一个内存块指向链表的头部或尾部所对应的内存块。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:

S1,在已回收的内存块的块头字段中的第一字段中写入第二标记值之后,在已回收的内存块的块头字段中的第二字段中写入特定的校验码,其中,第二字段用于存储校验码。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:

S1,从内存池中划分出多个内存块包括:根据待请求内存块的应用所需的目标内存值从内存池中划分出多个内存块,其中,多个内存块的内存值之和等于目标内存值;

S2,根据标记信息将多个内存块中的部分或全部内存块分配给待请求内存块的应用包括:从多个内存块中未分配的第一个内存块开始,根据内存块的标记信息所指示的链接关系查找到多个内存块中的部分或全部内存块,并将查找到的部分或全部内存块分配给待请求内存块的应用。

可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:

S1,从内存池中划分出内存值相同的多个内存块。

可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

可选地,本实施例中的具体示例可以参考上述实施例1和实施例2中所描述的示例,本实施例在此不再赘述。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

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