一种嵌入式操作系统的内存池分配方法

阅读: 评论:0

著录项
  • CN200610089365.1
  • 20060621
  • CN101093455
  • 20071226
  • 中兴通讯股份有限公司
  • 王;徐立峰;曹刚
  • G06F9/50(2006.01)I
  • G06F9/50(2006.01)I

  • 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦A座6层
  • 中国,CN,广东(44)
  • 北京律诚同业知识产权代理有限公司
  • 梁挥;徐金国
摘要
本发明公开了一种嵌入式操作系统的内存池分配方法,包括:步骤一,根据用户可能使用到的各种内存块的大小和数量以及对应的内存头的大小,在内存资源中分配一个由所述内存块和内存头构成的内存池;步骤二,对所述内存池进行初始化,确定各种大小的内存块的起始地址;步骤三,对于内存申请,如果满足该内存申请的最小的单一内存块存在超过阀值的浪费,则通过组合不同大小的多个内存块来满足该内存申请。本发明可以很大程度的减小和缓解通用内存池管理中存在的内存资源浪费的问题,同时,也保持了通用内存池管理的高效性和可靠性。
权利要求

1、一种嵌入式操作系统的内存池分配方法,其特征在于,包括如下步 骤:

步骤一,根据用户可能使用到的各种内存块的大小和数量以及对应的内 存头的大小,在内存资源中分配一个由所述内存块和内存头构成的内存池;

步骤二,对所述内存池进行初始化,确定各种大小的内存块的起始地址;

步骤三,对于内存申请,如果满足该内存申请的最小的单一内存块存在 超过阀值的浪费,则通过组合不同大小的多个内存块来满足该内存申请。

2、根据权利要求1所述的方法,其特征在于,所述步骤二中,确定所 述起始地址采用如下规则:一个最大的内存块的结束地址是一个次大的内存 块的起始地址,依次类推,最后是一个最小的内存块的结束地址,从而内存 块按从大到小的次序构成一个循环;一个循环结束,再重复下一个循环的配 置,同时,在内存头中记录各内存块的起止地址和是否空闲的信息。

3、根据权利要求2所述的方法,其特征在于,在所述步骤三中,所述 存在超过阀值的浪费为:所述单一内存块与紧跟所述单一内存块的次大内存 块的平均值大于所述内存申请。

4、根据权利要求3所述的方法,其特征在于,在所述步骤三中,通过 组合紧跟在所述单一内存块之后的两个内存块来分配给所述内存申请。

5、根据权利要求4所述的方法,其特征在于,所述步骤三进一步包括:

步骤A,判断所述内存申请是否小于所述单一内存块与所述次大内存块 的平均值,是则执行步骤B,否则执行步骤D;

步骤B,判断紧跟在所述单一内存块之后的两个内存块之和是否大于所 述内存申请,是则执行步骤C,否则执行步骤D;

步骤C,把所述两个内存块分配给所述内存申请,内存分配结束;

步骤D,直接把所述单一内存块分配给所述内存申请,内存分配结束。

8、根据权利要求2所述的方法,其特征在于,还包括:所述内存块按 照内存地址的递增构成一个单向链表一,所有相同大小的未被分配的空闲内 存块又构成一个单向链表二,并在内存块的内存头中的相应位置标明该内存 块在所述链表一和链表二中的顺序号。

9、根据权利要求8所述的方法,其特征在于,还包括:在所述内存池 的管理结构中记录内存块大小、数量以及有无后继的内存池的索引,在内存 头中记录对应内存块的起始地址、占用标志以及有无比其大小还小的后继内 存块标志。

6、根据权利要求1所述的方法,其特征在于,还包括步骤四,在所述 内存申请的应用结束后,对所述内存申请的内存块进行释放。

7、根据权利要求6所述的方法,其特征在于,在所述步骤四中,如果 被释放的内存为多个内存块的组合,则拆开所述组合的所述多个内存块,进 行各内存块的单独释放。

说明书
技术领域

技术领域

本发明涉及嵌入式实时操作系统领域,特别是涉及在嵌入式系统中,使 用事先分配的内存池对应用申请的大小不确定的内存进行管理的实现方法。

背景技术

随着嵌入式实时系统在各个领域的广泛应用,嵌入式软件的开发也受到 越来越多的瞩目。在满足系统实时性要求的前提下,如何提高内存分配的快 速性、可靠性、高效性,是嵌入式软件系统需要重点研究的一个课题。内存 分配的快速性从嵌入式系统对实时性的要求出发,要求内存在分配过程中尽 可能的快,因此在嵌入式系统中,不可能采用通用操作系统中复杂而繁琐的 内存分配策略,一般都采用简单、快速的内存分配方案;内存分配的可靠性 则要求内存分配的请求必须得到满足,如果分配失败的话可能会带来灾难性 的后果;而内存分配的高效性,则要求内存分配尽可能地少浪费。

目前,在嵌入式软件开发中,特别是在诸如电信、信息家电这些行业, 由于对内存的申请和释放比较频繁,一般采用地内存分配方法是使用内存分 块管理的内存池方式。在开源的嵌入式实时操作系统μCOS-II中也采用了该 种内存分配方式。它的技术方案如图1所示,其中:a表示各个内存头信息, m、n、f均为任意整数。相同大小的内存块由实箭头构成一个链表。

为了避免由于内存频繁申请和释放而导致内存碎片,通用的内存池管理 方式首先配置各种大小的内存块的数量,比如21字节大小的内存块m个,22 字节大小的内存块n个,以此类推,2n字节大小的内存块f个(其中m、n、 f均为任意整数),一般为了保证内存分配的可靠性,各种内存块大小保持一 个较大的上限值,同时在内存头中保存每个内存块的信息。然后在空闲内存 中分配一个大内存,专门用于满足用户的内存申请需求,该内存池大小为各 种大小的内存块大小的总和,即:(21×m+22×n+…+2n×f+所有内存 头大小)的值。

在进行内存申请时,根据申请内存的大小在相应的内存池中寻满足大 小需要的内存块,如果用户申请的内存是在2q-1~2q这样一个区间中(q为一 个确定的整数,满足2q-1<申请内存大小<=2q),则取一个空闲的2q大小 的内存块分配给应用;内存释放是根据内存块的的指针到相应的头,再将 其标记为自由内存并归还给相应的缓冲池的过程。

在该内存池分配方法中,不可能把内存块大小差距配置得很小、很均匀, 比如内存块大小1,2,4,6...2n,因为内存块大小差距太小,需要保存的内 存头指针就多,导致内存的申请和释放的查耗时剧增,直接影响内存分配 的快速性;同时,诸如内存头大小这样的额外的开销也大大增加。所以,一 般各内存块是采取诸如2n这样的分配方式的。

这种通用的内存池管理方法针对频繁申请和释放的内存,可以高效,可 靠的满足应用需要,同时也可以较好的避免内存碎片的问题。因此在目前的 嵌入式软件开发中,有很大范围的应用。

但是,这种通用的内存池管理方式对内存的使用有时是有比较大的浪费 的。因为,对于用户申请的内存UB,其对应的内存块是在2n-1<=UB<2n 这样一个区间中,但是经过内存池选择出的内存块大小则是2n(必须要不小 于2n,否则会导致内存申请失败),这样就存在(2n-UB)大小的空间浪费, 特别是UB为2n-1+1的时候尤为明显,而且n值愈大,内存耗费愈大;如果 存在一定数量的用户申请的内存,其大小落在靠近2n-1且大于2n-1附近的话, 这种浪费就可能对嵌入式产品产生致命影响了,因为一方面,嵌入式系统对 成本的要求使得内存在其中只是一种很有限的资源;而另一方面,即使不考 虑成本的因素,系统有限的空间和有限的板面积决定了可配置的内存容量是 很有限的。

如何扬长避短,既保持通用内存池管理的高效性等优点,又避免其可能 存在的内存浪费是更好利用内存池管理方式的关键。

发明内容

本发明所要解决的技术问题是提供一种嵌入式操作系统的内存池分配 方法,解决现有技术的内存浪费的问题。

为达到上述目的,本发明提供了一种嵌入式操作系统的内存池分配方 法,其特点在于,包括如下步骤:

步骤一,根据用户可能使用到的各种内存块的大小和数量以及对应的内 存头的大小,在内存资源中分配一个由所述内存块和内存头构成的内存池;

步骤二,对所述内存池进行初始化,确定各种大小的内存块的起始地址;

步骤三,对于内存申请,如果满足该内存申请的最小的单一内存块存在 超过阀值的浪费,则通过组合不同大小的多个内存块来满足该内存申请。

上述的方法,其特点在于,所述步骤二中,确定所述起始地址采用如下 规则:一个最大的内存块的结束地址是一个次大的内存块的起始地址,依次 类推,最后是一个最小的内存块的结束地址,从而内存块按从大到小的次序 构成一个循环;一个循环结束,再重复下一个循环的配置,同时,在内存头 中记录各内存块的起止地址和是否空闲的信息。

上述的方法,其特点在于,在所述步骤三中,所述存在超过阀值的浪费 为:所述单一内存块与紧跟所述单一内存块的次大内存块的平均值大于所述 内存申请。

上述的方法,其特点在于,在所述步骤三中,通过组合紧跟在所述单一 内存块之后的两个内存块来分配给所述内存申请。

上述的方法,其特点在于,所述步骤三进一步包括:

步骤A,判断所述内存申请是否小于所述单一内存块与所述次大内存块 的平均值,是则执行步骤B,否则执行步骤D;

步骤B,判断紧跟在所述单一内存块之后的两个内存块之和是否大于所 述内存申请,是则执行步骤C,否则执行步骤D;

步骤C,把所述两个内存块分配给所述内存申请,内存分配结束;

步骤D,直接把所述单一内存块分配给所述内存申请,内存分配结束。

上述的方法,其特点在于,还包括步骤四,在所述内存申请的应用结束 后,对所述内存申请的内存块进行释放。

上述的方法,其特点在于,在所述步骤四中,如果被释放的内存为多个 内存块的组合,则拆开所述组合的所述多个内存块,进行各内存块的单独释 放。

上述的方法,其特点在于,还包括:所述内存块按照内存地址的递增构 成一个单向链表一,所有相同大小的未被分配的空闲内存块又构成一个单向 链表二,并在内存块的内存头中的相应位置标明该内存块在所述链表一和链 表二中的顺序号。

上述的方法,其特点在于,还包括:在所述内存池的管理结构中记录内 存块大小、数量以及有无后继的内存池的索引,在内存头中记录对应内存块 的起始地址、占用标志以及有无比其大小还小的后继内存块标志。

本发明的技术效果在于:本发明提供的嵌入式软件的内存池分配的实现 方法,不仅能够充分利用目前通用内存池高效、可靠、不产生内存碎片等优 点,还可以有效的降低、缓解、甚至解决通用内存池可能存在的内存浪费, 使其更好的满足嵌入式软件开发对内存分配的要求。本发明可以很大程度的 减小和缓解通用内存池管理中存在的内存资源浪费的问题,同时,也保持了 通用内存池管理的高效性和可靠性。

附图说明

图1为通用的内存池管理方案示意图;

图2为本发明中的一个内存池中内存头和内存块的关系示意图;

图3为本发明中的内存池初始化示意图;

图4为本发明的整个内存池管理管理方法的实现流程示意图;

图5为本发明中的内存浪费可以接受时的内存分配示意图;

图6为本发明中的内存浪费严重时的内存分配示意图;

图7为本发明中的内存块释放示意图。

具体实施方式

下面结合附图对本发明进行详细描述。

本发明提供了一种新的嵌入式软件的内存池管理的实现方法,这种方法 不仅能够充分利用目前通用内存池高效、可靠、不产生内存碎片等优点,还 可以有效的降低、缓解、甚至解决通用内存池可能存在的内存浪费,使其更 好的满足嵌入式软件开发对内存分配的要求。

本发明的嵌入式操作系统的内存池管理方法,包括如下步骤:

步骤1:对用户可能使用的各种内存块大小和数量进行配置,然后根据 用户使用的内存块大小以及内存头等附加信息大小的总和在嵌入式软件的 内存资源中分配一个内存池,专供用户申请(释放)内存用;

步骤2:对步骤1的内存池进行初始化,即确定各种大小的内存块的起 始地址。分配各种大小的内存起始地址的规则是,一个最大的内存块的结束 地址是一个次大的内存块的起始地址,依次类推,最后是一个最小的内存块 的结束地址;同理,一个循环结束,再重复如此的配置。同时,在内存头中 记录各内存块的起止地址、是否空闲等情况。

步骤3:对内存申请,比较用户申请的内存大小和满足条件的最小的内 存块大小,如果内存浪费比较严重,则使用比满足条件的内存块小的两个地 址连续且大小递减的内存块来分配给用户使用,同时设置内存块使用标志; 只有在比满足条件的最小内存块小的两个地址连续且大小递减的内存块无 法提供用户申请的内存时,才使用满足条件的内存块来提供给用户使用。

步骤4:对内存释放,放置内存块到相应的空闲内存块后,同时设置内 存块的使用标志。

步骤5:在该嵌入式软件模块或系统中止运行时,释放步骤1分配的内 存池。

其中,步骤2中各种大小的内存块的数目是允许不相同的,因而可能出 现这种情况,比如最大的内存块结束地址是第三大的内存块的起始地址,但 对用户的内存分配过程不会产生影响。

步骤3中,对内存浪费是否严重的判断准则相对比较灵活,但是考虑到 便捷性和使用的高效性,使用连续大小的两个内存块(此时用户申请的内存 块大小大于其中小内存块而小于其中大内存块)的中间点来进行判断,用户 申请的内存块落在小内存块和该中间点区间时,认定内存浪费严重;而落在 该中间点和大内存块区间时,认定为内存浪费可以接收。

步骤4中,如果是连续的两个内存块的释放,对每个内存块单独释放, 即把每个内存块放入其相应的空闲内存块后。

以下为一个本发明实际应用的具体实例,假设配置的内存块情况是:21 字节大小的内存块n个,22字节大小的内存块n+1个,依次类推,2n字节大 小的内存块n+n个(n为任意整数)。

要完基于如上配置的嵌入式内存池管理的目的,本实例需要如下的步 骤:

步骤1):计算所需要的内存池大小。内存池大小由三部分组成,一是内 存块总大小,即(21×n+22×(n+1)+…+2n×(n+n)的和;二是内存 头大小总和,内存头需要保存返回给用户的内存地址、占用标志、所属内存 池、其后内存块占用标志、内存块在在相同大小的内存块组成的内存池中的 索引顺序号(seq1)、内存块在按地址顺序递变的内存池中的索引顺序号 (seq2)以及一些调试信息。三是各种大小的内存池的管理结构的大小之和 (一种大小的内存池有一个管理结构),该内存池的管理结构需要记录诸如 该内存池内存块的大小、数量、单独的内存块在内存池的第一个空闲的索引、 单独的内存块在内存池的最近一个释放块的索引、连续的内存块在内存池的 第一个空闲的索引以及连续的内存块在内存池的最近一个释放块的索引等 信息。然后根据所需要的内存池大小进行内存分配。内存池中内存头和内存 块的具体关系可参考图2。

步骤2):进行内存池初始化。分配内存头、内存池管理结构所占有的内 存。依次连续分配一个2n,2n-1,…,21字节大小的内存块,同理在第一个循 环分配完后,进行下一个循环分配,直至所有的内存块起始地址分配结束, 这样按照内存地址的递增构成了一个单向链表一,同时在内存池管理结构中 记录该池中内存块大小、数量,以及有无后继的内存池的索引,在内存头中 记录该内存块的起始地址、占用标志,以及有无比其大小还小的后继内存块 标志等。所有相同大小的未被分配的空闲内存块又构成一个单向链表二,以 便于分配时快速查、索引。两个单向链表要使用内存头中的seq1和seq2 来标明在对方链表中的顺序号,以便于链表对特定节点的增加和删除,避免 对整个链表的遍历,图3为本发明中的内存池初始化示意图,如图3所示, 其中:虚箭头表示相同大小的内存块构成一个单向链表;实箭头表示按照内 存地址的递增构成的一个单向链表。

步骤3):对于内存申请,假如用户申请Ubsize字节大小的内存,存在 满足2n-m-1<Ubsize<=2n-m条件内存块(m为小于n的整数)。如果Ubsize 大小在2n-m-1~(2n-m-1+(2n-m-2n-m-1)/2)区间中,则认为存在严重的内存 浪费(此时,浪费内存大于(2n-m-2n-m-1)/2),如果在(2n-m-1+(2n-m-2n-m-1 )/2)~2n-m区间,则认为内存浪费是可以接受的(此时,浪费内存小于(2n-m -2n-m-1)/2)。

步骤3-1:如果对内存申请而分配的内存块被认为内存浪费是可以接受 的。通过单独的内存块索引头寻空闲内存块,进行内存分配,同时设置占 有和无后继内存块标志;然后根据其内存头中的seq2索引号对单向链表1 中的seq2映射的节点进行删除。如图4所示,为本发明的整个内存池管理 管理方法的实现流程示意图,具体包括如下步骤:

步骤401,根据用户对内存的使用需求分配一个内存池;

步骤402,按规则确定各种大小的内存块在内存池的起始地址;

步骤403,建立内存块按地址递增的链表1和内存块按同等大小依次建 立的内存池链表2;

步骤404,用户调用接口类型,如为内存申请则执行步骤405,如为内 存释放则执行步骤406;

步骤405,进行内存申请;

步骤406,进行内存释放。

步骤3-2:如果对内存申请而分配的内存块被认为内存浪费是不可以接 受的。通过连续的内存块索引头寻空闲内存块,并查其地址后的地址连 续的两个内存块(UB1和UB2)且UB1大于UB2,如果(UB1+UB2)大小满足 用户需要,对其进行内存分配,同时设置占有和无后继内存块标志;然后分 别根据其内存头中的seq1索引号对单向链表2中的seq1映射的节点进行删 除。如果整个单向链表1中不存在这样的地址连续两个内存块,执行步骤3 -1。图5为本发明中的内存浪费可以接受时的内存分配示意图,如图5所 示,具体包括:

步骤501,内存池中有满足申请的内存块;

步骤502,判断内存浪费是否超过阀值,是则转到内存严重浪费的分配 流程60,否则执行步骤503;

步骤503,把该内存块从内存池链表中脱链;

步骤504,把该满足申请的内存块从按地址构建的链表中脱链。

图6为本发明中的内存浪费严重时的内存分配示意图,如图所是包括如 下步骤:

步骤60,承接图5中的步骤502的判断条件,即内存浪费超过阀值;

步骤601,判断在该满足申请的内存块地址后方是否存两个容量之和满 足该申请需求的内存块,是则执行步骤602,否则执行步骤604;

步骤602,把所述两个内存块从按地址构建的链表中脱链;

步骤603,把所述两个内存块从内存池链表中脱链,并把所述两个内存 块分配给申请,结束流程;

步骤604,把该满足申请的单一内存块分配给申请,结束流程。

(6)步骤4-1:对于内存释放,如果是步骤3-1中申请的内存块的释 放,将其加入单向链表2中的末尾;然后根据其内存头中的seq2索引号对 单向链表1中的seq2映射的节点(需要查看内存地址大小是否满足递增条 件)进行链表增加,同时设置占有和无后继内存块标志。图7为本发明中的 内存块释放示意图,如图,内存块的释放具体包括如下步骤:

步骤701,判断释放的内存块的大小和地址是否为两个内存块的组合, 是则执行步骤702,某则执行步骤704;

步骤702,分别把这两块内存块放入按地址构建的链表中;

步骤703,分别把这两块内存块放入内存池链表,结束释放;

步骤704,把该单一内存块放入内存池的链表中;

步骤705,把该单一内存块放入按地址构建的链表中,结束释放。

步骤:4-2:如果是步骤3-2中申请的内存块的释放,对每一个内存 块单独执行步骤3-1进行释放。

步骤5):如果系统停止运行,对步骤1)中申请的内存池进行释放。

可见,上述实例中一般可以减少(2n-m-2n-m-1)/2)的内存浪费(最多 可以减少2n-m-2n-m-1-1),有效降低、缓解了通用内存池管理中存在的浪费 情况;同时,采用了在内存头中建立相应索引顺序号的方法,避免了对内存 块的遍历,保证了内存分配和释放的高效性和快速性;由于整个内存池的初 始化、链表的建立一般都是在系统初始化阶段进行,不会对程序运行产生附 加的额外影响,保证了该内存池管理方法的运行平稳性。所以该内存池管理 方法可以为用户有效减少内存资源成本,在嵌入式软件领域有很大的推广价 值和实用价值。

本领域的技术人员可根据发明内容部分的技术方案构成多个实施例,比 如,利用紧跟在满足内存申请的最小单一内存块之后的三个、四个或五个内 存块分配给所述内存申请,或者利用其他规则任选比所述单一内存块小的多 个内存块,虽然其实现起来相对于以上实施例较为复杂并且效果较差,但仍 在本发明的范围之内,本领域的技术人员只需对以上实施例作出较小的变通 即可实现。

因此以上所述仅为本发明的较佳实施例,并非用来限定本发明的实施范 围;凡是依本发明所作的等效变化与修改,都被本发明的专利范围所涵盖。

本文发布于:2023-04-14 05:56:26,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/86454.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图