当前位置: 首页 > 专利查询>左应鹏专利>正文

基于链式堆叠的内存管理方法与系统技术方案

技术编号:11900938 阅读:105 留言:0更新日期:2015-08-19 12:57
本发明专利技术提供一种用于实时内核的内存管理方法,包括:为内存堆内每一块被分配的动态内存前面插入一个结构体形成一个动态内存块,以存储该动态内存块的信息;响应于上层应用的有效的内存申请分配动态内存时,尽可能在靠近内存堆堆头的位置分配新的动态内存,即向内存堆头部堆叠,形成动态内存块;将所有动态内存块的首地址都链接在一条单链表上,并且在该单链表中,所有元素以动态内存块的首地址的升序进行排列;以及响应于上层应用的有效的内存释放指针,执行内存回收操作,释放相应动态内存块的内存空间。本发明专利技术采用链式堆叠策略,使得已分配内存块向内存堆的头部“堆积”,从而减少内存碎片的产生,同时提高实时内核运行时动态内存的使用效率。

【技术实现步骤摘要】
基于链式堆叠的内存管理方法与系统
本专利技术涉及信息
,关于计算机系统的动态内存管理,尤其是用于嵌入式实时内核中的内存管理方法与系统,适于对由单片机作为主控,性能、资源相对有限的系统,例如以实时内核MadOS为基础的嵌入式系统的内存进行高效管理。
技术介绍
在嵌入式系统领域,uCOS-II与FreeRTOS是两个非常典型的实时内核,其中内存管理方法也很具代表性。1、uCOS-II中的内存管理uCOS-II在嵌入式系统领域一直以其稳定性著称,它曾经被用在美国的月球车之中。其高稳定性的一个重要原因在于,uCOS-II尽可能的避免使用动态内存,例如:uCOS-II中的每一个线程堆栈都是一个预定义好的数组。换句话说,uCOS-II尽可能将内存的分配放在程序的编译阶段,而非运行阶段。uCOS-II的内存管理的核心思想是:先在源代码里定义一块数据,当上层应用需要时,将这块数据区域分配给上层应用使用。具体而言,就是预先在代码里定义一个全局变量:unsignedcharbuffer[1024]。当有上层应用申请动态内存时,直接将buffer指针返回给上层应用。显然,这里只定义了一块内存是肯定不够用的,uCOS-II中将其定义为2维数组buffer[x][y],x是内存块的数量,y即每块内存的大小。假设y的值是64,那么当上层应用实际需要一块17字节的空间时,由于buffer是预先定义好的数组,不可能从内部拆分,所以,实际返回给应用的是一块64字节的内存,如此一来,在应用释放这块内存之前,这块内存中的64-17=47个字节就处于“无所事事”的状态,造成内存浪费。uCOS-II将上述方法做了改进:定义多个y值不同的buffer,应用根据自身的需要,选择最合适的尺寸进行申请。例如:假设预先定义了y值分别为32、64、128、256的4种buffer,当应用需要60字节时,就向y值为64的buffer申请,当应用需要70字节时,就向y值为128的buffer申请。这样的做法一定程度上缓解了内存浪费,但是并没有从根本上解决问题。uCOS-II内存管理的核心在于一个数据结构。uCOS-II把每一种y值对应的2维数组buffer称作一个分区(Partition),新建一个分区需要:1)定义一个全局2维数组buffer[x][y]。2)取得一个由内存管理模块定义的OS_MEM结构体,并对其初始化。将buffer下的每一个内存块链接在一起,如图1所示。一个分区(pa)初建立时,形成了一条以pa.OSMemFreeList为头部的单链表。当需要向pa分区申请动态内存时,实际上是将链表中的一个元素删除,并将这个元素返回给上层应用。当需要向pa分区释放动态内存时,实际是将欲释放的内存块插入到链表头部。可见,对于一种y值的buffer来说,使用者必须在源代码里定义好x值,也就是说,使用者必须对需要多少个内存块做出判断。然而,在一个系统中,动态内存的使用时机是不确定的,因此要得到x的值有两种做法:1)大量实验,根据实验的结果确定x的值。但在实际项目中,这种方法是不可行的,首先,需要考虑各种使用环境;再者,针对不同的项目,x的值需要重新进行测试。这种方法使得以往的工作成果变得不可重复利用,严重降低了工作效率。2)预设一个大值。在一个实际的嵌入式系统中,可能包含多个第三方模块,有的模块有自己的内存管理子模块,这些模块并不需要系统提供的内存管理方法。那么当x值设得很大时,就会出现一种情况:系统自身的内存管理模块占用了大量的内存,而利用率很低,其他第三方模块的内存管理子模块只占用很少的内存,而不够用。最终整个系统因为第三方模块无法正常运行而出现异常,甚至崩溃。y值的确定也存在着与x值类似的问题。而且,有些情况下,应用是没法知道自己在运行到某一时刻是需要多少动态内存的,例如,一些自定的通信协议,会先传输一个固定长度的头部,后面跟一个长度可变的数据载荷,这个数据载荷需要用动态内存临时存储,那么,应用编程人员必须在代码里,对申请哪个y值的动态内存进行判断,如果系统上存在多个通信接口,而通信协议都具有上述的特征,还需要考虑如何将对y值的判断方法抽象成一般规则,以便能应用到全部的接口上。2、FreeRTOS中的内存管理FreeRTOS是实时内核家族中的新成员,以开源的形式得到很多开发者的青睐。其中的内存管理方式与uCOS-II截然不同。FreeRTOS内存管理的核心思想是将整个内存堆空间看作一个整体,遵循需要多少,分配多少的原则进行内存管理。FreeRTOS中也有一个类似OS_MEM的数据结构。在使用动态内存之前需要调用初始化API,对内存堆进行初始化,如图2所示。1)初始化全局变量xStart、xEnd,这两个变量都是xBlockLink类型的,其作用是标识空闲内存链表的头与尾。2)在内存堆的首地址处插入一个xBlockLink结构体,使之与xStart、xEnd一起组成最初的空闲内存链表:经过初始化后的全局变量xStart、xEnd及内存堆的状态如图3所示。当申请动态内存时,扫描以xStart为头,xEnd为尾的空闲内存块链表list,找出一块xBlockSize大于需求尺寸wantSize的内存块,然后:1)将该块空闲内存从list中删除,并记录表下该块内存的首地址ptr。2)在ptr+sizeof(xBlockLink)+wantSize的内存处放置一个xBlockLink结构体,形成一个新的空闲块:新尺寸=原尺寸-wantSize。3)将新形成的空闲块插入到list中。4)将指针(ptr+sizeof(xBlockLink))返回给上层应用。当释放动态内存时,将上层传入的指针减去sizeof(xBlockLink)就得到该块内存的xBlockLink结构体指针,然后将该块内存插入到list链表中,即完成回收。FreeRTOS的这种回收机制必须考虑一个重要的问题:内存块回收之后,如果存在几个连续的内存块,如何将他们合并?实际上,FreeRTOS并没有考虑内存合并的问题,那么,随着系统运行时间的推移,将会产生大量的内存碎片,最终,当需要某一大尺寸的内存块时,空闲内存的总量是足够的,但都是非常小的碎片,导致内存分配失败,进而引起系统功能混乱、甚至崩溃。FreeRTOS在管理内存时,会将list中的内存块按由小到大的顺序排列,以便再分配时,尽可能分配一块小内存给应用,这样就提升了内存使用效率。但是,由于不对内存块进行合并,这样的思路会导致一个问题,由于小内存不断细化,空闲链表list的前面会存在大量的小块,而这些小块随着自己越来越小,被利用的概率会越来越低,那么,当查找一块较大的空闲内存时,将会有大量的CPU时间浪费在扫描那些细化的小块上。另外,释放内存时uCOS-II与FreeRTOS都没有考虑传入一个错误指针,即并非指向有效动态内存块的指针时应该如何处理,如果不做处理,而对该无效内存块执行释放操作,必然导致系统崩溃。
技术实现思路
本专利技术目的在于提供一种用于实时内核的内存管理方法,采用链式堆叠,使得已分配内存块向内存堆的头部“堆积”,从而减少内存碎片的产生,同时提高实时内核运行时动态内存的使用效率。本专利技术的上述目的通过独立权利要求的技术特征实现本文档来自技高网
...
基于链式堆叠的内存管理方法与系统

【技术保护点】
一种用于实时内核的内存管理方法,其特征在于,包括:为内存堆内每一块被分配的动态内存前面插入一个结构体(head)形成一个动态内存块,使得每个动态内存块包括该结构体和数据内存区;每个动态内存块的首地址都链接在一条单链表上,其中所述的结构体包括动态内存块的整体尺寸(size)与指向单链表中下一个元素的指针(next);在前述单链表中,所有元素以动态内存块的首地址的升序进行排列;响应于上层应用的有效的内存申请分配动态内存时,尽可能在靠近内存堆堆头的位置分配新的动态内存,即向内存堆头部堆叠,以形成动态内存块;响应于上层应用的有效的内存释放指针,执行内存回收操作,释放相应动态内存块的内存空间。

【技术特征摘要】
1.一种用于实时内核的内存管理方法,其特征在于,包括:为内存堆内每一块被分配的动态内存前面插入一个结构体形成一个动态内存块,使得每个动态内存块包括该结构体和数据内存区;每个动态内存块的首地址都链接在一条单链表上,其中所述的结构体包括动态内存块的整体尺寸size与指向单链表中下一个元素的指针next;在前述单链表中,所有元素以动态内存块的首地址的升序进行排列;响应于上层应用的有效的内存申请分配动态内存时,尽可能在靠近内存堆堆头的位置分配新的动态内存,即向内存堆头部堆叠,以形成动态内存块;响应于上层应用的有效的内存释放指针,执行内存回收操作,释放相应动态内存块的内存空间。2.根据权利要求1所述的用于实时内核的内存管理方法,其特征在于,前述方法更加包含:执行内存回收后,连续的空闲内存空间自动合并。3.根据权利要求1或2所述的用于实时内核的内存管理方法,其特征在于,前述方法更加包含:执行内存回收操作后,将被释放的内存空间与其前、后的连续空闲空间自动合并。4.根据权利要求1所述的用于实时内核的内存管理方法,其特征在于,前述方法更加包含:在接收到上层应用的有效的内存申请时,判断申请的内存是否超过当前时刻整个内存堆的总空闲内存量,并响应于申请的内存未超过当前时刻整个内存堆的总空闲内存量而分配动态内存,否则返回错误信息给上层应用。5.根据权利要求1所述的用于实时内核的内存管理方法,其特征在于,前述方法更加包含:判断上层应用传入的指针是否合法,即决定上层应用传入指针是否是有效的内存释放指针,包括以下过程:将上层应用传入的指针依次与所述单链表中的元素做比较,如果单链表中不存与之匹配的元素,则决定上层应用传入的指针并非与一个有效的动态内存块匹配,即上层应用传入的是非法指针;否则,决定上层传入的就是有效指针。6.根据权利要求1所述的用于实时内核的内存管理方法,其特征在于,前述方法更加包含:在分配动态内存时,如果整个内存堆的内存空间不连续,则依次扫描每块连续的空闲空间,并且响应于某一空闲空间的尺寸满足申请的内存空间,则在该空闲空间内分配新的动态内存,插入结构体形成一个动态内存块,并将动态内存块的首地址都链接到前述的单链表上。7.根据前述权利要求1-2、4-6中任意一项所述的用于实时内核的内存管理方法,其特征在于,前述方法更加包含:将根据新分配的动态内存块的首地址计算得到的对应用户数据区域的首地址返回给上层应用:用户数据区域首地址=动态内存块首地址+结构体的尺寸。8.一种用于实时内核的内存管理系统,其特征在于...

【专利技术属性】
技术研发人员:左应鹏
申请(专利权)人:左应鹏
类型:发明
国别省市:江苏;32

相关技术
    暂无相关专利
网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1