专利名称::嵌入式系统内存管理的方法
技术领域:
:本发明涉及嵌入式系统
技术领域:
,尤其涉及一种嵌入式系统内存管理的方法。
背景技术:
:嵌入式操作系统的内存管理,需要满足实时性和高效性的要求。从实时性的角度出发,要求内存分配过程尽可能快,在嵌入式系统中一般没有段页式的虚存管理机制,因此,不可能采用通用操作系统的一些复杂而完善的内存分配策略,而是采用简单、快速的内存分配方案。高效性是指内存分配要尽可能减少浪费,一方面,嵌入式系统对成本的要求使得内存是一种很有限的资源,另一方面,系统硬件环境有限的空间和有限的板卡面积也决定了可配置的内存容积是^艮有限的。嵌入式系统中最基本的内存管理机制有两种,静态分配和动态分配。静态分配是指在编译或链接时将程序所需的内存空间分配好,采用这种分配方案的程序l殳,其大小一般在编译时就能确定,实时性好。而动态分配是指系统运行时根据需要动态地分配内存,可有效减少浪费。其中,固定分区法是一种比较常用的动态分配方法,它是将内存固定划分为若干个大小不等的区域,分区一旦划分结束,在整个执行过程中每个分区的长度和内存的总分区个数将保持不变。固定分区法具有较高的实时性,实现比寿支简单,但是高效性不强。在固定分区法的^5出上,出现了一种基于内存池的固定分区法。内存池是一段连续的内存区域,每个内存池可以且仅可以分配8种尺寸的内存块,从小到大分别为SIZE0-SIZE7。一开始创建的内存池,是一块连续区域,未进行任何划分,在系统运行过程中,根据需求不断从连续区域分割出内存块。内存块被释放后不进行相邻内存块的聚合,而是直接挂接在一个链表中,此链表被称为自由链。参见图1,为基于内存池的固定分区法的示意图。基于内存池的固定分区法是基于"一次分配、多次使用"策略,改进了固定分区法,分配时首先查看自由链是否有对应SIZE的内存块,若有直接从自由链上摘除,若自由链没有合适的内存块,才从空闲区分配,为了减少分配失败概率,在空闲区无法分配时,允许使用自由链上尺寸大的自由内存块。这种方法减少了空闲区分配内存块的次数,既节省了时间,又减緩了内存区分割的速度,类似于动态分配,只不过是可用于动态分配的内存在不断缩小。然而,基于内存池的固定分区法,在使用过程中对内存进行了不可逆分割,当空闲区耗尽后,各个尺寸内存块的个数不能动态改变,从而限制了系统对各种内存块并发使用的数目,当内存块统计特性改变时将导致内存分配失败。例如,开始阶段系统使用了很多小尺寸的内存块,释放后挂到自由链上,某个时刻需要分配尺寸较大的内存块时,却无法从自由链上找到合适的内存块,导致分配失败。另外,若开始阶^a将内存分割成N块SIZE7大小的内存块,空闲区可能仅剩一点内存,接下来某个时刻,需要分配N+1或更多的SIZE3的内存块,因为系统中没有SIZE3大小的内存块,空闲区也不足够,只能使用SIZE7内存块来顶替一个小块使用,造成浪费,而且也只能分配N块,无法满足分配N+1或更多小尺寸内存块的需求。现有公开的涉及嵌入式系统内存管理的专利文献中,都没有提及基于内存池的固定分区法的缺陷及改进方案,例如,申请号200310110344,X、名为"一种嵌入式系统内存管理的方法",主要是通过对不同尺寸内存块不同处理来解决内存不能被充分利用的问题;而申请号200410041459.2、名为"一种嵌入式实时操作系统中内存分配的方法,,,可以动态调整分配策略,保i正高优先级任务的实时性。
发明内容有鉴于此,本发明在基于内存池的固定分区法的基础上,提供一种嵌入式系统内存管理方法,以解决现有方案在内存块统计特性改变时分配失败的问题。为此,本发明实施例采用如下技术方案5一种嵌入式系统内存管理的方法,包括以下步骤遍历内存池,查找地址连续且均处于空闲状态的内存块;合并所述地址连续的空闲内存块,形成回收区;接收到内存分配请求后,从所述回收区分配内存。其中,预置时间间隔,定期对地址连续的空闲内存块进行合并。优选地,当无法从自由链和内存池的空闲区分配尺寸合适的内存块时,才对地址连续的空闲内存块进4亍合并。上述方法还包括判断内存池所有内存块是否都空闲;若内存池所有内存块均空闲,对地址连续的空闲内存块进行合并是指对内存池进行格式化。进一步,在确定无法从自由链和内存池的空闲区分配尺寸合适的内存块之后,还包括判断自由链上是否存在比所述请求对应内存块的尺寸更大的大尺寸内存块;若有大尺寸内存块,则首先利用所述大尺寸内存块分配内存,然后执行所述对地址连续的空闲内存块进行合并,若没有大尺寸内存块,执行所述从回收区分配内存,并重新对地址连续的空闲内存块进行合并。上述方法还包括建立备份池,所述备份池包含系统预置的各种尺寸的内存块;当无法从回收区分配内存时,/人所述备4分池分配内存。其中,所述回收区为多个;其中,是选择最大回收区进行内存分配的。上述方法还包括合并所述回收区与相邻空闲内存块,形成更大的回收区。其中,所述内存块包括由状态位、地址以及长度构成的内存头。通过所述内存头的状态位确定内存块是否空闲;通过所述内存头的地址和长度,确定地址连续的内存块。对于上述技术方案的技术效果分析如下本发明对地址连续的内存块进行融合形成回收区,当原空闲区不充足时,回收区可被作为空闲区的有效扩充,提高分配成功的概率。当内存块统计特性发生改变时,由充足的回收区来满足内存分配的新要求。而且,优选地,仅当通过空闲区和自由链上无法分配内存时才启动后台整理,有利于保证内存分配的实时性,可保证在大部分情况不启动内存整理,减少CPU开销。而且,在所有内存块均空闲时,可以直接格式化内存池,从而简化流程,实现快速内存整理。另外,利用备份池进行内存分配,进一步提高分配成功率。图1为现有技术基于内存池的固定分区法示意图2为本发明实施例一示意图3为本发明实施例二内存分配流程图4为本发明实施例二后台整理流程图5为本发明实施例二回收链示意图。具体实施例方式正如前面对现有技术的分析,当内存池的空闲区不足以分配内存块时,会出现分配失败的问题。究其原因,是现有方案对内存块的不可逆分割导致的。因此,本发明从此问题出发,提出一种可逆的分割方法,能够有效解决内存块统计特性改变时分配失败的问题。下面结合附图,对发明的实施例作详细介绍。首先介绍本发明实施例一本发明对地址连续的内存块进行融合,形成的回收区可以作为内存池的空闲区重新被分割。也就是说,回收区可被作为空闲区的有效扩充,提高分配成功的概率。当内存块统计特性发生改变时,由充足的回收区来满足内存分配的新要求。实施例一包括以下步骤1、遍历内存池,将地址连续的空闲内存块融合为回收区;2、接收到分配内存请求后,从回收区分配内存。本发明中,每个被分割的各SIZE内存块都有表明一些状态信息的内存头结构,内存头结构包括用于标识该内存块是正在使用或是空闲的状态位,而且还包括该内存块起始地址,以及表明该内存块长度的信息。参见表l,为内存头结构示例。表1<table>tableseeoriginaldocumentpage8</column></row><table>那么,就可以通过状态位来确定内存块是否空闲,通过起始地址以及长度来确定下一个内存块。参见图2,为实施例一示意图。其中,内存池已分配了编号A-J共10个内存块,通过各内存块的内存头,可以明确编号相邻的内存块地址连续。除了被分配的内存块,内存池仅剩余有限的空闲区(或者没有空闲区)。假设某时刻,内存块B、D、E、F、H和I处于空闲状态,也就是说上述空闲的B、D、E、F、H和I内存块被挂接自由链上。那么,依据本实施例,可以将连续的空闲内存块融合,作为新的空闲区等待分配。处于空闲状态的内存块中,D、E和F是地址连续的,H和I也是连续的,那么,就可以分別融合为两部分回收区,分别是D-E-F和H-I。当有新的分配内存请求时,可以选择从D-E-F或H-I回收区进行内存分配。应用本实施例,可以利用回收区对空闲区作有效扩充,当出现空闲区不充足时,可以在回收区上进行内存分配,降低不能分配的概率。当然,也可以直接选择回收区进行内存分配。例如,春£设系统要分割SIZE6的内存块,而内存池原空闲区不足以分配SIZE6的内存块,此时,4艮设内存块D、E和F分别为SIZE4、SIZE3和SIZE0的内存块,那么融合后的D-E-F回收区足以满足分配SIZE6内存块的需求。需要说明的是,本实施例提供的"遍历内存池、从而融合连续空闲内存块为回收区,,的过程(下文将这一过程称为"后台整理"),是可以在操作系统后台运行的,不影响正常的内存分配。何时启动后台整理,可以有多种策略。例如,为了保证内存分配的成功概率,可设置定期启动后台整理。或者,为了尽可能给内存分配带来少的影响,满足内存分配实时性的要求,可以在无法从自由链和空闲区分配内存时启动一次内存整理。在具体实施时,可根据系统要求灵活设置。下面介绍本发明实施例二正如上面描述,可以在无法从自由链和空闲区分配内存块时,再启动后台整理,这对于满足内存分配的实时性有一定的保证,本实施例重点对这种方式进一步阐述。参见图3,为实施例二内存分配流程图。包括步骤30k接收到分配某尺寸内存块的请求;例如,请求分配SIZE6的内存块;步骤302:查找自由链,是否有尺寸合适(SIZE6)的空闲内存块?若有,执行步骤303,否则,执行步骤304;步骤303:利用尺寸合适的空闲内存块分配内存;步骤304:内存池空闲区是否足够分配该尺寸内存块?若是,执行步骤305,否则,执行步骤306;步骤305:从内存池的空闲区分配内存块;步骤306:自由链上是否有比所述请求对应内存块的尺寸(SIZE6)更大的大尺寸的空闲内存块?例如SIZE7内存块。若有,执行步骤307,否则,执行步骤308;上述步骤306,可保证当前分配请求得到满足,但是此时已说明自由链上没有合适的内存块,并且空闲区也不足以分配内存,所以,在利用大尺寸内存块分配内存之后,应该要启动内存整理,形成回收区避免后续由于空闲区不足或自由链尺寸不合适而导致分配失败。步骤307:利用大尺寸空闲内存块分配内存,然后执行步骤311启动后台整理;步骤308:查看回收链是否可以利用回收区分配内存?若是,执行步骤309,否则,执行步骤310;所谓回收链,是由多个回收区按一定顺序挂接而成的链表,后文会详细介绍。步骤309:利用回收区分配内存,然后执行步骤311启动后台整理;步骤310:分配失败,然后执行步骤311启动后台整理;步骤311:启动后台整理。实际上,后台整理是对空闲内存块进行重新融合并分割。那么,存在两种情况,一种就是当前内存池所有内存都空闲(已分配的内存块均处于空闲状态),此时,可以不必逐块合并而是直接对内存池进行格式化,也就是将内存池恢复成创建初的状态;另一种就是当前内存池有一部分内存被占用,那么,就按照实施例一所叙述的,遍历自由链从而融合地址连续的空闲内存块。可以理解的是,对于第一种格式化内存池的方式,可以作为第二种方式的一个特例。因此,在启动后台整理后,在后台整理过程中,可先判断内存池是否所有内存均空闲,若是,可直接对内存池进行格式化,否则,再逐块融合地址连续的空闲内存块。参见图4,为后台整理流程图。包括步骤401:在启动后台整理任务后,获取内存区头指针;步骤402:判断当前内存块是否空闲(也即是否属于自由链)?若是,执行步骤403,否则,执行步骤405;步骤403:判断下一个内存块是否空闲?若是,重复执行步骤403,否则执行步骤404;步骤404:将连续空闲内存块合并成的回收区挂接到回收链上;步骤405:是否到达内存池尾?若是,结束,否则,执行步骤406;步骤406:跳过被占用(未释放)的内存块,返回执行步骤402,对下一区段的连续空闲内存块继续整理。回收链是一个动态双向链表,回收区可以按照从大到小排列。回收链上挂接的回收区,是经过融合后形成的大内存块,当内存池空闲区无法分配内存时,系统从回收链上摘除最大回收区,作为新的内存分配区,这样可以尽可能分配成功,当然也可以在回收链上任意的回收区上分配。参见图5,为回收链示意图,其中,回收区大小顺序为回收区4、回收区3、回收区1、回收区0和回收区2,将他们按照大小顺序挂接,形成回收链。当需要从回收区分配内存时,可以在回收区4上进行分配。在合并新的回收区时,回收链上的回收区也与自由链上的空闲内存块一样,需要与它相邻的内存块合并为更大的回收区。在实施例二中,仅当通过空闲区和自由链上无法分配内存时才启动后台整理,有利于保证内存分配的实时性,可保证在大部分情况不启动内存整理,减少CPU开销,而一旦出现利用空闲区和自由链无法分配内存时,又可通过.回收区提高分配的成功率。而且,在所有内存块均空闲时,可以直接格式化内存池,从而筒化流程,实现快速整理。最后,介绍本发明实施例三为了进一步保证内存分配的成功率,本实施例提出了^f分池的方案。本领域技术人员都了解,嵌入式实时操作系统一般规划多个内存池,那么,就可以设置其中之一作为其余内存池的备份池,在其余内存池正常分配过程中不对备份池进行分配,仅在某内存池无法满足分配请求时,才利用备份池进行内存分配。备份池可以预先分配系统预置的各种尺寸的内存块,正如
背景技术:
中的描述,预先分割SIZE0-SIZE7的内存块。再请参见图3,当无法从空闲区、自由链以及回收区分配内存时,会导致步骤310的分配失败。因此,可以在步骤308确定不可以利用回收区分配内存时,利用备份池进行内存分配,从而进一步提高分配成功率。在利用备份池分配后,也需要启动内存管理。需要说明的是,备份池往往需要为多个内存池提供备份,因此,应尽量少占用备^f分池资源,并且在占用后应尽快释^:。以上所述仅是本发明的优选实施方式,应当指出,对于本
技术领域:
的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。权利要求1、一种嵌入式系统内存管理的方法,其特征在于,包括:遍历内存池,查找地址连续且均处于空闲状态的内存块;合并所述地址连续的空闲内存块,形成回收区;接收到内存分配请求后,从所述回收区分配内存。2、根据权利要求l所述方法,其特征在于,预置时间间隔,定期对地址连续的空闲内存块进行合并。3、根据权利要求l所述方法,其特征在于,当无法从自由链和内存池的空闲区分配尺寸合适的内存块时,才对地址连续的空闲内存块进4亍合并。4、根据权利要求3所述方法,其特征在于,还包括判断内存池所有内存块是否都空闲;若内存池所有内存块均空闲,对地址连续的空闲内存块进行合并是指对内存池进行格式化。5、根据权利要求4所述方法,其特征在于,在确定无法从自由链和内存池的空闲区分配尺寸合适的内存块之后,还包括判断自由链上是否存在比所述请求对应内存块的尺寸更大的大尺寸内存块;若有大尺寸内存块,则首先利用所述大尺寸内存块分配内存,然后执行所述对地址连续的空闲内存块进行合并,若没有大尺寸内存块,执行所述从回收区分配内存,并重新对地址连续的空闲内存块进行合并。6、根据权利1至5中任一项所述方法,其特征在于,还包括建立备份池,所述备份池包含系统预置的各种尺寸的内存块;当无法从回收区分配内存时,从所述备份池分配内存。7、根据权利要求6所述方法,其特征在于,所述回收区为多个;其中,是选择最大回收区进行内存分配的。8、根据权利要求7所述方法,其特征在于,还包括合并所述回收区与相邻空闲内存块,形成更大的回收区。9、根据权利要求6所述方法,其特征在于,所述内存块包括由状态位、地址以及长度构成的内存头。10、根据权利要求9所述方法,其特征在于,通过所述内存头的状态位确定内存块是否空闲;通过所述内存头的地址和长度,确定地址连续的内存块。全文摘要本发明公开了一种嵌入式系统内存管理的方法,包括以下步骤遍历内存池,查找地址连续且均处于空闲状态的内存块;合并地址连续的空闲内存块,形成回收区;接收到内存分配请求后,从所述回收区分配内存。本发明整理的回收区对空闲区进行了有效扩充,提高了内存分配成功的概率。文档编号G06F12/06GK101382916SQ200710121449公开日2009年3月11日申请日期2007年9月6日优先权日2007年9月6日发明者郭继燕,郭长旺申请人:大唐移动通信设备有限公司