一种内存分配和释放的方法、装置及系统的制作方法

文档序号:6379437阅读:167来源:国知局
专利名称:一种内存分配和释放的方法、装置及系统的制作方法
技术领域
本发明涉及内存管理技术领域,尤其 涉及一种基于固定内存分配量的内存分配和释放的方法、装置及系统。
背景技术
在现有的系统测试中,经常发现系统经过长时间运行后,内存占用率越来越高,甚至出现内存分配失败的情况,最终导致程序崩溃。这种情况的发生,一般是由内存碎片导致的。内存碎片是一个非常麻烦的问题。即使在一个系统中事实上仍然有许多空闲内存时,内存碎片还会最终导致出现内存用完的情况,一个不断产生内存碎片的系统,不管产生的内存碎片多么小,只要时间足够长,就会将内存用完。这种情况在许多嵌入式系统中,特别是在高可用性系统中是不可接受的。有些软件环境,如OSE实时操作系统已经备有避免内存碎片的良好工具,但个别程序员做出的选择仍然会对最终结果形成影响。内存碎片描述的是所有不可用的空闲内存,这些资源之所以不能被使用,是因为分配内存的机制使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续的方式出现在不同的位置。如何分配内存决定着内存碎片是否会、何时会成为一个问题,为了解决通用系统内存碎片的问题,现提出一种基于固定内存分配量的内存分配和释放的方法、装置及系统。

发明内容
本发明所要解决的技术问题在于提供一种基于固定内存分配量的内存分配和释放的方法、装置及系统,以解决现有技术中频繁产生内存碎片以及内存分配和释放过程中扩展性差的技术问题。为达到上述目的,本发明是通过以下技术方案来实现的,一种内存分配方法,包括请求分配至少两个预置了固定内存分配量的内存堆区;获取内存分配请求;判断所述内存分配请求所请求分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值;如否,则根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;如是,则从操作系统剩余内存空间分配内存。一种内存释放方法,包括获取内存释放请求;判断所述内存释放请求所需要释放内存的长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则根据所述长度获取序列标号,根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;如是,则从操作系统剩余内存空间释放内存。一种内存分配装置,所述装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和系统分配模块;所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分 配请求;所述第一判断模块,与所述第一请求模块、堆区分配模块和系统分配模块相连,用于判断所述内存分配请求所需分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送系统分配指令到所述系统分配模块;所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;所述系统分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的系统分配指令,并从操作系统剩余内存空间分配内存。一种内存释放装置,所述装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和系统释放模块;所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;所述第二判断模块,与所述第二请求模块、获取标号模块和系统释放模块相连,用于判断所述内存释放请求所请求释放内存长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送系统释放指令到所述系统释放模块;所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述长度获取序列标号;所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;所述系统释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的系统释放指令,并根据所述系统释放指令调用内存释放函数从操作系统剩余内存空间释放内存。一种内存分配和释放的系统,所述系统包括内存分配装置和内存释放装置,所述内存分配装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和系统分配模块;所述内存释放装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和系统释放模块;所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求;所述第一判断模块,与所述第一请求模块、堆区分配模块和系统分配模块相连,用于判断所述内存分配请求所需分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送系统分配指令到所述系统分配模块;所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;所述系统分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的系统分配指令,并从操作系统剩余内存空间分配内存;所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求; 所述第二判断模块,与所述第二请求模块、获取标号模块和系统释放模块相连,用于判断所述内存释放请求所需释放内存的长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送系统释放指令到所述系统释放模块;所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述长度获取内存堆区的序列标号;所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;所述系统释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的系统释放指令,并根据所述系统释放指令调用内存释放函数从操作系统剩余内存空间释放内存。本发明通过预置的等差系数获取符合等差序列的固定内存分配量,然后根据所述固定内存分配量对各内存堆区分配序列标号,再根据内存分配请求获取其所对应的序列标号,根据所述序列标号获取内存堆区,最后根据所述内存堆区中的固定内存分配量来分配内存块,并从所述内存块中分配内存。本发明基于固定内存分配量能够实现对内存堆区的动态扩展,当接收到内存分配请求时,能快速申请到合适长度的内存,降低了内存碎片的数量;同时,通过管理区的链表结构能够优先分配内存堆区中已释放的内存,减少了搜索的时间,提高了内存空间的利用率和内存管理的效率。


图I为本发明具体实施例的内存分配方法的流程图;图2为本发明实施例中内存堆区、内存块以及指针间的关系意图;图3为本发明具体实施例的内存分配装置的结构示意图;图4为本发明具体实施例的内存释放方法的流程图;图5为本发明具体实施例的内存释放装置的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步说明。实施例一图I为本发明具体实施例的内存分配方法的流程图,如图I所示,所述方法包括步骤,S101,向操作系统请求至少两个预置了固定内存分配量的内存堆区,按照固定内存分配量的递增顺序给每个内存堆区分配序列标号;所述固定内存分配量根据预置的等差系数按照等差序列排列;所述内存堆区中预置的固定内存分配量可以根据预置的等差系数进行设置;所述等差系数指,如果一个数列从第二项起,每一项与它的前一项的差等于同一个常数,这个常 数就叫做等差系数;所有已分配的内存堆区按照固定内存分配量的递增顺序给每个内存堆区分配序列标号;所述序列标号为所有能够表示递增顺序的序号,例如1、2……或A、B……;其中,所述内存堆区的个数优选为10 50 ;操作系统根据预置的固定内存分配量分配多个内存堆区,当获取到内存分配请求,操作系统根据所述内存分配请求所请求分配内存的长度在其中一个内存堆区按照所述内存堆区预置的固定内存分配量分配内存块,同一内存堆区分配内存时所分配的内存块的大小是相同的;已分配内存堆区用于为小于等于预置的固定内存分配量最大值的内存分配请求来分配内存,操作系统剩余的内存空间作为一个大的整体用于为大于预置固定内存分配量值最大值的内存分配请求来分配内存;设具有预定存储量的内存堆区个数n=40,40个具有预定存储量的内存堆区设为Stack I, Stack 2……Stack 40,对应内存堆区预置的固定内存分配量根据预设的等差系
数设为Stack ml, Stack m2......Stack m40,每个内存堆区最大的固定内存分配量等差系数
k=512比特,40个内存堆区按照递增顺序进行标号,则所述内存堆区最大固定内存分配量队列为 512,1024,1536,2048......20480 比特;其中,从同一个内存堆区Stack i分配的内存块的大小都是相同的即其分配量Stack mi,每个内存堆区的存储量可变,可动态扩展。S102,获取内存分配请求;所述内存分配请求包括请求分配内存的长度;S103,判断所述内存分配请求所请求分配内存的长度是否超过各内存堆区中固定内存分配量的最大值;如否,则进入步骤S104,如是,则进入步骤S106 ;即判断当前内存分配请求A所请求分配内存的比特是否超过内存堆区中预设固定分配量最大值20KB ;S104,根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,具体为,将所述内存分配请求所请求分配内存的长度加上等差系数所得的和再除以所述等差系数从而获取内存堆区的序列标号;根据所述序列标号获取所述序列标号对应的内存堆区;本实施例中,根据下述公式(I)获取与所述内存分配请求匹配的内存堆区对应的序列标号,使得请求分配内存的长度比前一个内存堆区固定内存分配量大,且比当前内存堆区固定内存分配量小,i=(A+k)/k(I)其中,i表示与所述内存分配请求相匹配的内存堆区的序列标号;A表示所述内存分配请求所请求分配内存的长度,k表示等差系数,k为正整数;如图2所示为本发明实施例中内存堆区、内存块以及指针间的关系示意图,如图2所示,操作系统已分配多个预置了固定内存分配量的内存堆区,如内存堆区I、内存堆区2……内存堆区N,所述每个内存堆区包括管理区和数据区,所述数据区包括内存块(也称内存池),所述内存块由操作系统根据内存分配请求的长度来分配,所述内存块的长度为(X+Y)*N的内存,其中,X表示哈希到的与内存分配请求匹配的内存堆区预置的固定内存分配量,Y表示内存头的长度,N表示内存地址的对齐位数;
所述管理区为链表结构,包括节点和回收链表指针,所述节点存储已释放内存的地址,当释放了多个内存时,就会创建多个节点,形成多个节点的单链表结构,其中回收链表指针指向首节点;所述内存块可以根据内存分配请求进行多次内存分配;以内存堆区I为例进行举例说明,内存堆区I中管理区包括回收链表指针,数据区的内存块包括开始指针、结束指针和当如指针;其中开始指针(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,根据所述长度获取序列标号;
所述序列标号根据下述公式(I)计算得到,使得请求释放内存的长度比前一个内存堆区固定内存分配量大,且比当前内存堆区固定内存分配量小,i=(A+k)/k (I)其中,i表示与所述内存释放请求所匹配的内存堆区的序列标号;A表示待释放内存的长度,k表示等差系数,k为正整数;S404,根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;S405,从操作系统剩余内存空间释放内存。从操作系统剩余内存空间释放内存时,一般通过调用内存释放函数从操作系统剩余内存空间释放内存。所述内存释放请求包含释放地址和释放内存的长度;根据所述内存释放请求中的释放地址,从当前释放内存的管理区中的长度释放所述内存。图5为本发明具体实施例的内存释放装置的结构示意图。如图5所示,所述装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和系统释放模块;所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;所述第二判断模块,与所述第二请求模块、获取标号模块和系统释放模块相连,用于判断所述内存释放请求所请求释放内存长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送系统释放指令到所述系统释放模块;所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述请求释放内存长度获取内存堆区的序列标号;所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;所述系统释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的系统释放指令,并根据所述系统释放指令调用内存释放函数从操作系统剩余内存空间释放内存;本实施例通过等差系数、固定内存分配量和序列标号获取获取回收链表指针,并将内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾。当某个内存释放后,不用遍历整个链表结构,而直接添加到所述链表结构的链尾,减少了遍历回收链表的时间。并保证了已释放内存块被再次分配时,无需进行长度匹配,减少了搜索的时间,提高了内存释放效率和内存管理的效率。实施例三
所述系统包括内存分配装置和内存释放装置;所述内存分配装置与内存释放装置相连;所述内存分配装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和系统分配模块;所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区;所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求;所述第一判断模块,与所述第一请求模块、堆区分配模块和系统分配模块相连,用于判断所述内存分配请求所请求分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送系统分配指令到所述系统分配模块;所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并利用哈希算法哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;所述系统分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的系统分配指令,并从操作系统剩余内存空间分配内存;所述内存释放装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和系统释放模块;所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求;所述第二判断模块,与所述第二请求模块、获取标号模块和系统释放模块相连,用于判断所述内存释放请求所请求释放内存长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送系统释放指令到所述系统释放模块;所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述请求释放内存长度获取内存堆区的序列标号;所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;所述系统释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的系统释放指令,并根据所述系统释放指令调用内存释放函数从操作系统剩余内存空间释放内存。本实施例中,内存分配装置通过预置的等差系数获取符合等差序列的固定内存分配量,然后根据所述固定内存分配量对各内存堆区分配序列标号,再根据内存分配请求获取其所对应的序列标号,根据所述序列标号获取内存堆区,最后根据所述内存堆区中的固定内存分配量来分配内存块,并从所述内存块中分配内存。内存分配装置基于固定内存分配量能够实现对内存堆区的动态扩展,当接收到内存分配请求时,快速申请到合适长度的内存,降低了内存碎片的数量;同时,通过管理区的链表结构能够优先分配内存堆区中已释放的内存,减少了搜索的时间,提高了内存空间的利用率和内存管理的效率。此外,内存释放装置通过等差系数、固定内存分配量和序列标号获取获取回收链表指针,并将内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾。内存释放装置在获取到内存释放请求后,不用遍历整个链表结构,而直接将需要释放的内存块的地址添加到链表结构的链尾,减少了遍历回收链表的时间。并保证了已释放内存块被再次分配时,无需进行长度匹配,减少了搜索的时间,提高了内存释放效率和内存管理的效率。本发明中指针的更新过程、哈希过程与相同领域中现有技术相同,此处不再赘述。本发明提供的内存分配和释放系统可以应用于需要内存分配和释放的终端设备上,例如PC、PDA、手机、服务器等。
本领域的普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序指令相关硬件来完成的,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质可以为ROM、RAM、磁盘、光盘等。上述仅为本发明的较佳实施例及所运用技术原理,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围内。
权利要求
1.一种内存分配方法,其特征在于,包括, 请求分配至少两个预置了固定内存分配量的内存堆区; 获取内存分配请求; 判断所述内存分配请求所请求分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值; 如否,则根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存;如是,则从操作系统剩余内存空间分配内存。
2.根据权利要求I所述的内存分配方法,其特征在于,所述固定内存分配量根据预置的等差系数按照等差序列排列。
3.根据权利要求2所述的内存分配方法,其特征在于,所述步骤“请求分配至少两个预置了固定内存分配量的内存堆区”之后还包括步骤 按照固定内存分配量的递增顺序给每个内存堆区分配序列标号; 所述“根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区”具体为 将所述内存分配请求所需分配内存的长度加上等差系数所得的和再除以所述等差系数从而获取序列标号; 根据所述序列标号获取所述序列标号对应的内存堆区。
4.根据权利要求3所述的内存分配方法,其特征在于,所述内存堆区包括数据区和管理区;所述数据区包括内存块; 所述管理区为链表结构,包括节点和回收链表指针,回收链表指针指向首节点; 所述内存块包括开始指针、结束指针和当前指针; 所述“从所述匹配的内存堆区分配内存”具体为 判断所述匹配的内存堆区对应的回收链表指针是否为空,如否,则根据首节点中的地址分配固定内存分配量的内存,并将所述回收链表指针指向链表结构的下一个节点; 如是,则从当前指针指向的内存块剩余空间中分配内存,具体包括 判断所述内存块剩余空间是否大于“固定内存分配量与内存头的和”,如是,则存储内存头并分配符合固定内存分配量的内存,更新当前指针;如否,则从操作系统未分配内存空间申请长度为“固定内存分配量与内存头的和再乘内存地址的对齐位数”的内存块,同时更新开始指针、结束指针和当前指针,并从所述内存块分配内存。
5.—种内存释放方法,其特征在于,包括, 获取内存释放请求; 判断所述内存释放请求所需要释放内存的长度是否超过所述内存堆区中预置的固定内存分配量的最大值; 如否,则根据所述长度获取序列标号,根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾;如是,则从操作系统剩余内存空间释放内存。
6.一种内存分配装置,其特征在于,所述装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和系统分配模块; 所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区; 所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求; 所述第一判断模块,与所述第一请求模块、堆区分配模块和系统分配模块相连,用于判断所述内存分配请求所需分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送系统分配指令到所述系统分配模块; 所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存; 所述系统分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的系 统分配指令,并从操作系统剩余内存空间分配内存。
7.根据权利要求6所述内存分配装置,其特征在于,所述装置还包括标号模块;所述堆区分配模块包括获取标号单元、获取堆区单元和分配内存单元; 所述标号模块,与所述预置堆区模块和第一请求模块相连,用于按照固定内存分配量的递增顺序给每个内存堆区分配序列标号; 所述获取标号单元,与所述获取堆区单元相连,用于将所述内存分配请求所需分配内存的长度加上等差系数所得的和再除以所述等差系数从而获取序列标号; 所述获取堆区单元,与所述获取标号单元和分配内存单元相连,用于根据所述序列标号获取所述序列标号对应的内存堆区; 所述分配内存单元,与所述获取堆区单元相连,用于从内存堆区分配内存。
8.根据权利要求7所述内存分配装置,其特征在于,所述分配内存单元包括第一判断单元、第一分配单元、第一更新单元、第二判断单元、第二分配单元、第二更新单元、内存块单元、第三更新单元和第三分配单元; 所述第一判断单元,与所述第一分配单元和第二判断单元相连,用于判断所述匹配的内存堆区对应的回收链表指针是否为空,如否,则发送第一分配指令到所述第一分配单元;如是,则发送第二判断指令到所述第二判断单元; 所述第一分配单元,与所述第一判断单元和第一更新单元相连,用于接收所述第一判断单元发送的第一分配指令,并根据回收链表指针所指向的首节点中的地址分配固定内存分配量的内存,还用于发送第一更新指令到所述第一更新单元; 所述第一更新单元,与所述第一分配单元相连,用于接收所述第一分配单元发送的第一更新指令,并将所述回收链表指针指向链表结构的下一个节点; 所述第二判断单元,与所述第一判断单元、第二分配单元和内存块单元相连,用于接收所述第一判断单元发送的第二判断指令,并判断所述内存块剩余空间是否大于“固定内存分配量与内存头的和”,如是,则发送第二分配指令到所述第二分配单元;如否,则发送分配内存块指令到所述内存块单兀; 所述第二分配单元,与所述第二判断单元和第二更新单元相连,用于接收所述第二判断单元发送的第二分配指令,并存储内存头,同时分配符合固定内存分配量的内存; 所述第二更新单元,与所述第二分配单元相连,用于更新当前指针;所述内存块单元,与所述第二判断单元和第三更新单元相连,用于接收所述第二判断单元发送的分配内存块指令,并从操作系统未分配内存空间申请“固定内存分配量与内存头的和再乘内存地址的对齐位数”长度的内存块,然后发送第三更新指令到所述第三更新单元,同时发送第三分配指令到所述第三分配单元; 所述第三更新单元,与所述内存块单元和第三分配单元相连,用于接收所述内存块单元发送的第三更新指令,并更新开始指针、结束指针和当前指针; 所述第三分配单元,与所述第三更新单元相连,用于接收所述内存块单元发送的第三分配指令,根据所述第三分配指令从所述内存块分配内存。
9.一种内存释放装置,其特征在于,所述装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和系统释放模块; 所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求; 所述第二判断模块,与所述第二请求模块、获取标号模块和系统释放模块相连,用于判断所述内存释放请求所请求释放内存长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送系统释放指令到所述系统释放模块; 所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述长度获取序列标号; 所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾; 所述系统释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的系统释放指令,并根据所述系统释放指令调用内存释放函数从操作系统剩余内存空间释放内存。
10.一种内存分配和释放的系统,其特征在于,所述系统包括内存分配装置和内存释放装置,其特征在于,所述内存分配装置包括预置堆区模块、第一请求模块、第一判断模块、堆区分配模块和系统分配模块; 所述预置堆区模块,与所述第一请求模块相连,用于请求分配至少两个预置了固定内存分配量的内存堆区; 所述第一请求模块,与所述预置堆区模块和第一判断模块相连,用于获取内存分配请求; 所述第一判断模块,与所述第一请求模块、堆区分配模块和系统分配模块相连,用于判断所述内存分配请求所需分配内存的长度是否超过所述内存堆区中固定内存分配量的最大值,如否,则发送堆区分配指令到所述堆区分配模块;如是,则发送系统分配指令到所述系统分配模块; 所述堆区分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的堆区分配指令,并根据所述长度和预置的等差系数哈希到与所述内存分配请求匹配的内存堆区,从所述匹配的内存堆区分配内存; 所述系统分配模块,与所述第一判断模块相连,用于接收所述第一判断模块发送的系统分配指令,并从操作系统剩余内存空间分配内存;所述内存释放装置包括第二请求模块、第二判断模块、获取标号模块、更新链表模块和系统释放模块; 所述第二请求模块,与所述第二判断模块相连,用于获取内存释放请求; 所述第二判断模块,与所述第二请求模块、获取标号模块和系统释放模块相连,用于判断所述内存释放请求所需释放内存的长度是否超过所述内存堆区中预置的固定内存分配量的最大值,如否,则发送获取标号指令到所述获取标号模块,如是,则发送系统释放指令到所述系统释放模块; 所述获取标号模块,与所述第二判断模块和更新链表模块相连,用于接收所述第二判断模块发送的获取标号指令,根据所述长度获取内存堆区的序列标号; 所述更新链表模块,与所述获取标号模块相连,用于根据所述序列标号获取回收链表 指针,并将所述内存释放请求对应的内存块添加到所述回收链表指针所指向的回收链表的链尾; 所述系统释放模块,与所述第二判断模块相连,用于接收所述第二判断模块发送的系统释放指令,并根据所述系统释放指令调用内存释放函数从操作系统剩余内存空间释放内存。
全文摘要
本发明公开了一种内存分配和释放的方法、装置及系统,本发明通过预置的等差系数获取符合等差序列的固定内存分配量,然后根据所述固定内存分配量对各内存堆区分配序列标号,再根据内存分配请求获取其所对应的序列标号,根据所述序列标号获取内存堆区,最后根据所述内存堆区中的固定内存分配量来分配内存块,并从所述内存块中分配内存。本发明基于固定内存分配量能够实现对内存堆区的动态扩展,当接收到内存分配请求时,能快速申请到合适长度的内存,降低了内存碎片的数量;同时,通过管理区的链表结构能够优先分配内存堆区中已释放的内存,减少了搜索的时间,提高了内存空间的利用率和内存管理的效率。
文档编号G06F12/02GK102968378SQ20121040748
公开日2013年3月13日 申请日期2012年10月23日 优先权日2012年10月23日
发明者熊剑 申请人:深圳市融创天下科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1