CN102968378B - 一种内存分配和释放的方法、装置及*** - Google Patents

一种内存分配和释放的方法、装置及*** Download PDF

Info

Publication number
CN102968378B
CN102968378B CN201210407481.9A CN201210407481A CN102968378B CN 102968378 B CN102968378 B CN 102968378B CN 201210407481 A CN201210407481 A CN 201210407481A CN 102968378 B CN102968378 B CN 102968378B
Authority
CN
China
Prior art keywords
memory
module
allocation
heap district
request
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.)
Expired - Fee Related
Application number
CN201210407481.9A
Other languages
English (en)
Other versions
CN102968378A (zh
Inventor
熊剑
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
World (Shanghai) Technology Development Co., Ltd.
Original Assignee
World (shanghai) Technology Development Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by World (shanghai) Technology Development Co Ltd filed Critical World (shanghai) Technology Development Co Ltd
Priority to CN201210407481.9A priority Critical patent/CN102968378B/zh
Publication of CN102968378A publication Critical patent/CN102968378A/zh
Application granted granted Critical
Publication of CN102968378B publication Critical patent/CN102968378B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Memory System (AREA)

Abstract

本发明公开了一种内存分配和释放的方法、装置及***,本发明通过预置的等差系数获取符合等差序列的固定内存分配量,然后根据所述固定内存分配量对各内存堆区分配序列标号,再根据内存分配请求获取其所对应的序列标号,根据所述序列标号获取内存堆区,最后根据所述内存堆区中的固定内存分配量来分配内存块,并从所述内存块中分配内存。本发明基于固定内存分配量能够实现对内存堆区的动态扩展,当接收到内存分配请求时,能快速申请到合适长度的内存,降低了内存碎片的数量;同时,通过管理区的链表结构能够优先分配内存堆区中已释放的内存,减少了搜索的时间,提高了内存空间的利用率和内存管理的效率。

Description

一种内存分配和释放的方法、装置及***
技术领域
本发明涉及内存管理技术领域,尤其涉及一种基于固定内存分配量的内存分配和释放的方法、装置及***。
背景技术
在现有的***测试中,经常发现***经过长时间运行后,内存占用率越来越高,甚至出现内存分配失败的情况,最终导致程序崩溃。这种情况的发生,一般是由内存碎片导致的。
内存碎片是一个非常麻烦的问题。即使在一个***中事实上仍然有许多空闲内存时,内存碎片还会最终导致出现内存用完的情况,一个不断产生内存碎片的***,不管产生的内存碎片多么小,只要时间足够长,就会将内存用完。这种情况在许多嵌入式***中,特别是在高可用性***中是不可接受的。有些软件环境,如OSE实时操作***已经备有避免内存碎片的良好工具,但个别程序员做出的选择仍然会对最终结果形成影响。
内存碎片描述的是所有不可用的空闲内存,这些资源之所以不能被使用,是因为分配内存的机制使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续的方式出现在不同的位置。如何分配内存决定着内存碎片是否会、何时会成为一个问题,为了解决通用***内存碎片的问题,现提出一种基于固定内存分配量的内存分配和释放的方法、装置及***。
发明内容
本发明所要解决的技术问题在于提供一种基于固定内存分配量的内存分配和释放的方法、装置及***,以解决现有技术中频繁产生内存碎片以及内存分配和释放过程中扩展性差的技术问题。
为达到上述目的,本发明是通过以下技术方案来实现的,
一种内存分配方法,包括:
请求分配至少两个预置了固定内存分配量的内存堆区;
获取内存分配请求;
判断所述内存分配请求所请求分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值;
如否,则根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;如是,则从操作***剩余内存空间分配内存。
一种内存释放方法,包括:
获取内存释放请求;
判断所述内存释放请求所需要释放内存的长度是否超过所述内存堆区中预置的固定内存分配量的最大值,
如否,则根据所述长度获取序列标号,根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;如是,则从操作***剩余内存空间释放内存。
一种内存分配装置,所述装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和***分配模块;
所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;
所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求;
所述第一判断模块,与所述第一请求模块、堆区分配模块和***分配模块相连,用于判断所述内存分配请求所需分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送***分配指令到所述***分配模块;
所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;
所述***分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的***分配指令,并从操作***剩余内存空间分配内存。
一种内存释放装置,所述装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和***释放模块;
所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;
所述第二判断模块,与所述第二请求模块、获取标号模块和***释放模块相连,用于判断所述内存释放请求所请求释放内存长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送***释放指令到所述***释放模块;
所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述长度获取序列标号;
所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;
所述***释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的***释放指令,并根据所述***释放指令调用内存释放函数从操作***剩余内存空间释放内存。
一种内存分配和释放的***,所述***包括内存分配装置和内存释放装置,所述内存分配装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和***分配模块;所述内存释放装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和***释放模块;
所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;
所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求;
所述第一判断模块,与所述第一请求模块、堆区分配模块和***分配模块相连,用于判断所述内存分配请求所需分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送***分配指令到所述***分配模块;
所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;
所述***分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的***分配指令,并从操作***剩余内存空间分配内存;
所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;
所述第二判断模块,与所述第二请求模块、获取标号模块和***释放模块相连,用于判断所述内存释放请求所需释放内存的长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送***释放指令到所述***释放模块;
所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述长度获取内存堆区的序列标号;
所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;
所述***释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的***释放指令,并根据所述***释放指令调用内存释放函数从操作***剩余内存空间释放内存。
本发明通过预置的等差系数获取符合等差序列的固定内存分配量,然后根据所述固定内存分配量对各内存堆区分配序列标号,再根据内存分配请求获取其所对应的序列标号,根据所述序列标号获取内存堆区,最后根据所述内存堆区中的固定内存分配量来分配内存块,并从所述内存块中分配内存。本发明基于固定内存分配量能够实现对内存堆区的动态扩展,当接收到内存分配请求时,能快速申请到合适长度的内存,降低了内存碎片的数量;同时,通过管理区的链表结构能够优先分配内存堆区中已释放的内存,减少了搜索的时间,提高了内存空间的利用率和内存管理的效率。
附图说明
图1为本发明具体实施例的内存分配方法的流程图;
图2为本发明实施例中内存堆区、内存块以及指针间的关系示意图;
图3为本发明具体实施例的内存分配装置的结构示意图;
图4为本发明具体实施例的内存释放方法的流程图;
图5为本发明具体实施例的内存释放装置的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步说明。
实施例一
图1为本发明具体实施例的内存分配方法的流程图,如图1所示,所述方法包括步骤,
S101,向操作***请求至少两个预置了固定内存分配量的内存堆区,按照固定内存分配量的递增顺序给每个内存堆区分配序列标号;
所述固定内存分配量根据预置的等差系数按照等差序列排列;
所述内存堆区中预置的固定内存分配量可以根据预置的等差系数进行设置;所述等差系数指,如果一个数列从第二项起,每一项与它的前一项的差等于同一个常数,这个常数就叫做等差系数;所有已分配的内存堆区按照固定内存分配量的递增顺序给每个内存堆区分配序列标号;所述序列标号为所有能够表示递增顺序的序号,例如1、2……或A、B……;其中,所述内存堆区的个数优选为10~50;
操作***根据预置的固定内存分配量分配多个内存堆区,当获取到内存分配请求,操作***根据所述内存分配请求所请求分配内存的长度在其中一个内存堆区按照所述内存堆区预置的固定内存分配量分配内存块,同一内存堆区分配内存时所分配的内存块的大小是相同的;
已分配内存堆区用于为小于等于预置的固定内存分配量最大值的内存分配请求来分配内存,操作***剩余的内存空间作为一个大的整体用于为大于预置固定内存分配量值最大值的内存分配请求来分配内存;
设具有预定存储量的内存堆区个数n=40,40个具有预定存储量的内存堆区设为Stack1,Stack2……Stack40,对应内存堆区预置的固定内存分配量根据预设的等差系数设为Stackm1,Stackm2……Stackm40,每个内存堆区最大的固定内存分配量等差系数k=512比特,40个内存堆区按照递增顺序进行标号,则所述内存堆区最大固定内存分配量队列为512,1024,1536,2048……20480比特;
其中,从同一个内存堆区Stacki分配的内存块的大小都是相同的即其分配量Stackmi,每个内存堆区的存储量可变,可动态扩展。
S102,获取内存分配请求;
所述内存分配请求包括请求分配内存的长度;
S103,判断所述内存分配请求所请求分配内存的长度是否超过各内存堆区中固定内存分配量的最大值;如否,则进入步骤S104,如是,则进入步骤S106;
即判断当前内存分配请求A所请求分配内存的比特是否超过内存堆区中预设固定分配量最大值20KB;
S104,根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,具体为,
将所述内存分配请求所请求分配内存的长度加上等差系数所得的和再除以所述等差系数从而获取内存堆区的序列标号;根据所述序列标号获取所述序列标号对应的内存堆区;
本实施例中,根据下述公式(1)获取与所述内存分配请求匹配的内存堆区对应的序列标号,使得请求分配内存的长度比前一个内存堆区固定内存分配量大,且比当前内存堆区固定内存分配量小,
i=(A+k)/k(1)
其中,i表示与所述内存分配请求相匹配的内存堆区的序列标号;A表示所述内存分配请求所请求分配内存的长度,k表示等差系数,k为正整数;
如图2所示为本发明实施例中内存堆区、内存块以及指针间的关系示意图,如图2所示,操作***已分配多个预置了固定内存分配量的内存堆区,如内存堆区1、内存堆区2……内存堆区N,所述每个内存堆区包括管理区和数据区,所述数据区包括内存块(也称内存池),所述内存块由操作***根据内存分配请求的长度来分配,所述内存块的长度为(X+Y)*N的内存,其中,X表示哈希到的与内存分配请求匹配的内存堆区预置的固定内存分配量,Y表示内存头的长度,N表示内存地址的对齐位数;
所述管理区为链表结构,包括节点和回收链表指针,所述节点存储已释放内存的地址,当释放了多个内存时,就会创建多个节点,形成多个节点的单链表结构,其中回收链表指针指向首节点;
所述内存块可以根据内存分配请求进行多次内存分配;
以内存堆区1为例进行举例说明,内存堆区1中管理区包括回收链表指针,数据区的内存块包括开始指针、结束指针和当前指针;其中开始指针(MBEGIN)指向被管理内存块的起点,结束指针(MEND)指向被管理内存块的终点,当前指针(MCURRENT)指向开始指针和结束指针之间已用内存的末端;回收链表指针(PFREELIST)指向链表结构中的首节点,每个节点有指向链表结构最后一个节点的指针,最后一个节点的指针指向其本身,便于当某个内存释放后,不用遍历整个链表结构,而直接接入到所述链表结构的链尾。在进程请求内存初始化时,PFREELIST指针为NULL,MCURRENT指针指向MBEGIN指针;
链表结构中没有节点时,PFREELIST指针也为NULL;
S105,从所述匹配的内存堆区分配内存,具体为,
S1051,判断所述匹配的内存堆区对应的回收链表指针是否为空,如否,则进入步骤S1052,如是,则进入步骤S1053;
S1052,根据首节点中的地址分配固定内存分配量的内存,并将所述回收链表指针指向链表结构的下一个节点;
S1053,从当前指针指向的内存块剩余空间中分配内存,即从所述内存堆区中的当前内存块剩余空间中分配内存,包括步骤,
S10531,判断所述内存块剩余空间是否大于“固定内存分配量与内存头的和”,如是,则进入步骤S10532,如否,则进入步骤S10533;
即判断所述内存堆区剩余空间是否大于X+Y;
S10532,存储内存头Y并分配符合固定内存分配量X的内存,更新当前指针;
S10533,从操作***未分配内存空间申请“(固定内存分配量与内存头的和)乘以内存地址的对齐位数”长度的内存块,同时更新开始指针、结束指针和当前指针,并从所述内存块分配内存;
即从操作***未分配内存空间申请(X+Y)*N长度的内存块,同时更新开始指针、结束指针和当前指针,并从所述内存块分配内存;
其中,X表示哈希到的与内存分配请求匹配的内存堆区预置的固定内存分配量,Y表示内存头的长度,所述内存头的长度为4字节,所述内存头存储了内存主体的长度X(即固定内存分配量),N表示内存地址的对齐位数;
S106,从操作***剩余内存空间分配内存。
在内存块中分配的内存包括内存头和内存主体,所述内存头存储了内存主体的长度X(即固定内存分配量),所述内存主体用于存放所述内存分配请求所需写入的数据。
为便于理解,举例说明,如图2所示,当一个内存分配请求到来时,判断所述内存分配请求所需分配内存的长度是否超过各内存堆区预置的固定内存分配量的最大值,如是,则从操作***剩余空间分配内存块;如否,则根据所述请求分配内存长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,然后从所述匹配的内存堆区分配内存。
其中,从所述匹配的内存堆区分配内存时,初始时,回收链表指针为空,回收链表指针(PFREELIST)初始时为空(NULL),则从当前指针指向的内存块剩余空间中分配内存。当释放内存时,则将所释放内存中的地址追加为链表结构中的一个节点,回收链表指针总是指向首节点,当首节点中的地址再次被分配,再回收链表指针就指向下一个节点,所述下一个节点就变为了首节点,当没有下一个节点时,回收链表指针的值就为NULL;
指针的更新过程与相同领域中现有技术相同,此处不再赘述。
内存分配程序需要遵循一些基本的内存分配规则。例如,N表示内存地址的对齐位数。所有的内存分配必须起始于可被4、8或16整除(视处理器体系结构而定)的地址。所以,从操作***未分配内存空间申请(X+Y)*N的物理内存时,可根据实际情况选择申请物理内存的大小。
设置预置固定内存分配量的内存堆区2,根据(X+Y)*N生成所述内存堆区的内存块,根据固定内存分配量从内存块中分配内存。
本实施例中,所有的内存分配地址必须起始于可被4整除,经过以上运算后结果都可被4整除;
图3为本发明具体实施例的内存分配装置的结构示意图,如图3所示,所述装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和***分配模块;
所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;
所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求;
所述第一判断模块,与所述第一请求模块、堆区分配模块和***分配模块相连,用于判断所述内存分配请求所请求分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送***分配指令到所述***分配模块;
所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并利用哈希算法哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;
所述***分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的***分配指令,并从操作***剩余内存空间分配内存;
所述内存装置还包括标号模块;所述标号模块,与所述预置堆区模块和第一请求模块相连,用于根据内存堆区预置的固定内存分配量按照递增顺序给每个内存堆区分配序列标号;
其中,所述堆区分配模块包括获取标号单元、获取堆区单元和分配内存单元;所述获取标号单元,与所述获取堆区单元相连,用于将所述内存分配请求所需分配内存的长度加上等差系数所得的和再除以所述等差系数从而获取内存堆区的序列标号;
所述获取堆区单元,与所述获取标号单元和分配内存单元相连,用于根据所述序列标号获取所述序列标号对应的内存堆区;
所述分配内存单元,与所述获取堆区单元相连,用于从内存堆区分配内存。
所述分配内存单元包括第一判断单元、第一分配单元、第一更新单元、第二判断单元、第二分配单元、第二更新单元、内存块单元、第三更新单元和第三分配单元;
所述第一判断单元,与所述第一分配单元和第二判断单元相连,用于判断所述匹配的内存堆区对应的回收链表指针是否为空,如否,则发送第一分配指令到所述第一分配单元;如是,则发送第二判断指令到所述第二判断单元;
所述第一分配单元,与所述第一判断单元和第一更新单元相连,用于接收所述第一判断单元发送的第一分配指令,并根据回收链表指针指向的首节点中的地址分配固定内存分配量的内存,还用于发送第一更新指令到所述第一更新单元;
所述第一更新单元,与所述第一分配单元相连,用于接收所述第一分配单元发送的第一更新指令,并将所述回收链表指针指向链表结构的下一个节点;
所述第二判断单元,与所述第一判断单元、第二分配单元和内存块单元相连,用于接收所述第一判断单元发送的第二判断指令,并判断所述内存块剩余空间是否大于“固定内存分配量与内存头的和”,如是,则发送第二分配指令到所述第二分配单元;如否,则发送分配内存块指令到所述内存块单元;
所述第二分配单元,与所述第二判断单元和第二更新单元相连,用于接收所述第二判断单元发送的第二分配指令,并存储内存头,同时分配符合固定内存分配量的内存;
所述第二更新单元,与所述第二分配单元相连,用于更新当前指针;
所述内存块单元,与所述第二判断单元和第三更新单元相连,用于接收所述第二判断单元发送的分配内存块指令,并从操作***未分配内存空间申请“固定内存分配量与内存头的和再乘内存地址的对齐位数”长度的内存块,然后发送第三更新指令到所述第三更新单元,同时发送第三分配指令到所述第三分配单元;
所述第三更新单元,与所述内存块单元和第三分配单元相连,用于接收所述内存块单元发送的第三更新指令,并更新开始指针、结束指针和当前指针;
所述第三分配单元,与所述第三更新单元相连,用于接收所述内存块单元发送的第三分配指令,根据所述第三分配指令从所述内存块分配内存;
本实施例通过预置的等差系数获取符合等差序列的固定内存分配量,然后根据所述固定内存分配量对各内存堆区分配序列标号,再根据内存分配请求获取其所对应的序列标号,根据所述序列标号获取内存堆区,最后根据所述内存堆区中的固定内存分配量来分配内存块,并从所述内存块中分配内存。本发明基于固定内存分配量能够实现对内存堆区的动态扩展,当接收到内存分配请求时,快速申请到合适长度的内存,降低了内存碎片的数量;同时,通过管理区的链表结构能够优先分配内存堆区中已释放的内存,减少了搜索的时间,提高了内存空间的利用率和内存管理的效率。
实施例二
图4为本发明具体实施例的内存释放方法的流程图。如图4所示,所述方法包括步骤:
S401,获取内存释放请求;
S402,判断所述内存释放请求所需释放内存长度是否超过所述内存堆区预置的固定内存分配量的最大值,如否,则进入步骤S403,如是,则进入步骤S405;
S403,根据所述长度获取序列标号;
所述序列标号根据下述公式(1)计算得到,使得请求释放内存的长度比前一个内存堆区固定内存分配量大,且比当前内存堆区固定内存分配量小,
i=(A+k)/k(1)
其中,i表示与所述内存释放请求所匹配的内存堆区的序列标号;A表示待释放内存的长度,k表示等差系数,k为正整数;
S404,根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;
S405,从操作***剩余内存空间释放内存。
从操作***剩余内存空间释放内存时,一般通过调用内存释放函数从操作***剩余内存空间释放内存。
所述内存释放请求包含释放地址和释放内存的长度;
根据所述内存释放请求中的释放地址,从当前释放内存的管理区中的长度释放所述内存。
图5为本发明具体实施例的内存释放装置的结构示意图。如图5所示,所述装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和***释放模块;
所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;
所述第二判断模块,与所述第二请求模块、获取标号模块和***释放模块相连,用于判断所述内存释放请求所请求释放内存长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送***释放指令到所述***释放模块;
所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述请求释放内存长度获取内存堆区的序列标号;
所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;
所述***释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的***释放指令,并根据所述***释放指令调用内存释放函数从操作***剩余内存空间释放内存;
本实施例通过等差系数、固定内存分配量和序列标号获取获取回收链表指针,并将内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾。当某个内存释放后,不用遍历整个链表结构,而直接添加到所述链表结构的链尾,减少了遍历回收链表的时间。并保证了已释放内存块被再次分配时,无需进行长度匹配,减少了搜索的时间,提高了内存释放效率和内存管理的效率。
实施例三
所述***包括内存分配装置和内存释放装置;所述内存分配装置与内存释放装置相连;
所述内存分配装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和***分配模块;
所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;
所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求;
所述第一判断模块,与所述第一请求模块、堆区分配模块和***分配模块相连,用于判断所述内存分配请求所请求分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送***分配指令到所述***分配模块;
所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并利用哈希算法哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;
所述***分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的***分配指令,并从操作***剩余内存空间分配内存;
所述内存释放装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和***释放模块;
所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;
所述第二判断模块,与所述第二请求模块、获取标号模块和***释放模块相连,用于判断所述内存释放请求所请求释放内存长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送***释放指令到所述***释放模块;
所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述请求释放内存长度获取内存堆区的序列标号;
所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;
所述***释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的***释放指令,并根据所述***释放指令调用内存释放函数从操作***剩余内存空间释放内存。
本实施例中,内存分配装置通过预置的等差系数获取符合等差序列的固定内存分配量,然后根据所述固定内存分配量对各内存堆区分配序列标号,再根据内存分配请求获取其所对应的序列标号,根据所述序列标号获取内存堆区,最后根据所述内存堆区中的固定内存分配量来分配内存块,并从所述内存块中分配内存。内存分配装置基于固定内存分配量能够实现对内存堆区的动态扩展,当接收到内存分配请求时,快速申请到合适长度的内存,降低了内存碎片的数量;同时,通过管理区的链表结构能够优先分配内存堆区中已释放的内存,减少了搜索的时间,提高了内存空间的利用率和内存管理的效率。此外,内存释放装置通过等差系数、固定内存分配量和序列标号获取获取回收链表指针,并将内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾。内存释放装置在获取到内存释放请求后,不用遍历整个链表结构,而直接将需要释放的内存块的地址添加到链表结构的链尾,减少了遍历回收链表的时间。并保证了已释放内存块被再次分配时,无需进行长度匹配,减少了搜索的时间,提高了内存释放效率和内存管理的效率。
本发明中指针的更新过程、哈希过程与相同领域中现有技术相同,此处不再赘述。
本发明提供的内存分配和释放***可以应用于需要内存分配和释放的终端设备上,例如PC、PDA、手机、服务器等。
本领域的普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序指令相关硬件来完成的,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质可以为ROM、RAM、磁盘、光盘等。
上述仅为本发明的较佳实施例及所运用技术原理,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围内。

Claims (7)

1.一种内存分配方法,其特征在于,包括,
请求分配至少两个预置了固定内存分配量的内存堆区;
获取内存分配请求;
判断所述内存分配请求所请求分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值;
如否,则根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;如是,则从操作***剩余内存空间分配内存;
其中,所述内存堆区包括数据区和管理区;所述数据区包括内存块;
所述管理区为链表结构,包括节点和回收链表指针,回收链表指针指向首节点;
所述内存块包括开始指针、结束指针和当前指针;
所述“从所述匹配的内存堆区分配内存”具体为:
判断所述匹配的内存堆区对应的回收链表指针是否为空,如否,则根据首节点中的地址分配固定内存分配量的内存,并将所述回收链表指针指向链表结构的下一个节点;
如是,则从当前指针指向的内存块剩余空间中分配内存,具体包括:
判断所述内存块剩余空间是否大于“固定内存分配量与内存头的和”,如是,则存储内存头并分配符合固定内存分配量的内存,更新当前指针;如否,则从操作***未分配内存空间申请长度为“固定内存分配量与内存头的和再乘内存地址的对齐位数”的内存块,同时更新开始指针、结束指针和当前指针,并从所述内存块分配内存。
2.根据权利要求1所述的内存分配方法,其特征在于,所述固定内存分配量根据预置的等差系数按照等差序列排列。
3.根据权利要求2所述的内存分配方法,其特征在于,所述步骤“请求分配至少两个预置了固定内存分配量的内存堆区”之后还包括步骤:
按照固定内存分配量的递增顺序给每个内存堆区分配序列标号;
所述“根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区”具体为:
将所述内存分配请求所需分配内存的长度加上等差系数所得的和再除以所述等差系数从而获取序列标号;
根据所述序列标号获取所述序列标号对应的内存堆区。
4.一种内存释放方法,其特征在于,包括,
获取内存释放请求;
判断所述内存释放请求所需要释放内存的长度是否超过内存堆区中预置的固定内存分配量的最大值;
如否,则根据所述长度获取序列标号,根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;如是,则从操作***剩余内存空间释放内存。
5.一种内存分配装置,其特征在于,所述装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和***分配模块;
所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;
所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求;
所述第一判断模块,与所述第一请求模块、堆区分配模块和***分配模块相连,用于判断所述内存分配请求所需分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送***分配指令到所述***分配模块;
所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;
所述***分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的***分配指令,并从操作***剩余内存空间分配内存;
标号模块,与所述预置堆区模块和第一请求模块相连,用于按照固定内存分配量的递增顺序给每个内存堆区分配序列标号;
其中,所述堆区分配模块包括获取标号单元、获取堆区单元和分配内存单元;
所述获取标号单元,与所述获取堆区单元相连,用于将所述内存分配请求所需分配内存的长度加上等差系数所得的和再除以所述等差系数从而获取序列标号;
所述获取堆区单元,与所述获取标号单元和分配内存单元相连,用于根据所述序列标号获取所述序列标号对应的内存堆区;
所述分配内存单元,与所述获取堆区单元相连,用于从内存堆区分配内存;
所述分配内存单元包括第一判断单元、第一分配单元、第一更新单元、第二判断单元、第二分配单元、第二更新单元、内存块单元、第三更新单元和第三分配单元;
所述第一判断单元,与所述第一分配单元和第二判断单元相连,用于判断所述匹配的内存堆区对应的回收链表指针是否为空,如否,则发送第一分配指令到所述第一分配单元;如是,则发送第二判断指令到所述第二判断单元;
所述第一分配单元,与所述第一判断单元和第一更新单元相连,用于接收所述第一判断单元发送的第一分配指令,并根据回收链表指针所指向的首节点中的地址分配固定内存分配量的内存,还用于发送第一更新指令到所述第一更新单元;
所述第一更新单元,与所述第一分配单元相连,用于接收所述第一分配单元发送的第一更新指令,并将所述回收链表指针指向链表结构的下一个节点;
所述第二判断单元,与所述第一判断单元、第二分配单元和内存块单元相连,用于接收所述第一判断单元发送的第二判断指令,并判断所述内存块剩余空间是否大于“固定内存分配量与内存头的和”,如是,则发送第二分配指令到所述第二分配单元;如否,则发送分配内存块指令到所述内存块单元;
所述第二分配单元,与所述第二判断单元和第二更新单元相连,用于接收所述第二判断单元发送的第二分配指令,并存储内存头,同时分配符合固定内存分配量的内存;
所述第二更新单元,与所述第二分配单元相连,用于更新当前指针;
所述内存块单元,与所述第二判断单元和第三更新单元相连,用于接收所述第二判断单元发送的分配内存块指令,并从操作***未分配内存空间申请“固定内存分配量与内存头的和再乘内存地址的对齐位数”长度的内存块,然后发送第三更新指令到所述第三更新单元,同时发送第三分配指令到所述第三分配单元;
所述第三更新单元,与所述内存块单元和第三分配单元相连,用于接收所述内存块单元发送的第三更新指令,并更新开始指针、结束指针和当前指针;
所述第三分配单元,与所述第三更新单元相连,用于接收所述内存块单元发送的第三分配指令,根据所述第三分配指令从所述内存块分配内存。
6.一种内存释放装置,其特征在于,所述装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和***释放模块;
所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;
所述第二判断模块,与所述第二请求模块、获取标号模块和***释放模块相连,用于判断所述内存释放请求所请求释放内存长度是否超过内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送***释放指令到所述***释放模块;
所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述长度获取序列标号;
所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;
所述***释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的***释放指令,并根据所述***释放指令调用内存释放函数从操作***剩余内存空间释放内存。
7.一种内存分配和释放的***,其特征在于,所述***包括内存分配装置和内存释放装置,其特征在于,所述内存分配装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和***分配模块;
所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;
所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求;
所述第一判断模块,与所述第一请求模块、堆区分配模块和***分配模块相连,用于判断所述内存分配请求所需分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送***分配指令到所述***分配模块;
所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;
所述***分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的***分配指令,并从操作***剩余内存空间分配内存;
所述内存释放装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和***释放模块;
所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;
所述第二判断模块,与所述第二请求模块、获取标号模块和***释放模块相连,用于判断所述内存释放请求所需释放内存的长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送***释放指令到所述***释放模块;
所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述长度获取内存堆区的序列标号;
所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;
所述***释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的***释放指令,并根据所述***释放指令调用内存释放函数从操作***剩余内存空间释放内存。
CN201210407481.9A 2012-10-23 2012-10-23 一种内存分配和释放的方法、装置及*** Expired - Fee Related CN102968378B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210407481.9A CN102968378B (zh) 2012-10-23 2012-10-23 一种内存分配和释放的方法、装置及***

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210407481.9A CN102968378B (zh) 2012-10-23 2012-10-23 一种内存分配和释放的方法、装置及***

Publications (2)

Publication Number Publication Date
CN102968378A CN102968378A (zh) 2013-03-13
CN102968378B true CN102968378B (zh) 2016-06-15

Family

ID=47798530

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210407481.9A Expired - Fee Related CN102968378B (zh) 2012-10-23 2012-10-23 一种内存分配和释放的方法、装置及***

Country Status (1)

Country Link
CN (1) CN102968378B (zh)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103150259B (zh) * 2013-03-22 2016-03-30 华为技术有限公司 一种内存回收方法和装置
CN103678152A (zh) * 2014-01-08 2014-03-26 广州思泰信息技术有限公司 一种小内存微型控制器零碎片的动态内存分配方法
CN104615382B (zh) * 2015-02-02 2017-12-12 西安酷派软件科技有限公司 内存空间调度方法及多***终端
CN105512091B (zh) * 2015-12-03 2019-03-12 青岛海信移动通信技术股份有限公司 一种内存分配方法及装置
CN106326004A (zh) * 2016-08-17 2017-01-11 中国航空工业集团公司西安飞行自动控制研究所 一种嵌入式数据库的动态内存分配方法
CN107861887B (zh) * 2017-11-30 2021-07-20 科大智能电气技术有限公司 一种串行易失性存储器的控制方法
CN108920276A (zh) * 2018-06-27 2018-11-30 郑州云海信息技术有限公司 Linux***内存分配方法、***及设备和存储介质
CN111488215A (zh) * 2019-01-28 2020-08-04 普天信息技术有限公司 一种检测内存重复释放的方法
CN112214313A (zh) * 2020-09-22 2021-01-12 深圳云天励飞技术股份有限公司 内存分配方法及相关设备
CN113419858B (zh) * 2021-06-30 2024-02-13 明见(厦门)技术有限公司 一种动态内存分配方法
CN113849309B (zh) * 2021-09-26 2022-09-16 北京元年科技股份有限公司 一种业务对象的内存分配方法以及装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1722106A (zh) * 2004-07-13 2006-01-18 中兴通讯股份有限公司 一种嵌入式实时操作***中内存分配的方法
CN101122883A (zh) * 2006-08-09 2008-02-13 中兴通讯股份有限公司 一种避免内存碎片化的内存分配方法
CN101702138A (zh) * 2009-10-30 2010-05-05 深圳市新飞扬数码技术有限公司 一种内存管理方法、***及服务器

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7783852B2 (en) * 2003-11-26 2010-08-24 Oracle International Corporation Techniques for automated allocation of memory among a plurality of pools

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1722106A (zh) * 2004-07-13 2006-01-18 中兴通讯股份有限公司 一种嵌入式实时操作***中内存分配的方法
CN101122883A (zh) * 2006-08-09 2008-02-13 中兴通讯股份有限公司 一种避免内存碎片化的内存分配方法
CN101702138A (zh) * 2009-10-30 2010-05-05 深圳市新飞扬数码技术有限公司 一种内存管理方法、***及服务器

Also Published As

Publication number Publication date
CN102968378A (zh) 2013-03-13

Similar Documents

Publication Publication Date Title
CN102968378B (zh) 一种内存分配和释放的方法、装置及***
CN100382048C (zh) 一种内存管理方法
CN101221536B (zh) 嵌入式***的内存管理方法及装置
CN104731799B (zh) 内存数据库管理装置
CN102253897B (zh) 一种内存池管理方法及装置
CN102446139B (zh) 一种数据存储方法及装置
CN107066498B (zh) 键值kv存储方法和装置
CN102915276A (zh) 一种用于嵌入式***的内存控制方法
CN106445835A (zh) 内存分配方法与装置
CN101122883A (zh) 一种避免内存碎片化的内存分配方法
CN105718319B (zh) 一种内存池版图解析方法和内存池装置
CN104899156A (zh) 一种面向大规模社交网络的图数据存储及查询方法
CN106681829A (zh) 一种内存管理方法及***
CN102819494B (zh) 一种闪存顺序写入时的优化方法
CN107256196A (zh) 基于闪存阵列的支持零拷贝的缓存***及方法
CN105426408A (zh) 一种多索引的数据处理方法及装置
CN104317742A (zh) 一种优化空间管理的自动精简配置方法
CN1996258A (zh) 一种动态内存池的实现方法
CN108733316A (zh) 用于管理存储***的方法和管理器
CN103455433A (zh) 内存管理方法及***
US20140281132A1 (en) Method and system for ram cache coalescing
CN103294609B (zh) 信息处理装置和存储器管理方法
CN105468660A (zh) 分布式文件***的读方法、客户端设备及分布式文件***
CN109960471A (zh) 数据存储方法、装置、设备以及存储介质
CN103617123A (zh) 一种通过内存块实现内存管理的方法及***

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C53 Correction of patent for invention or patent application
CB02 Change of applicant information

Address after: 518057 Guangdong, Shenzhen Province, science and technology, South Road, No. twelve Changhong science and technology building, building 19, unit 01-11, unit 18

Applicant after: SHENZHEN TEMOBI TECHNOLOGY CO., LTD.

Address before: 518057 Guangdong, Shenzhen Province, science and technology, South Road, No. twelve Changhong science and technology building, building 19, unit 01-11, unit 18

Applicant before: Shenzhen Temobi Science & Tech Development Co.,Ltd.

COR Change of bibliographic data

Free format text: CORRECT: APPLICANT; FROM: SHENZHEN TEMOBI SCIENCE + TECHNOLOGY CO., LTD. TO: SHENZHEN RONGCHANG TIANXIA TECHNOLOGY CO., LTD.

ASS Succession or assignment of patent right

Owner name: RONGCHUANG TIANXIA (SHANGHAI) TECHNOLOGY DEVELOPME

Free format text: FORMER OWNER: SHENZHEN RONGCHANG TIANXIA TECHNOLOGY CO., LTD.

Effective date: 20150624

C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20150624

Address after: The island No. 2500 building, 200433 Shanghai city Yangpu District Siping Road, room 2001

Applicant after: World (Shanghai) Technology Development Co., Ltd.

Address before: 518057 Guangdong, Shenzhen Province, science and technology, South Road, No. twelve Changhong science and technology building, building 19, unit 01-11, unit 18

Applicant before: SHENZHEN TEMOBI TECHNOLOGY CO., LTD.

C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20160615

Termination date: 20171023

CF01 Termination of patent right due to non-payment of annual fee