CN101470665A - 一种无mmu平台的应用系统内存管理的方法及系统 - Google Patents

一种无mmu平台的应用系统内存管理的方法及系统 Download PDF

Info

Publication number
CN101470665A
CN101470665A CNA2007101255328A CN200710125532A CN101470665A CN 101470665 A CN101470665 A CN 101470665A CN A2007101255328 A CNA2007101255328 A CN A2007101255328A CN 200710125532 A CN200710125532 A CN 200710125532A CN 101470665 A CN101470665 A CN 101470665A
Authority
CN
China
Prior art keywords
memory
memory block
threshold values
fpl
pmp
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
Application number
CNA2007101255328A
Other languages
English (en)
Other versions
CN101470665B (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.)
TCL Corp
Original Assignee
TCL Corp
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 TCL Corp filed Critical TCL Corp
Priority to CN2007101255328A priority Critical patent/CN101470665B/zh
Publication of CN101470665A publication Critical patent/CN101470665A/zh
Application granted granted Critical
Publication of CN101470665B publication Critical patent/CN101470665B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Memory System (AREA)

Abstract

本发明适用于内存管理领域,提供了一种无MMU平台的应用系统内存管理的方法及系统,包括:设置内存阀值,对于大块内存建立内存管理模型PMP进行管理,对于小块内存建立内存管理模型SMP进行管理,所述PMP中建有双向链表FPL,管理PMP中所有大于阀值的空闲内存块,所述SMP中建有链表数组,管理SMP中所有小于等于阀值的空闲内存块;接收系统请求分配内存的指令及参数,所述参数包括请求分配的内存长度;当请求分配的内存大于阀值,则在PMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块;或当请求分配的内存小于等于阀值,则在SMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块。

Description

一种无MMU平台的应用系统内存管理的方法及系统
技术领域
本发明属于内存管理领域,尤其涉及一种无MMU平台的应用系统内存管理的方法及系统。
背景技术
针对有内存管理单元(Memory Management Unit,MMU)的处理器设计的一些桌面操作系统,如Windows、Linux,使用了虚拟存储器的概念。虚拟内存地址被送到MMU映射为物理地址,实际存储器被分割为相同大小的页面,采用分页的方式载入进程。
但是有很多应用系统,例如嵌入式系统,是针对没有MMU的处理器开发设计的,因此不能使用处理器的虚拟内存管理技术,它们对于内存的访问是直接通过访问实际物理地址实现的。而且很多应用系统对内存空间没有保护,各个进程实际上共享一个运行空间,一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载入主存储器的连续空间。
由此可见,对于无MMU的应用系统的开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存,在开发应用程序时,则必须考虑内存的分配情况并关注应用程序需要运行空间的大小。此外,由于采用实存储器管理策略,用户程序同内核以及其他用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其他程序的运行异常。因此,对于无MMU的应用系统的开发人员对软件中的一些内存操作要格外小心。
这样的应用系统对内存分配有很高的要求,主要体现在:
1、内存能快速申请和释放,即快速性。系统对实时性的保证要求内存分配过程要尽可能地快;
2、内存分配保持原子性,即可靠性。也就是内存分配的请求必须得到满足,如果分配失败可能会带来灾难性的后果;
3、内存应该各尽其用,即高效性。内存分配要尽可能地少浪费。不可能为了保证满足所有的内存分配请求而将内存配置得无限大。
通常情况下,开发人员对内存的请求和释放都是直接调用系统调用来实现。例如在嵌入式系统ucLinux中,C库中malloc和free的实现是分别基于mmap和munmap两个系统调用来实现的。但是,对内存的频繁的请求肯定带来系统性能的损耗,同时也可能造成大量内存碎片的存在,从而导致无法预料的后果,而且也难于对应用系统的内存使用情况做很好的监控和调整。
在现有的一些应用系统的内存管理方法中,有的采用预分配多个固定长度内存块链表的方式,这种方式主要针对满足应用系统对小内存块的频繁需求,而却忽视了对大内存块的管理,从而降低了应用系统对内存使用的整体效率,无法很好地满足内存分配的可靠性和高效性,而且这种方式需要对应用程序的内存使用预先做出正确的估计,对于比较大些的系统,这种方式的实现具有非常大的难度;有的则直接采用链表的方式对内存块进行动态管理,这种方式将内存块不分大小统一链接在一起,每次分配内存时则通过对链表进行查找足够大的内存来实现,这种方式在具体实施时会由于应用系统对小块内存的频繁需求而耗费大量的CPU时间去查找能满足请求的内存,从而无法满足内存分配的快速性。
这些方式都没有对内存的使用进行系统而全面的管理,不但易造成内存资源的浪费,也不能同时满足应用系统对内存分配的快速性、可靠性和高效性,而且也无法很方便地实现对内存使用状况的统计,以及对内存泄漏和操作越界现象的防范和控制。
发明内容
本发明实施例的目的在于提供一种无MMU平台的应用系统内存管理的方法及系统,旨在解决现有针对无MMU的硬件平台的应用系统内存管理方法没有对内存进行全面、系统的管理,且没有根据应用系统对内存使用的大小进行分级处理,从而无法满足应用系统对内存使用的快速性、可靠性以及高效性的问题。
本发明实施例是这样实现的,一种无MMU平台的应用系统内存管理的方法,所述方法包括:
设置系统内存使用的阀值,对于大于阀值的大块内存建立内存管理模型PMP进行管理,对于小于等于阀值的小块内存建立内存管理模型SMP进行管理,所述内存管理模型PMP中建有双向链表FPL,管理PMP中所有大于阀值的空闲内存块,所述内存管理模型SMP中建有链表数组,管理SMP中所有小于等于阀值的空闲内存块;
接收系统请求分配内存的指令及参数,所述参数包括系统请求分配的内存长度;
当请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块;
或当请求分配的内存小于等于阀值时,则在SMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块。
本发明实施例的另一目的在于提供一种无MMU平台的应用系统内存管理系统,所述系统包括:
初始单元,用于建立对大于阀值的大块内存的操作进行管理的内存管理模型PMP,以及建立对小于等于阀值的小块内存的操作进行管理的内存管理模型SMP,所述内存管理模型PMP中包含双向链表FPL,管理PMP中所有大于阀值的空闲内存块,所述内存管理模型SMP中包含链表数组,管理SMP中所有小于等于阀值的空闲内存块,以及对系统进行初始化;
接口单元,用于接收应用系统对内存的操作指令及参数,以及将指令的执行结果返回给应用系统,所述操作指令包括系统请求分配内存的指令,所述参数包括系统请求分配的内存大小;
大块内存操作管理单元,用于对应用系统请求分配或需要释放的内存大于阀值时,在所述内存管理模型PMP中实现内存的分配或释放;以及
小块内存操作管理单元,用于对应用系统请求分配或需要释放的内存小于等于阀值时,在所述内存管理模型SMP中实现内存的分配或释放。
本发明实施例通过设置内存使用的阀值,针对大于阀值的大内存块以及小于等于阀值的小内存块的操作分别运用大内存块管理模型PMP和小内存块管理模型SMP进行管理,并分别采用双向链表和链表数组对空闲大内存块以及空闲小内存块进行管理,从而实现对应用系统内存使用的全面、系统的管理,既能消除内存碎片的产生,避免内存资源的浪费,又能实现快速、可靠地分配内存及释放。
附图说明
图1是本发明实施例提供的大块内存的管理模型图;
图2是本发明实施例提供的小块内存的管理模型图;
图3是本发明实施例提供的无MMU平台的应用系统内存管理方法的流程图;
图4是本发明实施例提供的分配大块内存的方法流程图;
图5是本发明实施例提供的释放大块内存的方法流程图;
图6是本发明实施例提供的分配小块内存的方法流程图;
图7是本发明实施例提供的释放小块内存的方法流程图;
图8是本发明实施例提供的无MMU平台的应用系统内存管理系统的结构图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例通过设置系统内存使用的阀值,针对大于阀值的大内存块以及小于等于阀值的小内存块的操作分别运用大内存块管理模型PMP和小内存块管理模型SMP进行管理,并分别采用双向链表和链表数组对空闲大内存块以及空闲小内存块进行管理,从而实现对应用系统内存使用的全面、系统的管理,既能消除内存碎片的产生,避免内存资源的浪费,又能实现快速、可靠地分配内存及释放。
图1示出了本发明的一个实施例提供的大内存块管理模型PMP的示意图:
在本实施例中,PMP除了采用双向链表FPL对空闲的大内存块进行管理外,还采用单链表SL管理从系统申请过来的大块内存M,每个从系统申请过来的大块内存的头部都将形成一个信息头SH,用于形成链表SL,在SH中存储有该大块内存在链表SL中的节点信息。
这些大块内存会因应用系统的内存请求而被分割成很多相对较小的内存块(但仍大于阀值),包括空闲的和使用中的,因此在SL管理的每个大块内存中,还采用单链表PL对这些分割形成的内存块进行管理,每个分割出的内存块的头部则形成8字节的信息头PH,其中4字节用于指示该内存块在PL中的前一个内存块的地址,1位标示该内存块的使用状态,还有31位用于标示该内存块的长度。对于空闲的内存块,紧随信息头PH后的8个字节则被用作构成双向链表FPL的前后指针。这8个字节在需要时是可以被改写的,而上述信息头SH以及PH对于应用系统则是不可见的,即不能在申请后被使用。
图2示出了本发明的一个实施例提供的小内存块管理模型SMP的示意图:
本实施例中,SMP采用链表数组A[N]来管理所有小于等于阀值的空闲的小内存块,数组的每个元素分别管理一个固定长度的小块空闲内存链表。这些固定的长度可以按一定字节对齐,例如假定固定长度按4字节对齐,则当阀值为256字节时,数组的长度为64,即N为63,数组元素A[0]、A[1]、A[2]、......、A[63]则分别管理固定长度为4字节、8字节、12字节、......、256字节的小空闲内存块构成的链表。数组的第一个元素管理的链表的固定长度与对齐字节相等。
当程序请求分配小内存块,而相应的数组元素链表又为空时,则可以从PMP中的链表FPL申请大块内存以满足请求,为此SMP采用单链表S_SL对从PMP申请过来的大内存块Q进行管理,同时将每个从PMP申请过来的大内存块中被分割形成的内存块,包括空闲的和使用中的,形成一个单链表S_PL。链表S_PL中的每个内存块的头部均形成有一个4字节的信息头S_PH,其中:1bit作为使用标志,15bits用于标明内存块长度,15bits用于指示前一内存块相对本块的偏移,以及1bit保留,所述内存块长度及前一内存块相对本块的偏移与链表数组的对其字节长度相关。由于标识长度的空间仅有15bits,故例如当对其字节为4字节时,则从PMP申请过来的大内存块的长度要小于128K(215×4)字节,此时阀值是大于4字节且小于128K字节的,又例如当对其字节为8字节时,则从PMP申请过来的大内存块的长度要小于256K(215×8)字节,此时阀值是大于8字节且小于256K字节。
此外,SMP还采用双向链表S_FPL对所有从PMP申请过来的大内存块中被分割形成的大空闲内存块进行管理,这些大空闲内存块的前8个字节则用于构成S_FPL的前后指针。
本发明实施例中,对于内存的分配以及释放等操作都是基于上述内存管理模型PMP和SMP进行。
图3示出了本发明实施例提供的无MMU平台的应用系统内存管理方法的流程,详述如下:
在步骤S301中,设置系统内存使用的阀值,建立内存管理模型PMP以及SMP,即建立上述各种链表,并进行初始化。
在步骤S302中,接收应用系统的内存操作指令及相关指令参数,所述内存操作指令包括系统请求分配内存的指令、释放内存的指令等,所述指令参数则包括系统请求分配内存的大小等参数。
在步骤S303中,当应用系统请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并返回结果给系统,释放系统使用完的内存块。
在步骤S304中,当应用系统请求分配的内存小于等于阀值时,则在SMP中查找匹配的内存块,并返回结果给系统,释放系统使用完的内存块。
上述步骤S303中对于大内存块的具体分配方法如图4所示,设程序请求分配的内存长度为len,阀值为K:
在步骤S401中,在双向链表FPL中查找匹配的空闲内存块FP。
在步骤S402中,判断是否找到匹配的空闲内存块,是则执行步骤S404,否则执行步骤S403。
在步骤S403中,从系统申请一长度为m_size的大块内存M,所述m_size的值为预设的常量。
在步骤S405中,判断是否申请成功,是则执行步骤S408,否则返回空内存块,执行步骤S409。
在步骤S408中,在M的头部形成信息头SH,将M加入链表SL,并紧随SH后形成一个内存块信息头PH_h,在PH_h中设置前向内存地址为空、使用标志为空闲、长度为(m_size-SH长度-2*PH长度),同时在尾部也形成一个内存块信息头PH_t,设置前向内存地址指向PH_h、使用标志为非空闲、长度为0。然后把这个长度为(m_size-SH长度-2*PH)的大空闲内存块加入到空闲内存双向链表FPL中,返回执行步骤S401,此时在FPL中一定能找到匹配的空闲内存块FP。
在步骤S404中,检测FP的长度,当FP的长度满足不等式:(FP的长度-len)>=(K+PH头信息长度),则需要对FP进行分割,则执行步骤S406;而当FP的长度满足(FP的长度-len)小于等于一定的冗余值,不需要对FP进行分割,则执行步骤S407。
在步骤S406中,设FP的信息头为PH_current,根据FP中的前后指针找到FPL中紧随FP后的一个空闲内存块,设该内存块的头信息为PH_next,从FP尾部截取长度为(len+PH的长度)的字节,形成一个新的空闲内存块FP2,设FP2的头部信息为PH_new,修改PH_new中的前向临近块指针为PH_current,长度为len,以及使用标志为空闲,同时修改PH_current的长度,以及修改PH_next的前向邻近块指针为PH_new,最后返回FP2,继续执行步骤S409。
在步骤S407中,直接将内存块FP从链表FPL上取下,即修改FP在FPL中的后空闲内存块的前向指针指向FP的前空闲内存块,以及修改FP的前空闲内存块的后向指针指向FP的后空闲内存块,返回FP2,执行步骤S409。
在步骤S409中,获得返回的内存块。
在步骤S410中,判断返回的内存块是否为空,是则执行步骤S412,否则执行步骤S411。
在步骤S411中,修改获得的内存块信息头中的使用标志为非空闲。
在步骤S412中,如果获得的内存块为空,则返回空值给应用系统,否则将内存块相对其头部的偏移返回给应用系统。
图5则示出了本发明的一个优选实施例提供的上述步骤S303中对于大于阀值的大内存块的释放方法的流程,在本实施例中设置有一标志位flag,用于标识内存块释放过程中,是否需要往双向链表上添加链表节点,该标志位在初始化时,被设置为需要添加的状态:
在步骤S501中,修改应用系统指向的需要释放的大内存块的指针,使其向前偏移内存块头部PH的长度,从而形成可操作的内存块结构体P1。
在步骤S502中,通过检测P1的长度是否大于阀值且小于从系统申请的最大内存的长度,以及P1在PMP中的链表PL上的后一内存块所指的前一内存块是否是P1等,来判断P1是否合法,是则执行步骤S503,否则结束释放,返回应用系统。
在步骤S503中,判断P1在PL上的前一内存块Pp是否处于空闲状态,是则执行步骤S504,否则执行步骤S505。
在步骤S504中,将P1与Pp合并,即修改Pp块头信息中的长度信息为合并后的内存块长度及使用标志为非空闲,以及修改P1在PL上的后一内存块Pn的前向邻近内存块指针,使其指向Pp,并删除合并前P1的块头信息,使其头部对于应用系统可见,释放指针P1则指向合并后的Pp,并且修改标志位flag为不需在双向链表上添加节点的状态。
在步骤S505中,判断Pn是否处于空闲状态,是则执行步骤S506,否则执行步骤S507。
在步骤S506中,将P1与Pn合并,即将Pn从FPL上取下,修改P1的长度信息以及Pn在PL上的后一块的前向邻近内存块指针,使其指向P1,并删除Pn的块头信息,使其头部对于应用系统可见。
在步骤S507中,通过检测标志位flag判断是否需要往FPL上添加链表节点,是则执行步骤S508,否则设置P1块头信息中的使用标志为空闲,完成释放,返回应用系统。
在步骤S508中,将P1添加到空闲内存双向链表FPL上,并设置P1块头信息中的使用标志为空闲,完成释放,返回应用系统。
而上述步骤S304中对于小于等于阀值的内存请求的具体分配方法则如图6所示,设程序请求分配的内存长度为len,阀值为K,以及数组元素链表间的对齐字节为ALIGN_BYTE:
在步骤S601中,根据len,利于关系式i=(len+ALIGN_BYTE-1)/ALIGN_BYTE-1,计算出数组下标,找到对应的数组元素A[i],从而找到A[i]管理的链表A[i].list。
在步骤S602中,检测链表A[i].list中是否有内存块,是则执行步骤S604,否则执行步骤S603。
在步骤S603中,从A[i].list中取出第一个元素D1,往前偏移头部字节,形成小内存块结构S1,返回S1,执行步骤S613。
在步骤S604中,检测小内存块管理模型SMP中的双向链表S_FPL是否为空,是则执行步骤S606,否则执行步骤S605。
在步骤S606中,向大内存块管理模型PMP中的双向链表FPL申请一块内存M2,申请的内存长度为预设的固定值。
在步骤S609中,判断此次申请是否成功,是则执行步骤S611,否则返回空内存块,执行步骤S613。
在步骤S611中,把申请到的大空闲内存块M2形成单链节点加入到SMP中的S_SL链表中,并在M2的前面形成一个4字节的信息头Sh,在M2尾部也形成一个4字节的头St,其中,Sh置值:15位的前向偏移=0,长度=(M2长度-S_SL链头长度-Sh长度-St长度),使用标志为空闲;St置值:15位的前向偏移=(Sh的长度值+Sh长度),长度=0,使用标志为非空闲,并且把Sh指明的这个大空闲内存块加入到空闲块双向链表S_FPL中,返回执行步骤S604。
在步骤S605中,找到S_FPL上的一个空闲块S_FP,检测S_FP的长度是否满足不等式:S_FP的长度-len>=ALIGN_BYTE+信息头S_PH的长度,如果满足,则需要对S_FP进行分割,则执行步骤S608,否则执行步骤S607。
在步骤S607中,从S_FPL上取下S_FP,往前偏移头部字节,形成一个小内存块结构S1,返回S1,执行步骤S613。
在步骤S608中,设内存块S_FP的块头信息为H_current,S_FPL中紧随S_FP的下一个内存块的块头信息为H_next,从S_FP的尾部分割出(len+信息头S_PH长度)的长度,形成一个满足需要的小内块S1,设S1的块头信息为H_new,修改H_current中的长度信息,并置值H_new中的长度为len,前向块偏移为(修改后的H_current中的长度值+H_current本身长度)以及使用标志为空闲,并修改H_next的前向偏移为(len+H_new的长度),继续执行步骤S610。
在步骤S610中,判断分割后的S_FP内存长度是否大于阀值K,是则返回S1,执行步骤S613,否则执行步骤S612。
在步骤S612中,将S_FP从S_FPL中取下来,并将S_FP加入到与之长度相应的数组元素的空闲内存块链表中,返回S1,继续执行步骤S613。
在步骤S613中,得到返回的内存块。
在步骤S614中,判断返回的内存块是否为空,是则执行步骤S615,否则执行步骤S616。
在步骤S616中,修改返回的内存块的头信息中的使用标志为非空闲。
在步骤S615中,当返回的内存块为空时,则返回空值给应用系统,否则返回内存块相对头部的偏移给应用系统。
图7则示出了本发明的一个优选实施例提供的上述步骤S304中对于小于等于阀值的小内存块的释放方法的流程图,本实施例中同样设置有标志位flag,并初始置值为需要往双向链表上添加节点的状态:
在步骤S701中,修改应用系统指向的需要释放的小内存块的指针,使其向前偏移内存块头部S_PH的长度,从而形成可操作的内存块结构体S1。
在步骤S702中,判断S1是否合法,是则执行步骤S703,否则结束释放,返回应用系统。
在步骤S703中,判断S1在SMP中的链表S_PL上的前一内存块Sp是否处于空闲状态,是则执行步骤S704,否则执行步骤S705。
在步骤S704中,找到Sp在SMP中对应的空闲链表,将S1与Sp合并,即当Sp的长度大于阀值时,则确定Sp是在SMP中的空闲双向链表S_FPL上,则修改Sp块头信息中的长度信息为合并后的内存块长度及使用标志为非空闲,以及修改S1在S_PL上的后一内存块Sn的前向邻近内存块指针,使其指向Sp,并删除S1的块头信息,使其头部对于应用系统可见,而释放指针S1则指向合并后的Sp,并修改标志位flag为不需要往双向链表上添加节点的状态;当Sp的长度小于等于阀值时,则根据Sp的长度找到其所在的数组元素链表,将Sp从该数组元素链表中删除,修改Sp的长度信息、使用标志以及Sn的前向邻近内存块指针,使其指向Sp,并删除S1的块头信息,使其头部对于应用系统可见,S1则指向合并后的Sp。
在步骤S705中,判断Sn是否处于空闲状态,是则执行步骤S706,否则执行步骤S707。
在步骤S706中,找到Sn在SMP中对应的空闲链表,将S1与Sn合并,即当Sn的长度大于阀值时,则Sn是在S_FPL上,则将Sn从S_FPL上取下,修改S1的长度信息以及Sn在S_PL上的后一块的前向邻近内存块指针,使其指向S1,并删除Sn的块头信息,使其头部对于应用系统可见;当Sn的长度小于等于阀值时,则根据Sn的长度找到其所在的数组元素链表,将Sn从该数组元素链表中删除,修改S1的长度信息以及Sn在S_PL上的后一块的前向邻近内存块指针,使其指向S1,并删除Sn的块头信息,使其头部对于应用系统可见。
在步骤S707中,判断合并后S1的长度是否大于阀值,是则执行步骤S708,否则执行步骤S709。
在步骤S708中,检测标志位flag的值,判断是否需要往双向链表上添加节点,如果需要则修改S1的使用标志为空闲状态,并将S1加入空闲双向链表S_FPL,完成释放,否则修改S1的使用标志,完成释放。
在步骤S709中,修改S1的使用标志为空闲状态,将S1加入到与S1的长度对应的数组元素链表中,完成释放。
基于内存管理模型PMP和SMP,本发明实施例提供的内存块管理方法还可以很方便地实现对内存使用情况的统计,以及对内存泄露和内存操作越界的检测与控制。
通过在大块内存管理模型PMP和小块内存管理模型SMP中加入统计信息,对系统对大块内存和小块内存的使用频率以及系统内存使用的峰值进行统计,并可以将统计结果进行反馈,依据该统计结果可以对阀值的大小进行调整。
为检测和控制内存泄露,在本发明实施例中,则可以通过在SMP中的每个数组元素中添加一个Debug信息链表,在PMP中则维护一个Debug信息链表,通过在每个分配给应用系统的内存块的块头信息中添加信息指针,指向Debug信息链表中的一个节点,Debug信息链表的节点由一个Debug信息结构体构成,所述Debug信息结构体包含对上述被分配的内存地址的使用的具体信息,比如申请到该地址的文件名、行号,以及对该地址的分配和释放操作的统计信息等,从而在应用程序退出时通过遍历每个Debug信息节点中分配和释放操作的统计结果是否相等,不仅可以快速地判断出内存是否出现泄露,还可以方便地查找到可能造成内存泄露的程序代码,并通过遍历PMP中所有的PL单链表以及SMP中所有的S_PL,可以找到所有可能泄露的内存。
为控制内存操作越界现象,则可以在紧邻每个内存信息块头前的内存空间中添加一个Magic字段,为该字段设置固定值,通过检测该值是否遭到破坏来检测内存是否出现越界,从而可以准确地发现导致内存越界的错误所在。
此外,在本发明实施例中,还可以通过采用互斥量实现对多线程的支持,即对于PMP和SMP分别建立一个互斥量进行保护,并对于SMP中的每个数组元素链表也分别建立一个互斥量,从而在提供线程安全的同时,尽量减少对操作频繁的小块内存的并发效率的影响。
图8示出了本发明实施例提供的适无MMU平台的应用系统内存管理系统的结构,为了便于说明,仅示出了与本发明实施例相关的部分。
本发明实施例提供的内存管理系统包括初始单元81、接口单元82、大块内存操作管理单元83和小块内存操作管理单元84,其中,初始单元81在系统初次运行时建立内存管理模型PMP和SMP,以及其它链表、互斥量等,并对链表、标志位、互斥量等进行初始化。接口单元82则是内存管理系统与应用系统间的指令及数据接口,接口单元82接收应用系统对内存的操作指令,包括请求和释放等,以及相关的指令参数,例如内存请求的大小等,接口单元82根据指令内容和参数通知相应的管理单元进行处理,并将处理结果返回给应用系统,比如当应用系统请求的内存或想要释放的内存大于阀值时,则接口单元82将请求的内存大小参数发送给大块分配模块831,或者将想要释放的内存地址参数发送给大块释放模块832,大块分配模块831或大块释放模块832在PMP中进行大块内存的分配或释放处理,其中,大块分配模块831还会将内存分配处理的结果返回给接口单元82;反之,当应用系统请求的内存或想要释放的内存小于等于阀值时,则接口单元82将请求的内存大小参数发送给小块分配模块841,或者将想要释放的内存地址参数发送给小块释放模块842,小块分配模块841或小块释放模块842在SMP中进行小块内存的分配或释放处理,小块分配模块841还会将内存分配处理的结果返回给接口单元82。
本发明实施例提供的内存管理系统还可以包括大块内存操作统计和检测单元85以及小块内存操作统计和检测单元86,其中大块内存操作统计和检测单元85包括大内存使用统计模块851以及大内存安全检测模块852,在应用系统的指令控制下,分别对大块内存操作管理单元83中内存的分配、释放等操作进行统计,以及对内存的泄露和操作越界等进行检测,并且可以将统计和检测的结果返回给接口单元82。小块内存操作统计和检测单元86则包括小内存使用统计模块861以及小内存安全检测模块862,分别对小块内存操作管理单元84中内存的分配、释放等操作进行统计,以及对内存的泄露和操作越界等进行检测,并可以将统计和检测的结果返回给接口单元82。
本发明实施例通过针对大于阀值的大内存块以及小于等于阀值的小内存块的操作分别运用大内存块管理模型PMP和小内存块管理模型SMP进行管理,从而实现对应用系统内存使用的全面、系统的管理,既能消除内存碎片的产生,避免内存资源的浪费,又能实现快速、可靠地分配内存及释放,而且还通过在内存管理模型中加入统计信息和检测链表等,很方便地实现对内存使用情况的统计,以及对内存泄露、操作越界等现象的检测和控制,还可以实现对多线程的支持。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (15)

1、一种无MMU平台的应用系统内存管理的方法,其特征在于,所述方法包括:
设置系统内存使用的阀值,对于大于阀值的大块内存建立内存管理模型PMP进行管理,对于小于等于阀值的小块内存建立内存管理模型SMP进行管理,所述内存管理模型PMP中建有双向链表FPL,管理PMP中所有大于阀值的空闲内存块,所述内存管理模型SMP中建有链表数组,管理SMP中所有小于等于阀值的空闲内存块;
接收系统请求分配内存的指令及参数,所述参数包括系统请求分配的内存长度;
当请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块;
或当请求分配的内存小于等于阀值时,则在SMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块。
2、如权利要求1所述的无MMU平台的应用系统内存管理方法,其特征在于,所述内存管理模型SMP中的链表数组中的每个数组元素管理一个由大小相同且固定的小空闲内存块构成的链表,且每个数组元素链表管理的内存大小按固定字节对齐。
3、如权利要求1所述的无MMU平台的应用系统内存管理方法,其特征在于,所述内存管理模型PMP中还包括用于管理从系统申请过来的大块内存的单链表SL,以及用于将每个从系统申请过来的大块内存中的各内存块链接起来的单链表PL。
4、如权利要求1所述的无MMU平台的应用系统内存管理方法,其特征在于,所述内存管理模型SMP中还包括用于管理从所述内存管理模型PMP中申请过来的大块内存的单链表S_SL,以及用于管理SMP中所有大于阀值的空闲大内存块的双向链表S_FPL,以及用于将每个从PMP中申请过来的大块内存中的各内存块链接起来的单链表S_PL。
5、如权利要求3所述的无MMU平台的应用系统内存管理方法,其特征在于,所述当请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并返回结果给系统包括下述步骤:
在FPL中查找匹配的空闲内存块;
当在FPL中没有找到匹配的空闲内存块,则从系统申请一大块内存;
当从系统成功申请一大块内存,则在该大块内存中分别形成用于构成链表SL的节点的信息头SH,以及用于构成链表PL的节点的信息头PH,所述信息头PH的长度为8字节,其中4字节指示前内存块地址、1位标示使用状态,以及31位标示本内存块长度,将该大块内存加入链表FPL和SL,并继续在FPL中查找匹配的空闲内存块,当从系统申请内存失败,则返回空内存块;
当在FPL中找到匹配的空闲内存块,且当该空闲内存块的长度与请求分配的内存长度之差大于等于阀值与信息头PH的长度之和,则在该空闲内存块的尾部进行分割,并返回分割后形成的新的空闲内存块,而当找到的空闲内存块的长度与请求分配的内存长度之差小于等于固定的冗余值,则将该空闲内存块从FPL中取下,并返回该内存块;
判断返回的内存块是否为空,是则返回空值给应用系统,否则将返回的内存块相对其头部的偏移返回给应用系统。
6、如权利要求3所述的无MMU平台的应用系统内存管理方法,其特征在于,在所述当请求分配的内存大于阀值时,则在PMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块的步骤中,对于大于阀值的大内存块的释放包括下述步骤:
形成能够进行释放操作的内存块结构体;
判断要释放的内存块是否合法,否,则直接结束释放;
当要释放的内存块合法时,判断其在所述链表PL中的前内存块是否空闲,是则进行合并;
判断其在所述链表PL中的后内存块是否空闲,是则进行合并;
判断是否要往所述双向链表FPL上添加节点,是则修改要释放的内存块的使用标志,并加入FPL,完成释放,否则修改要释放的内存块的使用标志即完成释放。
7、如权利要求4所述的无MMU平台的应用系统内存管理方法,其特征在于,所述当请求分配的内存小于等于阀值时,则在SMP中查找匹配的内存块,并返回结果给系统包括下述步骤:
根据请求分配的内存长度找到对应的数组元素链表,当该数组元素链表不为空,则在该数组元素链表上取出一内存块,并返回该内存块;
当对应的数组元素链表为空,则判断所述双向链表S_FPL是否为空;
当S_FPL为空,则从所述内存管理模型PMP申请一大块内存,当申请成功,则在该大块内存中形成用于构成链表S_PL的节点的信息头S_PH,所述信息头S_PH的长度为4字节,其中1bit标示使用状态,15bits标示本内存块长度,15bits指示前一内存块相对本块的偏移,还有1bit保留,将处理后的该大块内存加入链表S_SL和S_FPL,继续判断所述双向链表S_FPL是否为空,当申请不成功,则返回空内存块;
当S_FPL不为空,判断在S_FPL上找到的空闲内存块的长度与请求分配的内存长度之差是否大于等于第一个数组元素链表管理的内存长度与信息头S_PH的长度之和,是则在该空闲内存块的尾部进行分割,返回分割后形成的新的空闲内存块,并当分割后余下的内存长度大于阀值时,则将余下的内存块加入相应的数组元素链表,否则将在S_FPL上找到的空闲内存块从S_FP中取下,并返回该内存块;
判断返回的内存块是否为空,是则返回空值给应用系统,否则将返回的内存块相对其头部的偏移返回给应用系统。
8、如权利要求4所述的无MMU平台的应用系统内存管理方法,其特征在于,所述或当请求分配的内存小于等于阀值时,则在SMP中查找匹配的内存块,并返回结果给系统,释放系统使用完毕的内存块的步骤中,对于小于等于阀值的小内存块的释放包括下述步骤:
形成能够进行释放操作的内存块结构体;
判断要释放的内存块是否合法,否,则直接结束释放;
当要释放的内存块合法时,判断其在所述链表S_PL中的前内存块是否空闲,是则进行合并;
判断其在所述链表S_PL中的后内存块是否空闲,是则进行合并;
当此时要释放的内存块的长度小于等于阀值,则将其加入相应的数组元素链表;
当此时要释放的内存块的长度大于阀值,则判断是否需要往所述双向链表S_FPL上添加节点,是则修改要释放的内存块的使用标志,并加入S_FPL,完成释放,否则修改要释放的内存块的使用标志即完成释放。
9、一种无MMU平台的应用系统内存管理系统,其特征在于,所述系统包括:
初始单元,用于建立对大于阀值的大块内存的操作进行管理的内存管理模型PMP,以及建立对小于等于阀值的小块内存的操作进行管理的内存管理模型SMP,所述内存管理模型PMP中包含双向链表FPL,管理PMP中所有大于阀值的空闲内存块,所述内存管理模型SMP中包含链表数组,管理SMP中所有小于等于阀值的空闲内存块,以及对系统进行初始化;
接口单元,用于接收应用系统对内存的操作指令及参数,以及将指令的执行结果返回给应用系统,所述操作指令包括系统请求分配内存的指令,所述参数包括系统请求分配的内存大小;
大块内存操作管理单元,用于对应用系统请求分配或需要释放的内存大于阀值时,在所述内存管理模型PMP中实现内存的分配或释放;以及
小块内存操作管理单元,用于对应用系统请求分配或需要释放的内存小于等于阀值时,在所述内存管理模型SMP中实现内存的分配或释放。
10、如权利要求9所述的无MMU平台的应用系统内存管理系统,其特征在于,所述内存管理模型PMP中还包括用于管理从系统申请过来的大块内存的单链表SL,以及用于将每个从系统申请过来的大块内存中的各内存块链接起来的单链表PL。
11、如权利要求9所述的无MMU平台的应用系统内存管理系统,其特征在于,所述内存管理模型SMP中还包括用于管理从PMP中申请过来的大块内存的单链表S_SL,以及用于管理SMP中所有大于阀值的空闲大内存块的双向链表S_FPL,以及用于将每个从PMP中申请过来的大块内存中的各内存块链接起来的单链表S_PL。
12、如权利要求9所述的无MMU平台的应用系统内存管理系统,其特征在于,所述链表数组中的每个数组元素管理一个由大小相同且固定的小空闲内存块构成的链表,且每个数组元素链表管理的内存大小按固定字节对齐。
13、如权利要求10所述的无MMU平台的应用系统内存管理系统,其特征在于,所述大块内存操作管理单元包括:
大块分配模块,用于在所述内存管理模型PMP中的双向链表FPL上查找满足请求的空闲内存块,并返回查找结果;以及
大块释放模块,用于对系统使用完毕的大于阀值的内存块进行释放,以及将所需释放内存块与在所述内存管理模型PMP中的链表PL上的紧邻空闲内存块进行合并。
14、如权利要求11所述的无MMU平台的应用系统内存管理系统,其特征在于,所述小块内存操作管理单元包括:
小块分配模块,用于在所述内存管理模型SMP中的相应的数组元素链表或者双向链表S_FPL上查找满足请求的空闲内存块,并返回查找结果;以及
小块释放模块,用于对系统使用完毕的小于等于阀值的内存块进行释放,以及将所需释放内存块与在所述内存管理模型SMP中的链表S_PL上的紧邻空闲内存块进行合并。
15、如权利要求9所述的无MMU平台的应用系统内存管理系统,其特征在于,所述系统还包括:
大块内存操作统计和检测单元,用于对所述大块内存操作管理单元的内存分配及释放操作进行统计,并在所述内存管理模型PMP中对内存的泄漏即操作越界情况进行检测和控制;以及
小块内存操作统计和检测单元,用于对所述小块内存操作管理单元的内存分配及释放操作进行统计,并在所述内存管理模型SMP中对内存的泄漏即操作越界情况进行检测和控制。
CN2007101255328A 2007-12-27 2007-12-27 一种无mmu平台的应用系统内存管理的方法及系统 Expired - Fee Related CN101470665B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2007101255328A CN101470665B (zh) 2007-12-27 2007-12-27 一种无mmu平台的应用系统内存管理的方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2007101255328A CN101470665B (zh) 2007-12-27 2007-12-27 一种无mmu平台的应用系统内存管理的方法及系统

Publications (2)

Publication Number Publication Date
CN101470665A true CN101470665A (zh) 2009-07-01
CN101470665B CN101470665B (zh) 2011-05-11

Family

ID=40828146

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2007101255328A Expired - Fee Related CN101470665B (zh) 2007-12-27 2007-12-27 一种无mmu平台的应用系统内存管理的方法及系统

Country Status (1)

Country Link
CN (1) CN101470665B (zh)

Cited By (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102446139A (zh) * 2011-11-14 2012-05-09 奇智软件(北京)有限公司 一种数据存储方法及装置
CN102455976A (zh) * 2010-11-02 2012-05-16 上海宝信软件股份有限公司 一种中间件内存管理方案
CN102541654A (zh) * 2010-12-31 2012-07-04 新奥特(北京)视频技术有限公司 一种高效的内存管理方法和装置
CN102650959A (zh) * 2012-03-31 2012-08-29 华为技术有限公司 一种检测内存单元的方法及设备
CN103034484A (zh) * 2011-10-10 2013-04-10 微软公司 本机堆分配的运行时类型标识
WO2014183417A1 (zh) * 2013-05-17 2014-11-20 华为技术有限公司 管理内存的方法、装置和系统
CN104268190A (zh) * 2014-09-17 2015-01-07 腾讯科技(深圳)有限公司 公交线路搜索方法和装置
CN104598390A (zh) * 2011-11-14 2015-05-06 北京奇虎科技有限公司 一种数据存储方法及装置
CN104750637A (zh) * 2013-12-31 2015-07-01 国际商业机器公司 用于加速器的可扩展输入/输出数据机制
CN105975398A (zh) * 2015-12-07 2016-09-28 国家电网公司 一种内存碎片管理方法
WO2016187974A1 (zh) * 2015-05-25 2016-12-01 中兴通讯股份有限公司 一种存储空间管理方法及装置
CN106201717A (zh) * 2016-07-01 2016-12-07 珠海市魅族科技有限公司 一种管理系统内存的方法及终端
CN106873915A (zh) * 2017-02-22 2017-06-20 郑州云海信息技术有限公司 一种基于rdma注册内存块的数据传输方法和装置
CN108108307A (zh) * 2016-11-24 2018-06-01 中移(杭州)信息技术有限公司 一种资源处理方法及终端
CN108664411A (zh) * 2018-05-03 2018-10-16 晶晨半导体(上海)股份有限公司 一种内存链表及内存管理的优化方法
WO2019071721A1 (zh) * 2017-10-09 2019-04-18 深圳市沃特沃德股份有限公司 操作响应方法、装置和车载系统
CN109874027A (zh) * 2019-03-11 2019-06-11 宸瑞普惠(广州)科技有限公司 一种低延时手术示教直播方法及其系统
CN109993501A (zh) * 2019-03-20 2019-07-09 北京字节跳动网络技术有限公司 需求过程的管理方法、装置、存储介质及电子设备
CN110032529A (zh) * 2018-01-11 2019-07-19 武汉斗鱼网络科技有限公司 一种内存管理方法及相关装置
CN112395087A (zh) * 2020-11-10 2021-02-23 上海商米科技集团股份有限公司 一种无内存管理单元嵌入式设备的动态内存区及管理方法
CN113419858A (zh) * 2021-06-30 2021-09-21 明见(厦门)技术有限公司 一种动态内存分配方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1183453C (zh) * 2001-12-21 2005-01-05 上海贝尔有限公司 一种内存管理系统及其分配方法
KR100622114B1 (ko) * 2006-02-24 2006-09-18 주식회사 퓨전소프트 임베디드 시스템에서의 효율적인 동적 메모리 관리방법 및그 시스템

Cited By (34)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102455976B (zh) * 2010-11-02 2015-09-23 上海宝信软件股份有限公司 一种中间件内存管理的方法
CN102455976A (zh) * 2010-11-02 2012-05-16 上海宝信软件股份有限公司 一种中间件内存管理方案
CN102541654A (zh) * 2010-12-31 2012-07-04 新奥特(北京)视频技术有限公司 一种高效的内存管理方法和装置
CN103034484B (zh) * 2011-10-10 2016-01-20 微软技术许可有限责任公司 本机堆分配的运行时类型标识
CN103034484A (zh) * 2011-10-10 2013-04-10 微软公司 本机堆分配的运行时类型标识
CN104598390B (zh) * 2011-11-14 2019-06-04 北京奇虎科技有限公司 一种数据存储方法及装置
CN102446139A (zh) * 2011-11-14 2012-05-09 奇智软件(北京)有限公司 一种数据存储方法及装置
CN102446139B (zh) * 2011-11-14 2015-02-18 奇智软件(北京)有限公司 一种数据存储方法及装置
CN104598390A (zh) * 2011-11-14 2015-05-06 北京奇虎科技有限公司 一种数据存储方法及装置
CN102650959A (zh) * 2012-03-31 2012-08-29 华为技术有限公司 一种检测内存单元的方法及设备
US10235047B2 (en) 2013-05-17 2019-03-19 Huawei Technologies Co., Ltd. Memory management method, apparatus, and system
CN104166628A (zh) * 2013-05-17 2014-11-26 华为技术有限公司 管理内存的方法、装置和系统
WO2014183417A1 (zh) * 2013-05-17 2014-11-20 华为技术有限公司 管理内存的方法、装置和系统
US9940020B2 (en) 2013-05-17 2018-04-10 Huawei Technologies Co., Ltd. Memory management method, apparatus, and system
CN104750637B (zh) * 2013-12-31 2018-04-06 国际商业机器公司 用于加速器的可扩展输入/输出数据机制
CN104750637A (zh) * 2013-12-31 2015-07-01 国际商业机器公司 用于加速器的可扩展输入/输出数据机制
CN104268190A (zh) * 2014-09-17 2015-01-07 腾讯科技(深圳)有限公司 公交线路搜索方法和装置
CN106294190A (zh) * 2015-05-25 2017-01-04 中兴通讯股份有限公司 一种存储空间管理方法及装置
CN106294190B (zh) * 2015-05-25 2020-10-16 中兴通讯股份有限公司 一种存储空间管理方法及装置
WO2016187974A1 (zh) * 2015-05-25 2016-12-01 中兴通讯股份有限公司 一种存储空间管理方法及装置
CN105975398A (zh) * 2015-12-07 2016-09-28 国家电网公司 一种内存碎片管理方法
CN106201717A (zh) * 2016-07-01 2016-12-07 珠海市魅族科技有限公司 一种管理系统内存的方法及终端
CN108108307A (zh) * 2016-11-24 2018-06-01 中移(杭州)信息技术有限公司 一种资源处理方法及终端
CN106873915A (zh) * 2017-02-22 2017-06-20 郑州云海信息技术有限公司 一种基于rdma注册内存块的数据传输方法和装置
WO2019071721A1 (zh) * 2017-10-09 2019-04-18 深圳市沃特沃德股份有限公司 操作响应方法、装置和车载系统
CN110032529A (zh) * 2018-01-11 2019-07-19 武汉斗鱼网络科技有限公司 一种内存管理方法及相关装置
CN110032529B (zh) * 2018-01-11 2021-11-09 武汉斗鱼网络科技有限公司 一种内存管理方法及相关装置
CN108664411A (zh) * 2018-05-03 2018-10-16 晶晨半导体(上海)股份有限公司 一种内存链表及内存管理的优化方法
CN109874027A (zh) * 2019-03-11 2019-06-11 宸瑞普惠(广州)科技有限公司 一种低延时手术示教直播方法及其系统
CN109993501A (zh) * 2019-03-20 2019-07-09 北京字节跳动网络技术有限公司 需求过程的管理方法、装置、存储介质及电子设备
CN112395087A (zh) * 2020-11-10 2021-02-23 上海商米科技集团股份有限公司 一种无内存管理单元嵌入式设备的动态内存区及管理方法
CN112395087B (zh) * 2020-11-10 2022-11-15 上海商米科技集团股份有限公司 一种无内存管理单元嵌入式设备的动态内存区及管理方法
CN113419858A (zh) * 2021-06-30 2021-09-21 明见(厦门)技术有限公司 一种动态内存分配方法
CN113419858B (zh) * 2021-06-30 2024-02-13 明见(厦门)技术有限公司 一种动态内存分配方法

Also Published As

Publication number Publication date
CN101470665B (zh) 2011-05-11

Similar Documents

Publication Publication Date Title
CN101470665B (zh) 一种无mmu平台的应用系统内存管理的方法及系统
CN104375899B (zh) 高性能计算机numa感知的线程和内存资源优化方法与系统
CN102156675B (zh) 一种内存分配方法及装置
KR101677418B1 (ko) 분산형 스토리지 시스템에서 데이터 재구성의 우선순위화
CN100562860C (zh) 多处理器系统和向其提供高速缓存一致性的方法
KR102051282B1 (ko) 선택적 리소스 이동을 이용하는 네트워크 결합 메모리
US8280431B2 (en) Apparatus for end-user transparent utilization of computational, storage, and network capacity of mobile devices, and associated methods
CN103384877A (zh) 包括闪存的存储系统和存储控制方法
US20200192600A1 (en) Memory system and method for controlling nonvolatile
CN102455976B (zh) 一种中间件内存管理的方法
RU2681409C1 (ru) Система и способ синхронизации памяти в многоядерной системе
CN100461136C (zh) 多处理器系统中维持数据一致性的方法和系统
US20140032854A1 (en) Coherence Management Using a Coherent Domain Table
CN103164342A (zh) 数据可用性的挂载时协调
CN102339283A (zh) 集群文件系统访问控制方法及集群节点
US7171520B2 (en) Cache flush system and method thereof
CN102594858A (zh) 云存储环境中的镜像解决方案
CN102147743A (zh) 加快嵌入式系统应用程序启动速度的方法
CN105302737A (zh) 一种内存分配管理方法及系统
CN104731799A (zh) 内存数据库管理装置
CN104317734A (zh) 一种适用于slab的内存分配方法及装置
CN110688345A (zh) 一种内存文件系统的多粒度结构化空间管理机制
CN104850505A (zh) 基于链式堆叠的内存管理方法与系统
US5950231A (en) Memory manager system
CN109445943A (zh) 内核态系统中i/o栈的内存管理方法、系统及相关装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20110511