CN109508235A - 一种内存池管理方法、装置及计算机可读存储介质 - Google Patents
一种内存池管理方法、装置及计算机可读存储介质 Download PDFInfo
- Publication number
- CN109508235A CN109508235A CN201811138754.8A CN201811138754A CN109508235A CN 109508235 A CN109508235 A CN 109508235A CN 201811138754 A CN201811138754 A CN 201811138754A CN 109508235 A CN109508235 A CN 109508235A
- Authority
- CN
- China
- Prior art keywords
- memory block
- memory
- subscript
- storage location
- internal storage
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
Abstract
本发明公开了一种内存池管理方法、装置及计算机可读存储介质,该方法通过根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标,建立目标下标和目标下标对应的内存块的映射关系,以使在释放待释放内存单元时,根据预设规则查找到待释放内存单元所属的内存块,其中,内存池每次向操作系统申请的内存块的大小均为N1,N1为大于等于1的整数,解决了现有查找待释放内存单元所属的内存块时,效率较低的问题,本发明还公开了一种装置及计算机可读存储介质,通过实施上述方案,可以根据预设规则查找到待释放内存单元所属的内存块,不用依次判断待释放内存单元是否属于内存池中的各内存块,从而提升了查找速度,查找效率更高。
Description
技术领域
本发明涉及内存池领域,更具体地说,涉及一种内存池管理方法、装置及计算机可读存储介质。
背景技术
内存池(memory pool)技术是通过预先向操作系统申请适当大小的内存,之后对内存的分配和释放都作用在这些内存上;相应的,我们称起到内存分配和释放的这些内存为内存池。
内存池由一系列的内存块组成,当应用程序向内存池申请内存后,会将内存块的内存单元分配给应用程序使用,在应用程序删除内存时,即需要释放内存单元时,则需要先查找待该释放的内存单元所属的内存块,然后在该内存块中释放待释放内存单元。现有技术中,在查找待释放内存单元所属的内存块时,通常是依次判断待释放内存单元是否属于内存池中的各内存块,以此来找到待释放内存单元所属的内存块,这种查找方式中,需要依次判断待释放内存单元是否属于内存池中的内存块,判断次数太多,查找的速度太慢,从而导致效率低。
发明内容
本发明要解决的技术问题现有技术中,在查找待释放内存单元时,通常是依次判断待释放内存单元是否属于内存池中的内存块,从而导致查找的速度太慢,效率较低的问题,针对该技术问题,提供一种内存池管理方法、装置及计算机可读存储介质。
为解决上述技术问题,本发明提供一种内存池管理方法,所述内存池每次向操作系统申请的内存块的大小均为N1,所述N1为大于等于1的整数,所述内存池管理方法包括:
根据预设规则确定在管理数组中与所述内存池中各内存块一一对应的目标下标;
建立所述目标下标和所述目标下标对应的内存块的映射关系,以使在释放待释放内存单元时,根据所述预设规则查找到所述待释放内存单元所属的内存块。
可选的,所述管理数组中元素的个数大于等于所述内存池所属应用程序最大虚拟内存除以所述N1所得的商。
可选的,所述建立所述目标下标和所述目标下标对应的各内存块的映射关系包括:
将所述目标下标对应的元素值更新为所述目标下标对应的内存块的唯一标识信息。
可选的,所述将所述目标下标对应的元素值更新为所述目标下标对应的内存块的唯一标识信息包括:
将所述目标下标对应的元素值更新为所述目标下标对应的内存块的首地址或尾地址。
可选的,所述建立所述目标下标和所述目标下标对应的内存块的映射关系之后,还包括:
根据所述预设规则确认在所述管理数组中与所述待释放内存单元对应的第一下标;
判断所述待释放内存单元是否属于所述第一下标对应的第一内存块;
若是,在所述第一内存块中释放所述待释放内存单元。
可选的,所述在所述第一内存块中释放所述待释放内存单元包括:
更新所述第一内存块的空闲链表,将所述待释放内存单元设置为所述空闲列表的最后一项。
可选的,判定所述待释放内存单元不属于所述第一下标对应的第一内存块之后,还包括:
判断所述待释放内存单元是否属于第二下标对应的第二内存块,所述第二下标为与所述第一下标相邻的下标;
若是,则在所述第二内存块中释放所述待释放内存单元。
可选的,所述预设规则包括:将内存单元首地址除以所述N1,并将所得的商向下取整得到所述内存单元在所述管理数组中的下标;所述根据预设规则确定在管理数组中与所述内存池中各内存块一一对应的目标下标包括:
将所述内存池中各内存块的首地址除以所述N1,将得到的商向下取整得到所述内存池中各内存块对应的目标下标。
进一步地,本发明还提供了一种装置,所述装置包括处理器、存储器及通信总线;
所述通信总线用于实现处理器和存储器之间的连接通信;
所述处理器用于执行存储器中存储的一个或者多个程序,以实现上述任一项所述的内存池管理方法的步骤。
进一步地,本发明还提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现上述任一项所述的内存池管理方法的步骤。
有益效果
本发明提供一种内存池管理方法、装置及计算机可读存储介质,针对现有在查找待释放内存单元所属的内存块时,通常是依次判断待释放内存单元是否属于内存池中的内存块,从而导致查找的速度太慢,效率较低的问题,通过根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标,建立目标下标和目标下标对应的内存块的映射关系,以使在释放待释放内存单元时,根据预设规则查找到待释放内存单元所属的内存块,其中,内存池每次向操作系统申请的内存块的大小均为N1,N1为大于等于1的整数,也就是说,本发明中,根据预设规则建立了内存池中的各内存块与管理数组中的目标下标的一一映射关系,这样,在释放待释放内存单元时,可以根据预设规则查找到待释放内存单元所属的内存块,不用依次判断待释放内存单元是否属于内存池中的各内存块,从而提升了查找速度,查找效率更高。
附图说明
下面将结合附图及实施例对本发明作进一步说明,附图中:
图1为本发明第一实施例提供的内存池管理方法基本流程图;
图2为本发明第一实施例提供的内存块结构示意图;
图3为本发明第一实施例提供的内存块中空闲链表的初始状态示意图;
图4为本发明第一实施例提供的内存块中更新后的空闲链表状态示意图;
图5为本发明第一实施例提供的查找待释放内存单元所属内存块的流程示意图;
图6为本发明第一实施例提供的待释放内存单元释放前其所属内存块的空闲列表状态示意图;
图7为本发明第一实施例提供的待释放内存单元释放后其所属内存块的空闲列表状态示意图;
图8为本发明第二实施例提供的内存池管理方法细化流程图;
图9为本发明第三实施例提供的装置的结构示意图。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
第一实施例
为了解决现有在查找待释放内存单元所属的内存块时,通常是依次判断待释放内存单元是否属于内存池中的内存块,从而导致查找的速度太慢,效率较低的问题,本实施例提供了一种内存池管理方法,该内存池每次向操作系统申请的内存块的大小均为N1,其中,N1为大于等于1的整数,也即,该内存池为固定内存池。其中,N1可以是2Kbit、3Kbit、4Kbit等。具体的可以根据实际需要灵活设置。请参见图1所示,图1为本实施例提供的内存池管理方法基本流程图,该内存池管理方法包括:
S101、根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标。
应当理解的是,内存池向操作系统申请一个内存块后,会将该内存块放入内存池中,由于内存池每次向操作系统申请的内存块的大小都为N1,因此,内存池中各内存块的大小均为N1。
本实施例中,根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标,也就是说,根据预设规则,在管理数组中,与内存池中任一内存块对应的下标有且只有一个,目标下标为与内存池中内存块对应的下标,任一目标下标对应的内存池中的有且只有一个。
本实施例中,预设规则包括但不限于以下四种规则:
第一种:预设规则可以是将内存单元首地址除以内存池中内存块的大小(即N1),并将所得的商向下取整得到该内存单元在管理数组中的下标,因此根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标则是将内存池中各内存块的首地址除以内存块的大小(即N1),并将所得的商向下取整得到各内存单元在管理数组中的下标,由于内存块的大小为N1,任意两个内存块的首地址之间的差值大于等于N1,任意两个内存块的首地址分别除以N1所得的商之间的差值均大于1,因此,任意两个内存块对应的下标不相同,任意两个目标下标对应的内存块也不相同。应当理解的是,对于一个数向下取整为若该数有小数部分,且小数部分不为0,则去掉小数部分,将整数部分作为该数向下取整得到的值,例如,对于1.2,向下取整为1。为了更好的理解如何根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标,这里以一个示例进行说明,假设内存块的大小为8KB(8KB=8*1024B),内存池中,一个内存块的地址范围为12288~20479,将该内存块的首地址(12288)除以内存块的大小(8*1024=8192)得到的商为1.5,向下取整后为1,则该内存块对应的目标下标为1。
第二种:预设规则也可以是将内存单元首地址除以内存池中内存块的大小(即N1),并将所得的商向上取整得到该内存单元在管理数组中的下标,因此根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标则是将内存池中各内存块的首地址除以内存块的大小(即N1),并将所得的商向上取整得到各内存单元在管理数组中的下标。应当理解的是,对于一个数向上取整为若该数有小数部分,且小数部分不为0,则去掉小数部分,将整数部分加1作为该数向下取整得到的值,例如,对于5.7,向下取整为5。为了更好的理解如何根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标,这里以一个示例进行说明,假设内存块的大小为6KB(6KB=6*1024B),内存池中,一个内存块的地址范围为24576~30719,将该内存块的首地址(24576)除以内存块的大小(6*1024=6144)得到的商为4,向上取整后为4,则该内存块对应的目标下标为4。
第三种:预设规则也可以是将内存单元尾地址除以内存池中内存块的大小(即N1),并将所得的商向下取整得到该内存单元在管理数组中的下标,因此根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标则是将内存池中各内存块的尾地址除以内存块的大小(即N1),并将所得的商向下取整得到各内存单元在管理数组中的下标。例如,假设内存块的大小为3KB(3KB=3*1024B),内存池中,一个内存块的地址范围为30900~33971,将该内存块的尾地址(33971)除以内存块的大小(3*1024=3072)得到的商为11.0582682,向下取整后为11,则该内存块对应的目标下标为11。
第四种:预设规则也可以是将内存单元尾地址除以内存池中内存块的大小(即N1),并将所得的商向上取整得到该内存单元在管理数组中的下标,因此根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标则是将内存池中各内存块的尾地址除以内存块的大小(即N1),并将所得的商向上取整得到各内存单元在管理数组中的下标。
本实施例中,根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标可以是在内存池建立之后,内存池每次向操作系统申请一个内存块之后,就根据预设规则确定在管理数组中与该内存块对应的目标下标,在内存池再次向操作系统申请一个内存块之后,再根据预设规则确定在管理数组中与再次申请的内存块对应的目标下标。也即,在内存池建立之后,内存池每向操作系统申请一个内存块,就根据预设规则确定在管理数组中与该内存块对应的目标下标。
由于要确定在管理数组中与内存池中各内存块一一对应的目标下标,因此,在根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标之前还应当新建管理数组,其中,管理数组中各元素的初始值可以均为0。为了保证内存池中的内存块都能唯一对应一个管理数组中的下标,因此,管理数组的长度N2(也即管理数组中的元素的个数N2)应当大于等于内存池所属应用程序的最大虚拟内存除以内存池中内存块的大小N1所得的商,应当理解的是N2为整数。对于应用程序而言,应用程序使用的内存为虚拟内存,该应用程序最大虚拟内存则与该应用程序的位数有关,例如,对于32位的应用程序而言,其最大虚拟内存为4GB(4GB=4*1024MB=4*1024*1024KB=4*1024*1024*1024B),假设内存池中各内存块的大小N1为4KB(4KB=4*1024B),因此,管理数组的长度N2应当大于等于1M(1M=1024*1024=1048576)。为了尽可能小的减少管理数组的长度,管理数组的长度N2可以等于内存池所属应用程序的最大虚拟内存除以内存池中内存块的大小N1所得的商,由于内存池所属应用程序的最大虚拟内存除以内存池中内存块的大小N1所得的商可能不是整数,因此,可以将内存池所属应用程序的最大虚拟内存除以内存池中内存块的大小N1所得的商向上取整,将得到的值作为管理数组的长度。例如,对于32位的应用程序而言,最大虚拟内存为4GB,假设内存池中各内存块的大小N1为6Kbit,最大虚拟内存除以内存块大小所得的商为699050.667,向上取整后为699051,管理数组的长度N2为699051。
S102、建立目标下标和目标下标对应的内存块的映射关系。
本实施例中,在根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标之后,建立目标下标和目标下标对应的内存块的映射关系。本实施例中,建立目标下标和目标下标对应的内存块的预设关系可以是将目标下标对应的元素值更新为与目标下标对应的内存块的唯一标识信息,其中唯一标识信息可以是该内存块的首地址或尾地址,也即,将目标下标对应的元素值更新为与目标下标对应的内存块的首地址或尾地址,由于管理数组在建立时各元素的初始值为0,因此,将目标下标对应的元素值由0更新为目标下标对应的内存块的首地址或尾地址。例如,假设管理数组的长度为5,则管理数组的下标号的取值为0、1、2、3、4,该数组在建立时各元素的初始值均为0,即该数组为{0,0,0,0,0},假设一个内存块的首地址为1058,该内存块对应的目标下标为1,则将下标为1的元素值更新为1058,更新后的数组为{0,1058,0,0,0}。
建立目标下标和目标下标对应的内存块的映射关系后,这样,在释放待内存单元时,可以根据预设规则查找到待释放内存单元所属的内存块。
需要说明的是,内存池向操作系统申请内存块之后,将内存块添加到内存池中,然后,请参见图2所示,内存池中的每一个内存块又被分割为一个内存块头201和多个大小相等的内存单元202,其中,内存块头和内存单元的大小可以根据实际需要灵活设置。内存块头维护了一个空闲链表,请参见图3所示,图3为内存块中的内存单元均还未被分配时,空闲链表的状态,图中箭头所指为空闲链表的方向,其中空闲链表的第一项为内存单元301,空闲链表的第二项为内存单元392,空闲链表的第三项为内存单元303。当应用程序向内存池中申请一定大小的内存时,若此时,内存池中有合适申请大小的内存块,则从该内存块中取出空闲列表的第一项给应用程序使用,并更新内存块的空闲链表,例如,参见图3,空闲链表的第一项为内存单元301,假设将内存单元301分配给应用程序使用,并更新内存块的空闲链表,请参见图4所示,图4为更新后的空闲链表的状态,空闲链表的第一项为内存单元302,空闲链表的第二项二内存单元303。当应用程序向内存池中申请一定大小的内存时,若此时,内存池中没有合适申请大小的内存块,则内存池向操作系统申请一块内存块,将该内存块放入内存池中,再将这块内存划分成适合分配申请内存大小的内存块,最后再返回空闲链表中的第一项给应用程序使用,并更新内存块的空闲链表。当应用程序删除内存时,则需要先查找待释放内存单元所属的内存块,然后在该内存块中释放该内存单元。
本实施例中,根据预设规则查找到待释放内存单元所属的内存块包括:根据预设规则确认与待释放内存单元对应的第一下标,若该待释放内存单元属于第一下标对应的第一内存块,则查找到待释放内存单元所属的内存块,然后,在该内存块释放待释放内存单元;若该待释放内存单元不属于第一下标对应的第一内存块,则判断待释放内存单元是否属于第二下标对应的内存块,其中,第二下标为与第一下标相邻的下标(例如,若第一下标为2,则第二下标为1、3),若待释放内存单元属于第二下标对应的内存块,则查找到待释放内存单元所属的内存块,在第二内存块中释放待释放内存单元,若释放内存单元不属于第二下标对应的内存块,则表明待释放内存单元不属于内存池。也即,请参见图5所示,在建立目标下标和目标下标对应的内存块的映射关系之后,还包括:
S501、根据预设规则确认在管理数组中与待释放内存单元对应的第一下标。
本实施例中,由于预设规则不同,根据预设规则确认在管理数组中与待释放内存单元对应的第一下标也不同,若预设规则为上述第一种预设规则(即,预设规则是将内存单元首地址除以内存池中内存块的大小,并将所得的商向下取整得到该内存单元在管理数组中的下标),则将待释放内存单元的首地址除以内存池中内存块的大小,并将所得的上向下取整得到该待释放内存单元在管理数组中的下标,例如,假设待释放内存单元的地址范围为4200~4300,内存池中内存单元的大小为3KB(3KB=3*1024B),则将待释放内存单元的首地址(4200)除以内存池中内存块的大小(3072)得到的值为1.3671,待释放内存单元的第一下标为1,判断在管理数组中,下标为1对应的内存块是否是待释放内存单元所属的内存块。对于其他第一预设规则下待释放内存单元对应的第一下标的确认方式,参见上述根据第一预设规则确认各内存块对应的目标索引号的方式,此处不再赘述。
S502、判断待释放内存单元是否属于第一下标对应的第一内存块。
若是,转S503;若否,转S504。
本实施例中,在判断待释放内存单元是否属于第一下标对应的第一内存块时,根据S102中建立的目标下标和目标下标对应的内存块的映射关系查找到与第一下标对应的第一内存块,然后判断待释放内存单元是否属于第一内存块。其中,判断待释放内存单元是否属于第一下标对应的第一内存块可以是,判断该待释放内存单元的首地址或尾地址是否属于第一内存块的地址范围内。其中,若在建立目标下标和目标下标对应的内存块的映射关系时,是将目标下标对应的元素值更新为与目标下标对应的内存块的首地址,则可以根据第一下标对应的元素值以及内存块的大小N1来确定第一内存块的地址范围,例如,假设第一下标对应的元素值为100,内存块的大小N1为200B,则第一内存块的地址范围为100~299;若在建立目标下标和目标下标对应的内存块的映射关系时,是将目标下标对应的元素值更新为与目标下标对应的内存块的尾地址,则可以根据第一下标对应的元素值以及内存块的大小N1来确定第一内存块的地址范围,例如,假设第一下标对应的元素值为500,内存块的大小N1为300B,则第一内存块的地址范围为201~500。
由于管理数组在建立时,管理数组中各元素的初始值均为0,后续在建立目标下标和目标下标对应的内存块的映射关系时,会更新目标下标对应的元素值,因此,在判断待释放内存单元是否属于第一下标对应的第一内存块之前,还可以判断第一下标对应的元素值是否为0,若是,则表明没有内存块与第一下标对应,则转S504,若否,则转S502。
S503、在第一内存块中释放待释放内存单元。
若待释放内存单元属于第一内存块,在第一内存块中释放待释放内存单元,更新第一内存块的空闲链表,其中,可以将待释放内存单元设置为空闲链表的最后一项。例如,请参见图6所示,假设在第一内存块中,内存单元601、内存单元602、内存单元603已被占用,剩余内存单元没有被占用,待释放内存单元为内存单元内存单元603,此时,空闲链表请参见图6,在将待释放内存单元(即内存单元603)释放后,此时,空闲链表请参见图7,空闲链表的最后一项为内存单元603。
S504、判断待释放内存单元是否属于第二下标对应的第二内存块。
若是,转S505;若否,结束。
其中,第二下标为与第一下标相邻的下标。
本实施例中,根据预设规则确定的待释放内存单元的第一下标,与根据预设规则确定的该待释放内存单元所属的内存块的目标下标可能不一样,因此,第一下标对应的内存块可能并不是待释放内存单元所属的内存块,因此,可以判断待释放内存单元是否属于第二下标对应的第二内存块,具体的判断方式可以参见S502,此处不在赘述。
本实施例中,预设规则不同,则第二下标的确认方式不同,具体的可以根据实际情况设置。例如,若预设规则为上述第一种预设规则(即,预设规则是将内存单元首地址除以内存池中内存块的大小,并将所得的商向下取整得到该内存单元在管理数组中的下标)或上述第二种预设规则(即,预设规则是将内存单元首地址除以内存池中内存块的大小,并将所得的商向上取整得到该内存单元在管理数组中的下标),则可能会存在这种情况,该内存块中部分待释放内存单元对应的第一下标,减去该内存块对应的目标下标的值为1,例如,假设内存块的大小为200B,该内存单元的地址范围为502~701,待释放内存单元的地址范围为620~621,待释放内存单元的地址范围属于该内存块的地址范围,因此,该待释放内存单元是属于该内存块的,但是,根据第一种预设规则,该内存块对应的目标下标为2,该待释放单元对应的第一下标为3;根据第二种预设规则,该内存块对应的目标下标为3,该待释放单元对应的第一下标为4,第一下标减去目标下标为1。因此,若预设规则为上述第一种预设规则或上述第二种预设规则,则第二下标为第一下标减1。
若预设规则为上述第三种预设规则(即,预设规则是将内存单元尾地址除以内存池中内存块的大小,并将所得的商向下取整得到该内存单元在管理数组中的下标)或上述第四种预设规则(即,预设规则是将内存单元尾地址除以内存池中内存块的大小,并将所得的商向上取整得到该内存单元在管理数组中的下标),则可能会存在这种情况,该内存块对应的目标下标,减去该内存块中部分待释放内存单元对应的第一下标的值为1,例如,假设内存块的大小为500B,该内存单元的地址范围为400~899,待释放内存单元的地址范围为400~499,待释放内存单元的地址范围属于该内存块的地址范围,因此,该待释放内存单元是属于该内存块的,但是,根据第三种预设规则,该内存块对应的目标下标为1,该待释放单元对应的第一下标为0;根据第二种预设规则,该内存块对应的目标下标为2,该待释放单元对应的第一下标为1,目标下标减去第一下标为1。因此,若预设规则为上述第一种预设第三规则或上述第四种预设规则,则第二下标为第一下标加1。
S505、在第二内存块中释放待释放内存单元。
本实施例中,在第二内存块中释放待释放内存单元的方式,请参见在第一内存块中释放待释放内存单元的方式,此处不在赘述。
本实施例中,在释放待释放内存单元之后,可以判断该待释放内存单元所属的内存块中空闲链表是否包含了整个内存块,也即判断待释放内存单元所属的内存块中所有内存单元是否均处于空闲状态,若是,则内存池可以向操作系统释放该内存块,或者,也可以将该内存块加入内存池的缓存队列中,在下次需要时直接从缓存中提取;若否,结束。
本实施例提供的内存池管理方法,通过根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标,建立目标下标和目标下标对应的内存块的映射关系,以使在释放待释放内存单元时,根据预设规则查找到待释放内存单元所属的内存块,其中,内存池每次向操作系统申请的内存块的大小均为N1,N1为大于等于1的整数,也就是说,本实施例中,根据预设规则建立了内存池中的各内存块与管理数组中的目标下标的一一映射关系,这样,在释放待释放内存单元时,可以根据预设规则查找到待释放内存单元所属的内存块,不用依次判断待释放内存单元是否属于内存池中的各内存块,从而提升了查找速度,查找效率更高。
第二实施例
为了更好的理解本发明,本实施例结合更加具体的示例进行说明,假设内存池所属的应用程序为32位应用程序,操作系统为32位操作系统,内存池每次向操作系统申请的内存块的大小均为N1,请参见图所示,图8为本发明第二实施例提供的内存池管理方法的细化流程图,该内存池管理方法包括:
S801、新建管理数组。
其中,管理数组为一维数组,管理数组中各元素的初始值均为0,管理数组中元素的个数为N2,其中,N2等于内存池所属应用程序的最大虚拟内存除以内存池中内存块的大小N1所得的商。
本实施例中,由于内存池所属的应用程序为32位应用程序,最大虚拟内存为4GB,虚拟内存的地址范围为0~(4*1024*1024*1024-1),假设N1为4KB,则管理数组的长度N2=4GB/4KB=(4*1024*1024*1024)/(4*1024*)=1M=1024*1024,则管理数组的下标号的取值范围为0~(1M-1),管理数组为{0,0,0,0……0}。
S802、内存池向操作系统申请一块内存块。
本实施例中,在内存池需要向操作系统申请内存时,内存池向操作系统申请一块内存块。申请的内存块的大小为4KB。
S803、在申请成功后,将该新申请的内存块放入内存池中。
S804、根据预设规则在管理系统中确定该新申请的内存块对应的目标下标。
本实施例中,内存池申请内存块成功后,将该新申请的内存块放入内存池中,并根据预设规则在管理系统中确定该新申请的内存块对应的目标下标。其中,预设规则为将内存单元首地址除以内存池中内存块的大小(即N1),并将所得的商向下取整得到该内存单元在管理数组中的下标,因此,根据预设规则在管理系统中确定该新申请的内存块对应的目标下标是:将该新申请的内存块的首地址除以内存池中内存块的大小(即N1),并将所得的商向下取整得到该内存单元在管理数组中的下标。
承接上例,假设该新申请的内存块的地址范围为15000~19095,则该内存块对应的目标下标为3。
S805、建立该新申请的内存块和目标下标的映射关系。
本实施例中,建立该新申请的内存块和目标下标的映射关系为将目标下标对应的元素值更新为该新申请的内存块的首地址,
承接上例,该新申请的内存块的首地址为15000,目标下标为3,则将管理数组中下标3对应的元素值更新为15000,在更新后,该管理数组为{0,0,0,15000,0……0,0,0}。
S806、将该新申请的内存块分割为内存块头和多个大小相等的内存单元,由内存块头维护该内存块的空闲链表。
本实施例中,在将该新申请的内存块放入内存池后,还需要将该新申请的内存块分割为内存块头和多个大小相等的内存单元,由内存块头维护该内存块的空闲链表,其中,内存块头的大小和内存单元的大小可以根据实际需要灵活设置。
本实施例中,是先执行S804,再执行S806,在其它实施例中,也可以先执行S806,再执行S804,当然,也可以同时执行S804和S806。
S807、确定待释放内存单元。
本实施例中,假设待释放内存单元的地址范围为16396~16495。
S808、根据预设规则确认在管理数组中与待释放内存单元对应的第一下标。将待释放内存单元的首地址除以内存块的大小(即N1),将所得的商向下取整得到该待释放内存单元对应的第一下标。
承接上例,待释放内存单元的首地址为16396,内存块的大小为4KB,则第一下标为4。
S809、判断第一下标对应的元素值是否为0。
若否,转S810;若是,转S812。
本实施例中,假设在S807之前,内存池又向操作系统申请了一块内存块,该内存块的地址范围为20000~24095,则该内存块对应的目标下标为4,将管理数组下标为4的元素值更新为20000,则管理数组为{0,0,0,15000,20000,0……0,0,0}。
承接上例,由于第一下标为4,下标4对应的元素值不为0,因此,转S810。
S810、判断待释放内存单元是否属于第一下标对应的第一内存块。
若是,转S811,若否,转S812。
本实施例中,判断待释放内存单元的首地址是否属于第一内存块的地址范围。由于第一下标对应的元素值为第一内存块的首地址,因此第一内存块的地址范围可以通过第一下标对应的元素值和内存块的大小来确定。
承接上例,第一下标为4,内存块大小为4KB,第一下标的元素值为20000,第一内存块的地址范围则为20000~20495。由于待释放内存单元的首地址为16396,不属于第一内存块,因此,转S812。
S811、在第一内存块中释放待释放内存单元。
本实施例中,在第一内存块释放待释放内存单元,更新第一内存块的空闲链表,将待释放内存单元设置为空闲链表的最后一项。
S812、判断第二下标对应的元素值是否为0。
若是,表面该待释放内存单元不属于该内存池,结束,若否,转S813。
本实施例中,第二下标为第一下标减1。
承接上例,由于第一下标为4,则第二下标为3,下标为3对应的元素值为15000,则转S813。
S813、判断待释放内存单元是否属于第二下标对应的第二内存块。
若是,转S814,若否,表面该待释放内存单元不属于该内存池,结束。
具体的判断过程请参见S810。
承接上例,由于待释放内存单元属于第二内存块,因此,转S814。
S814、在第二内存块中释放待释放内存单元。
具体的,请参见S811,此处不再赘述。
本实施例提供的内存池管理方法,将内存池中各内存块的首地址除以内存块的大小,将得到的商向下取整后作为各内存块在管理数组中分别对应的目标下标,并建立目标下标和目标下标对应的内存块的映射关系,这样,在后续查找待释放内存单元所属的内存块时,可以将待释放内存单元的首地址除以内存块的大小,将得到的上向下取整后作为该释放内存单元在管理数组中对应的第一下标,然后在第一下标对应的第一内存块和第二下标对应的第二内存块中查找到该待释放内存单元所属的内存块,也就是说,本实施例提供的内存池管理方法,在查找待释放内存单元所属的内存块时,只需要一次计算操作,最多两次判断操作(判断待释放内存单元是否属于第一内存块,判断待释放内存单元是否属于第二内存块),即可查找到该待释放内存单元所属的内存块,相比现有依次判断待释放内存单元是否属于内存池中的内存块的查找方法,本实施例提供的方法查找速度快,效率更高
第三实施例
本实施例提供了一种装置,请参见图所示,该装置包括处理器901、存储器902及通信总线903,其中:
通信总线903用于实现处理器901和存储器902之间的连接通信;
处理器901用于执行存储器902中存储的一个或者多个程序,以实现上述第一实施例和/或第二实施例中的内存池管理方法的各步骤。
需要说明的是,本实施例中的装置可以以各种形式来实施。例如,本实施例中描述的装置可以包括诸如手机、平板电脑、笔记本电脑、掌上电脑、个人数字助理(PersonalDigital Assistant,PDA)、便捷式媒体播放器(Portable Media Player,PMP)、导航装置、可穿戴设备、智能手环、计步器等移动装置,以及诸如数字TV、台式计算机等固定装置。
本实施例还提供一种计算机可读存储介质,如软盘、光盘、硬盘、闪存、U盘、CF卡、SD卡、MMC卡等,在该计算机可读存储介质中存储有一个或者多个程序,这一个或者多个程序可被一个或者多个处理器执行,以实现上述第一实施例和/或第二实施例中的内存池管理方法的各步骤。
本实施例提供的装置及计算机可读存储介质,通过根据预设规则确定在管理数组中与内存池中各内存块一一对应的目标下标,建立目标下标和目标下标对应的内存块的映射关系,以使在释放待释放内存单元时,根据预设规则查找到待释放内存单元所属的内存块,其中,内存池每次向操作系统申请的内存块的大小均为N1,N1为大于等于1的整数,也就是说,本实施例中,根据预设规则建立了内存池中的各内存块与管理数组中的目标下标的一一映射关系,这样,在释放待释放内存单元时,可以根据预设规则查找到待释放内存单元所属的内存块,不用依次判断待释放内存单元是否属于内存池中的各内存块,从而提升了查找速度,查找效率更高。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。
Claims (10)
1.一种内存池管理方法,其特征在于,所述内存池每次向操作系统申请的内存块的大小均为N1,所述N1为大于等于1的整数,所述内存池管理方法包括:
根据预设规则确定在管理数组中与所述内存池中各内存块一一对应的目标下标;
建立所述目标下标和所述目标下标对应的内存块的映射关系,以使在释放待释放内存单元时,根据所述预设规则查找到所述待释放内存单元所属的内存块。
2.如权利要求1所述的内存池管理方法,其特征在于,所述管理数组中元素的个数大于等于所述内存池所属应用程序最大虚拟内存除以所述N1所得的商。
3.如权利要求1所述的内存池管理方法,其特征在于,所述建立所述目标下标和所述目标下标对应的各内存块的映射关系包括:
将所述目标下标对应的元素值更新为所述目标下标对应的内存块的唯一标识信息。
4.如权利要求3所述的内存池管理方法,其特征在于,所述将所述目标下标对应的元素值更新为所述目标下标对应的内存块的唯一标识信息包括:
将所述目标下标对应的元素值更新为所述目标下标对应的内存块的首地址或尾地址。
5.如权利要求1所述的内存池管理方法,其特征在于,所述建立所述目标下标和所述目标下标对应的内存块的映射关系之后,还包括:
根据所述预设规则确认在所述管理数组中与所述待释放内存单元对应的第一下标;
判断所述待释放内存单元是否属于所述第一下标对应的第一内存块;
若是,在所述第一内存块中释放所述待释放内存单元。
6.如权利要求5所述的内存池管理方法,其特征在于,所述在所述第一内存块中释放所述待释放内存单元包括:
更新所述第一内存块的空闲链表,将所述待释放内存单元设置为所述空闲列表的最后一项。
7.如权利要求5所述的内存池管理方法,其特征在于,判定所述待释放内存单元不属于所述第一下标对应的第一内存块之后,还包括:
判断所述待释放内存单元是否属于第二下标对应的第二内存块,所述第二下标为与所述第一下标相邻的下标;
若是,则在所述第二内存块中释放所述待释放内存单元。
8.如权利要求1-7任一项所述的内存池管理方法,其特征在于,所述预设规则包括:将内存单元首地址除以所述N1,并将所得的商向下取整得到所述内存单元在所述管理数组中的下标;所述根据预设规则确定在管理数组中与所述内存池中各内存块一一对应的目标下标包括:
将所述内存池中各内存块的首地址除以所述N1,将得到的商向下取整得到所述内存池中各内存块对应的目标下标。
9.一种装置,其特征在于,所述装置包括处理器、存储器及通信总线;
所述通信总线用于实现处理器和存储器之间的连接通信;
所述处理器用于执行存储器中存储的一个或者多个程序,以实现如权利要求1至8中任一项所述的内存池管理方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如权利要求1至8中任一项所述的内存池管理方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811138754.8A CN109508235B (zh) | 2018-09-28 | 2018-09-28 | 一种内存池管理方法、装置及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811138754.8A CN109508235B (zh) | 2018-09-28 | 2018-09-28 | 一种内存池管理方法、装置及计算机可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109508235A true CN109508235A (zh) | 2019-03-22 |
CN109508235B CN109508235B (zh) | 2020-12-15 |
Family
ID=65746232
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811138754.8A Active CN109508235B (zh) | 2018-09-28 | 2018-09-28 | 一种内存池管理方法、装置及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109508235B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109992527A (zh) * | 2019-04-15 | 2019-07-09 | 苏州浪潮智能科技有限公司 | 一种全闪存储系统的位图管理方法 |
CN111104347A (zh) * | 2019-12-23 | 2020-05-05 | 北京东土军悦科技有限公司 | 堆内存块查找方法、装置、设备及存储介质 |
CN111352863A (zh) * | 2020-03-10 | 2020-06-30 | 腾讯科技(深圳)有限公司 | 内存管理方法、装置、设备及存储介质 |
CN113127181A (zh) * | 2019-12-30 | 2021-07-16 | 杭州海康威视数字技术股份有限公司 | 内存管理方法、装置及存储介质 |
US20220374270A1 (en) * | 2021-05-20 | 2022-11-24 | Red Hat, Inc. | Assisting progressive chunking for a data queue by using a consumer thread of a processing device |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1556475A (zh) * | 2004-01-02 | 2004-12-22 | 中兴通讯股份有限公司 | 嵌入式实时操作系统中内存释放的方法 |
CN101140531A (zh) * | 2007-10-10 | 2008-03-12 | 中兴通讯股份有限公司 | 快速申请内存的方法 |
US7587697B1 (en) * | 2006-12-12 | 2009-09-08 | Tabula, Inc. | System and method of mapping memory blocks in a configurable integrated circuit |
CN101968772A (zh) * | 2010-10-22 | 2011-02-09 | 烽火通信科技股份有限公司 | 嵌入式系统高效内存池的实现方法 |
CN102103541A (zh) * | 2011-02-28 | 2011-06-22 | 中国人民解放军国防科学技术大学 | 防止内存泄露和内存多次释放的内核模块内存管理方法 |
US8285940B2 (en) * | 2008-02-29 | 2012-10-09 | Cadence Design Systems, Inc. | Method and apparatus for high speed cache flushing in a non-volatile memory |
CN103136104A (zh) * | 2011-11-24 | 2013-06-05 | 深圳市快播科技有限公司 | 一种内存管理方法和系统 |
CN106445835A (zh) * | 2015-08-10 | 2017-02-22 | 北京忆恒创源科技有限公司 | 内存分配方法与装置 |
CN108121603A (zh) * | 2017-12-20 | 2018-06-05 | 安徽皖通邮电股份有限公司 | 一种嵌入式系统内存管理方法 |
-
2018
- 2018-09-28 CN CN201811138754.8A patent/CN109508235B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1556475A (zh) * | 2004-01-02 | 2004-12-22 | 中兴通讯股份有限公司 | 嵌入式实时操作系统中内存释放的方法 |
US7587697B1 (en) * | 2006-12-12 | 2009-09-08 | Tabula, Inc. | System and method of mapping memory blocks in a configurable integrated circuit |
CN101140531A (zh) * | 2007-10-10 | 2008-03-12 | 中兴通讯股份有限公司 | 快速申请内存的方法 |
US8285940B2 (en) * | 2008-02-29 | 2012-10-09 | Cadence Design Systems, Inc. | Method and apparatus for high speed cache flushing in a non-volatile memory |
CN101968772A (zh) * | 2010-10-22 | 2011-02-09 | 烽火通信科技股份有限公司 | 嵌入式系统高效内存池的实现方法 |
CN102103541A (zh) * | 2011-02-28 | 2011-06-22 | 中国人民解放军国防科学技术大学 | 防止内存泄露和内存多次释放的内核模块内存管理方法 |
CN103136104A (zh) * | 2011-11-24 | 2013-06-05 | 深圳市快播科技有限公司 | 一种内存管理方法和系统 |
CN106445835A (zh) * | 2015-08-10 | 2017-02-22 | 北京忆恒创源科技有限公司 | 内存分配方法与装置 |
CN108121603A (zh) * | 2017-12-20 | 2018-06-05 | 安徽皖通邮电股份有限公司 | 一种嵌入式系统内存管理方法 |
Non-Patent Citations (3)
Title |
---|
SEYED MORTEZA NABAVINEJAD 等: ""The Memory Challenge in Reduce Phase of MapReduce Applications"", 《IEEE TRANSACTIONS ON BIG DATA》 * |
YING-HONG TIAN 等: ""An Efficient Memory System for Fast Block Matching Motion Estimation Algorithms"", 《2009 2ND INTERNATIONAL CONGRESS ON IMAGE AND SIGNAL PROCESSING》 * |
刘飞 等: ""面向通信领域通用内存管理单元的算法和实现"", 《计算机工程》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109992527A (zh) * | 2019-04-15 | 2019-07-09 | 苏州浪潮智能科技有限公司 | 一种全闪存储系统的位图管理方法 |
CN111104347A (zh) * | 2019-12-23 | 2020-05-05 | 北京东土军悦科技有限公司 | 堆内存块查找方法、装置、设备及存储介质 |
CN113127181A (zh) * | 2019-12-30 | 2021-07-16 | 杭州海康威视数字技术股份有限公司 | 内存管理方法、装置及存储介质 |
CN113127181B (zh) * | 2019-12-30 | 2024-02-20 | 杭州海康威视数字技术股份有限公司 | 内存管理方法、装置及存储介质 |
CN111352863A (zh) * | 2020-03-10 | 2020-06-30 | 腾讯科技(深圳)有限公司 | 内存管理方法、装置、设备及存储介质 |
CN111352863B (zh) * | 2020-03-10 | 2023-09-01 | 腾讯科技(深圳)有限公司 | 内存管理方法、装置、设备及存储介质 |
US20220374270A1 (en) * | 2021-05-20 | 2022-11-24 | Red Hat, Inc. | Assisting progressive chunking for a data queue by using a consumer thread of a processing device |
US12045655B2 (en) * | 2021-05-20 | 2024-07-23 | Red Hat, Inc. | Assisting progressive chunking for a data queue by using a consumer thread of a processing device |
Also Published As
Publication number | Publication date |
---|---|
CN109508235B (zh) | 2020-12-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109508235A (zh) | 一种内存池管理方法、装置及计算机可读存储介质 | |
US20060003823A1 (en) | Dynamic player groups for interest management in multi-character virtual environments | |
CN105740946B (zh) | 一种应用细胞阵列计算系统实现神经网络计算的方法 | |
CN106104485A (zh) | 针对多进程应用的动态资源管理 | |
CN105608490B (zh) | 细胞阵列计算系统以及其中的通信方法 | |
CN105468291B (zh) | 动态及静态磨损均衡控制方法及装置 | |
CN105335309B (zh) | 一种数据传输方法及计算机 | |
CN106502918B (zh) | 一种内存调度方法及装置 | |
CN105718996A (zh) | 细胞阵列计算系统以及其中的通信方法 | |
CN105718994A (zh) | 细胞阵列计算系统 | |
CN105354147A (zh) | 一种内存池管理方法及管理系统 | |
CN110298508A (zh) | 行为预测方法、装置及设备 | |
CN110659425B (zh) | 一种资源分配方法、装置、电子设备及可读存储介质 | |
CN109064244A (zh) | 一种订单选择方法、装置及服务器 | |
CN108153494A (zh) | 一种io请求处理方法及装置 | |
CN105718991B (zh) | 细胞阵列计算系统 | |
CN111325577B (zh) | 一种区块链中的广告块资源分配方法 | |
CN105718380B (zh) | 细胞阵列计算系统 | |
CN105323320B (zh) | 一种内容分发的方法及装置 | |
CN113289343A (zh) | 数据处理方法、信息展示方法及装置 | |
CN107291552A (zh) | 一种数据处理方法及装置 | |
CN103208076A (zh) | 一种基于游戏内容问答活动的推广方法和装置 | |
CN103002068B (zh) | 虚拟机的ip地址的划分方法 | |
CN105718379A (zh) | 细胞阵列计算系统以及其中细胞间群发通信方法 | |
CN114661378B (zh) | 一种基于加密计算区块链的元宇宙多维算力卸载方案 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |