一种内存管理方法和系统的制作方法

文档序号:6339765阅读:187来源:国知局
专利名称:一种内存管理方法和系统的制作方法
技术领域
本发明涉及计算机技术领域,具体涉及一种内存管理方法和系统。
背景技术
目前嵌入式系统应用已经深入到我们生活中的各个领域,手机、机顶盒、MP4播放 器、交换机、路由器等都可以归结为嵌入式设备。在这些嵌入式设备中,有一部分设备需 要功能强大、实时性强的操作系统。美国Wind RiverSystem公司(即WRS公司)推出的 Vxfforks正是这类操作系统中的佼佼者。Vxfforks是一个实时操作系统,其应用实例包括著 名的火星探测车、爱国者导弹等。自从VxWorks 5. 4进入中国十多年以来,呈现了面向构架 多、应用范围广、民用化的特性,越来越多的嵌入式设备转而采用VxWorks实现。VxWorks为了提高进程间通信效率,采用用户程序、内核处于同一个内存空间的共 享内存管理策略,操作系统没有对内存空间进行保护,各个任务实际上共享一个内存空间。 共享内存的特点就是无论是哪一个任务都可以不受限制的访问内存,对于非法内存操作没 有任何告警或提示,导致内存被非法改写的机率大大增加。内存一旦被非法改写,系统就会 出问题,而且表现出来的现象很可能每次都不一样,检查代码时很难发现这种隐藏得比较 深的问题。软件开发人员在开发程序时必须保证不侵犯其它程序和内核的内存空间,以免 破坏系统的正常工作或者导致其它程序的异常运行。VxWorks提供的内存申请和释放一般来说是用链表或者堆栈实现的,它们分配内 存时都是从较大的内存块中分出申请所需大小的内存块,并将剩余部分做为一个空闲内存 块继续保存在空闲内存链表中。在很多应用场合,分配内存和释放内存的使用频率很高,每 次申请的内存大小也不固定,而且需要不间断执行很长时间。长时间不间断的申请和释放 内存,到最后必然会产生大量的内存碎片,不仅影响申请内存所需的时间,还会导致内存耗 尽没有足够大的空闲内存用于较大的内存分配。

发明内容
本发明实施例提供一种内存管理方法和系统,在VxWorks系统中可以避免内存碎 片的产生,提高内存分配的效率。一种内存管理方法,包括预先建立一个包括若干个内存组的内存池,所述内存组包括多个内存块,同一内 存组内的内存块的大小相同且空闲的内存块依次链接成一空闲内存链表,不同内存组内的 内存块的大小互不相同;在收到内存分配请求时,根据请求的内存的大小选定第一内存组,将所述选定的 第一内存组的空闲内存链表中的第一个内存块分配给内存请求方;在收到内存释放请求时,根据需要释放的内存的地址选定第二内存组,将需要释 放的内存块作为第一个内存块链接到第二内存组的空闲内存链表中。一种内存管理系统,包括
初始化单元,用于预先建立一个包括若干个内存组的内存池,所述内存组包括多 个内存块,同一内存组内的内存块的大小相同且空闲的内存块依次链接成一空闲内存链 表,不同内存组内的内存块的大小互不相同;内存分配单元,用于在收到内存分配请求时,根据请求的内存的大小选定第一内 存组,将所述选定的第一内存组的空闲内存链表中的第一个内存块分配给内存请求方;内存释放单元,用于在收到内存释放请求时,根据需要释放的内存的地址选定第 二内存组,将需要释放的内存块作为第一个内存块链接到所述第二内存组的空闲内存链表 中。本发明实施例提供的内存管理方法,预先将内存划分为若干个内存组,对内存的 分配或者释放操作都是在相应的内存组内进行,而各个内存组包含大小不同的内存块以供 使用,从而可以避免内存碎片的产生,提高内存分配的效率;即使系统长时间运行,也不存 在内存分配效率下降的问题。


图1是本发明提供的内存管理方法实施例的流程图;图2是本发明方法实施例中内存池的数据结构的示意图;图3是本发明提供的应用场景例的示意图;图4是本发明提供的内存管理系统实施例的示意图。
具体实施例方式本发明实施例提供一种用于VxWorks系统的内存管理方法,采用预先将内存划分 为若干个内存组的技术方案,不同内存组内的内存块的大小互不相同,在分配内存时,根据 需要分配的内存的大小,选取相应的内存组中的空闲内存块链表中的第一个内存块进行分 配;在释放内存时,将释放的内存再链接到相应的内存组中的空闲内存块链表的头部。采用 本发明实施例的方法,可以避免内存碎片的产生,可以提高内存分配的效率。本发明实施例 还提供相应的内存管理系统。以下分别进行详细说明。请参考图1,本实施例提供一种用于VxWorks系统的内存管理方法,包括以下步 骤101、预先建立一个包括若干个内存组的内存池,所述内存组包括多个内存块,同 一内存组内的内存块的大小相同且空闲的内存块依次链接成一空闲内存链表,不同内存组 内的内存块的大小互不相同。优选的,所述内存组还包括一个控制块,所述控制块包括一个指向所述空闲内存 链表中第一个空闲内存块的控制指针以及一个表示所述空闲内存块的大小的标识值,所述 空闲内存链表中的空闲内存块包括一个指向下一空闲内存块的第一指针和一个指向所述 控制块的第二指针。102、在收到内存分配请求时,根据请求的内存的大小选定第一内存组,将选定的 第一内存组的空闲内存链表中的第一个内存块分配给内存请求方。在一个实施例中,所述根据请求的内存的大小选定内存组可以是将所述请求的 内存的大小与每一个控制块的标识值比较,确定一个与所述请求的内存的大小最接近且不小于所述请求的内存的标识值,以相应的控制块所属的内存组作为选定的内存组。在一个实施例中,所述将所述选定的内存组的空闲内存链表中的第一个内存块分 配给内存请求方之前还包括判断所述内存组内的空闲内存块链表是否为空,若不为空,则 执行所述将所述选定的内存组的空闲内存链表中的第一个内存块分配给内存请求方的步
马聚ο在一个实施例中,步骤102中将所述选定的第一内存组的空闲内存链表中的第一 个内存块分配给内存请求方的步骤可以包括1021、将选定的第一内存组的控制指针返回给内存请求方;1022、将控制指针改为指向所述空闲内存链表中下一个空闲的内存块。进一步的,102b具体可以为1022a、获取所述空闲内存链表中的第一个内存块的第一指针;1022b、将所述第一指针赋值给所述控制指针。103、在收到内存释放请求时,根据需要释放的内存的地址选定第二内存组,将需 要释放的内存块作为第一个内存块链接到所述第二内存组的空闲内存链表中。在一个实施例中,所述根据需要释放的内存的地址选定所属的内存组可以是将 所述需要释放的内存的地址减去一个预设值得到一控制块的指针,以该控制块所属的内存 组作为选定的内存组。在每个内存块的前面预留8个字节,以前4个字节作为开始标志;后 4个字节作为指向该内存组的控制块第二指针时,可以将需要释放的内存的地址减去预设 值4得到一控制块的指针。在一个实施例中,步骤103中将需要释放的内存块作为第一个内存块链接到所述 第二内存组的空闲内存链表中可以包括1031、将所述需要释放的内存块的第一指针指向所述第二内存组的空闲内存链表 中的第一个内存块;1032、将所述第二内存组的控制指针改为指向所述需要释放的内存块。进一步的,步骤1031具体可以为将所述第二内存组的控制指针赋值给所述需要 释放的内存块的第一指针。采用本发明实施例提供的内存管理方法,对内存的分配或者释放操作都是在相应 的内存组内进行,而各个内存组包含大小不同的内存块以供使用,分配内存时按照内存组 内的空闲内存链表的顺序从第一个内存块开始分配,释放内存时在将内存块链接在空闲内 存链表的头部作为第一个内存块,从而可以避免内存碎片的产生,提高内存分配的效率;即 使系统长时间运行,也不存在内存分配效率下降的问题。请参考图2和图3,以具体应用场景为例对本发明方法进行详细说明在在一个具体实施方式
中,预先建立的内存池共初始化有7个内存组,各内存组 包含的内存块的大小和内存块的个数定义如下第一内存组,包含2000个内存块,每个内 存块的大小为16字节;第二内存组,包含1000个内存块,每个内存块的大小为32字节;第 三内存组,包含500个内存块,每个内存块的大小为64字节;第四内存组,包含200个内存 块,每个内存块的大小为1 字节;第五内存组,包含200个内存块,每个内存块的大小为 256字节;第六内存组,包含100个内存块,每个内存块的大小为512字节;第七内存组,包 含100个内存块,每个内存块的大小为IOM字节。
每个内存组包括一个控制块,控制块包含一些统计信息和一个控制指针,该统计 信息可以包括内存块大小、内存使用次数和空闲内存块个数等三种标识值,该控制指针指 向该内存组内空闲内存链表的第一个空闲内存块。各个内存组内的空闲的内存块依次链接成一空闲内存链表。每个内存块的前面预 留了 8个字节,前4个字节是开始标志;后4个字节作为第二指针指向该内存组的控制块; 每个内存块的后面也预留了 4个字节,这4个字节是结束标志。每个内存块不使用即空闲 的时候就是一个指针,指向下一个空闲内存块,具体是以作为开始标志的4个字节作为第 一指针指向下一个内存块。各个内存组的控制块放在一个数组里,这个数组包括若干个由下标标记的元素, 其中前面的几个元素空着,将内存块的大小取以2为底的对数就可以得到控制块在控制块 数组里对应的元素,内存块大小为16个字节的内存组的控制块对应控制块数组下标为4的 元素,内存块大小为32个字节的内存组的控制块对应控制块数组下标为5的元素。需要说明的是,在其它实施方式中,每个内存组的内存块的个数、大小可以根据实 际需要调整,内存组的个数也可以根据实际需要进行调整。分配内存时,如果需要内存的大小比较大例如2000个字节,由于最大的内存块是 IOM个字节,于是就返回空表示没有空闲内存了。如果需要内存的大小小于或等于IOM个 字节,那就选择大小最接近的但不小于需要内存大小的内存块来分配。假设需要内存的大 小为10个字节,那么就选择分配16个字节的内存块;假设需要内存的大小为64个字节, 那么就选择分配64个字节的内存块;假设需要内存的大小为100个字节,那么就选择分配 1 个字节的内存块。确定分配多大的内存块后就根据分配内存块的大小确定相应的内 存组的控制块,根据控制块的指针是否为空确定空闲内存链表是否为空,若不为空,就将第 一个空闲内存块分配改请求方,具体为将控制块的控制指针返回给请求方,随后将控制块 的控制指针原先的第二个空闲内存块;如果空闲内存链表为空就返回空表示没有空闲内存 了。释放内存时,将要释放的内存地址减掉4就得到控制块的指针,然后将该内存块 链接到相应内存组的空闲内存链表的头部即可,具体为将该内存组的控制块的控制指针 赋值给需要释放的内存块的第一指针,使该内存块指向原空闲内存链表的第一个空闲内存 块;再将该内存组的控制块的控制指针改为指向需要释放的内存块,完成将该内存块链接 到空闲内存链表的头部。采用本发明实施例的方法,对内存的分配或者释放操作都是在相应的内存组内进 行,而各个内存组包含大小不同的内存块以供使用,分配内存时按照内存组内的空闲内存 链表的顺序从第一个内存块开始分配,释放内存时在将内存块链接在空闲内存链表的头部 作为第一个内存块,从而可以避免内存碎片的产生,提高内存分配的效率;即使系统长时间 运行,也不存在内存分配效率下降的问题。另外,采用本发明实施例的方法还可以检查内存被非法改写的情况,进而定位问 题所在并分析解决。这是由于每个内存组都是在一片连续的地址空间,组内每块内存大小 都是一样的,于是根据申请的内存可以确定每块内存的开始标志、结束标志和控制指针,那 么就可以用一个低优先级的任务每隔一段时间去检测每块内存的开始标志、结束标志和控 制指针,如果这些值被修改了说明有内存被非法改写的情况。如果发现有内存被非法改写的情况可以在每块内存前面预留更多的空间,每次分配内存时把文件名和行号记录下来, 这样就可以很快定位出问题所在。请参考图4,本发明实施例还提供一种用于VxWorks系统的内存管理系统,包括初始化单元201,用于预先建立一个包括若干个内存组的内存池,所述内存组包括 多个内存块,同一内存组内的内存块的大小相同且空闲的内存块依次链接成一空闲内存链 表,不同内存组内的内存块的大小互不相同。内存分配单元202,用于在收到内存分配请求时,根据请求的内存的大小选定第一 内存组,将所述选定的第一内存组的空闲内存链表中的第一个内存块分配给内存请求方。内存释放单元203,用于在收到内存释放请求时,根据需要释放的内存的地址选定 第二内存组,将需要释放的内存块作为第一个内存块链接到所述第二内存组的空闲内存链 表中。在一个实施例中,初始化单元201建立的内存组还包括一个控制块,所述控制块 包括一个指向所述空闲内存链表中第一个空闲内存块的控制指针以及一个表示所述空闲 内存块的大小的标识值,所述空闲内存链表中的空闲内存块包括一个指向下一空闲内存块 的第一指针和一个指向所述控制块的第二指针。在一个实施例中,内存分配单元202进一步包括第一选择单元,用于将所述请求的内存的大小与每一个控制块的标识值比较,确 定一个与所述请求的内存的大小最接近且不小于所述请求的内存的标识值,以相应的控制 块所属的内存组作为选定的内存组。在一个实施例中,内存分配单元202还包括判断单元,用于判断所述内存组内的空闲内存块链表是否为空,若不为空,则执行 所述将所述选定的内存组的空闲内存链表中的第一个内存块分配给内存请求方的步骤。在一个实施例中,内存释放单元203进一步包括第二选择单元,用于将所述需要释放的内存的地址减去一个预设值得到一控制块 的指针,以该控制块所属的内存组作为选定的内存组。采用本发明实施例提供的内存管理系统,对内存的分配或者释放操作都是在相应 的内存组内进行,而各个内存组包含大小不同的内存块以供使用,分配内存时按照内存组 内的空闲内存链表的顺序从第一个内存块开始分配,释放内存时在将内存块链接在空闲内 存链表的头部作为第一个内存块,从而可以避免内存碎片的产生,提高内存分配的效率;即 使系统长时间运行,也不存在内存分配效率下降的问题。以上对本发明实施例所提供的内存管理方法和系统进行了详细介绍,本文中应用 了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理 解本发明的方法及其核心思想,不应理解为对本发明的限制,凡在本发明的精神和原则之 内,所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种内存管理方法,其特征在于,包括预先建立一个包括若干个内存组的内存池,所述内存组包括多个内存块,同一内存组 内的内存块的大小相同且空闲的内存块依次链接成一空闲内存链表,不同内存组内的内存 块的大小互不相同;在收到内存分配请求时,根据请求的内存的大小选定第一内存组,将所述选定的第一 内存组的空闲内存链表中的第一个内存块分配给内存请求方;在收到内存释放请求时,根据需要释放的内存的地址选定第二内存组,将需要释放的 内存块作为第一个内存块链接到所述第二内存组的空闲内存链表中。
2.根据权利要求1所述的方法,其特征在于,所述内存组还包括一个控制块,所述控制块包括一个指向所述空闲内存链表中第一个 空闲内存块的控制指针以及一个表示所述空闲内存块的大小的标识值,所述空闲内存链表 中的空闲内存块包括一个指向下一空闲内存块的第一指针和一个指向所述控制块的第二 指针。
3.根据权利要求2所述的方法,其特征在于,所述将所述选定的第一内存组的空闲内 存链表中的第一个内存块分配给内存请求方包括将所述选定的第一内存组的控制指针返回给内存请求方;将所述控制指针改为指向所述空闲内存链表中下一个空闲的内存块。
4.根据权利要求3所述的方法,其特征在于,所述将所述控制指针改为指向所述空闲 内存链表中下一个空闲的内存块具体为获取所述空闲内存链表中的第一个内存块的第一指针;将所述第一指针赋值给所述控制指针。
5.根据权利要求2所述的方法,其特征在于,所述将需要释放的内存块作为第一个内 存块链接到所述第二内存组的空闲内存链表中包括将所述需要释放的内存块的第一指针指向所述第二内存组的空闲内存链表中的第一 个内存块;将所述第二内存组的控制指针改为指向所述需要释放的内存块。
6.根据权利要求5所述的方法,其特征在于,所述将所述需要释放的内存块的第一指 针指向所述第二内存组的空闲内存链表中的第一个内存块具体为将所述第二内存组的控 制指针赋值给所述需要释放的内存块的第一指针。
7.根据权利要求2至5中任一项所述的方法,其特征在于,所述根据请求的内存的大小 选定内存组包括将所述请求的内存的大小与每一个控制块的标识值比较,确定一个与所述请求的内存 的大小最接近且不小于所述请求的内存的标识值,以相应的控制块所属的内存组作为选定 的内存组。
8.根据权利要求2至5中任一项所述的方法,其特征在于,所述根据需要释放的内存的 地址选定所属的内存组包括将所述需要释放的内存的地址减去4得到一控制块的指针,以该控制块所属的内存组 作为选定的内存组。
9.根据权利要求2至5中任一项所述的方法,其特征在于,所述将所述选定的内存组的空闲内存链表中的第一个内存块分配给内存请求方之前还包括判断所述内存组内的空闲内存块链表是否为空,若不为空,则执行所述将所述选定的 内存组的空闲内存链表中的第一个内存块分配给内存请求方的步骤。
10. 一种内存管理系统,其特征在于,包括初始化单元,用于预先建立一个包括若干个内存组的内存池,所述内存组包括多个内 存块,同一内存组内的内存块的大小相同且空闲的内存块依次链接成一空闲内存链表,不 同内存组内的内存块的大小互不相同;内存分配单元,用于在收到内存分配请求时,根据请求的内存的大小选定第一内存组, 将所述选定的第一内存组的空闲内存链表中的第一个内存块分配给内存请求方;内存释放单元,用于在收到内存释放请求时,根据需要释放的内存的地址选定第二内 存组,将需要释放的内存块作为第一个内存块链接到所述第二内存组的空闲内存链表中。
全文摘要
本发明公开了一种内存管理方法,包括建立一个包括若干个内存组的内存池,同一内存组内的内存块的大小相同且空闲的内存块依次链接成一空闲内存链表,不同内存组内的内存块的大小互不相同;在收到内存分配请求时,根据请求的内存的大小选定第一内存组,将选定的第一内存组的空闲内存链表中的第一个内存块分配给内存请求方;在收到内存释放请求时,根据需要释放的内存的地址选定第二内存组,将需要释放的内存块作为第一个内存块链接到第二内存组的空闲内存链表中。本发明实施例还提供相应的内存管理系统。本发明方法对内存的分配或者释放操作都是在相应的内存组内进行,从而避免了内存碎片的产生,可以提高内存分配的效率。
文档编号G06F12/08GK102063385SQ20101060353
公开日2011年5月18日 申请日期2010年12月23日 优先权日2010年12月23日
发明者梁志宝 申请人:深圳市金宏威实业发展有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1