首页> 中国专利> 一种无MMU平台的应用系统内存管理的方法及系统

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

摘要

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

著录项

  • 公开/公告号CN101470665A

    专利类型发明专利

  • 公开/公告日2009-07-01

    原文格式PDF

  • 申请/专利权人 TCL集团股份有限公司;

    申请/专利号CN200710125532.8

  • 发明设计人 罗寿中;

    申请日2007-12-27

  • 分类号G06F12/06(20060101);G06F17/30(20060101);

  • 代理机构44237 深圳中一专利商标事务所;

  • 代理人张全文

  • 地址 516001 广东省惠州市鹅岭南路6号TCL工业大厦

  • 入库时间 2023-12-17 22:10:28

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2011-05-11

    授权

    授权

  • 2009-08-26

    实质审查的生效

    实质审查的生效

  • 2009-07-01

    公开

    公开

说明书

技术领域

本发明属于内存管理领域,尤其涉及一种无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进行管理,从而实现对应用系统内存使用的全面、系统的管理,既能消除内存碎片的产生,避免内存资源的浪费,又能实现快速、可靠地分配内存及释放,而且还通过在内存管理模型中加入统计信息和检测链表等,很方便地实现对内存使用情况的统计,以及对内存泄露、操作越界等现象的检测和控制,还可以实现对多线程的支持。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号