内存管理方法及装置

著录项
  • CN201010529424.9
  • 20101101
  • CN101984417A
  • 20110309
  • 中兴通讯股份有限公司
  • 李爱华;徐阳;潘海兵
  • G06F12/02
  • G06F12/02

  • 广东省深圳市南山区科技南路55号
  • 中国,CN,广东(44)
  • 北京康信知识产权代理有限责任公司
  • 余刚;吴孟秋
摘要
本发明公开了一种内存管理方法和装置,该方法包括:根据应用系统的内存需求配置至少一个队列,不同队列管理不同尺寸的内存块,各队列管理的内存块尺寸由所述内存需求确定,所述应用系统中包含至少一个应用;将所述应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中;以及当所述应用系统中的应用发起内存块申请时,在所述各队列中查与申请的内存块尺寸匹配的内存块并分配给所述应用。采用本发明能够节省内存。
权利要求

1.一种内存管理方法,其特征在于,包括:

根据应用系统的内存需求配置至少一个队列,不同队列管理不同尺寸的内存块,各队列管理的内存块尺寸由所述内存需求确定,所述应用系统中包含至少一个应用;

将所述应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中;以及

当所述应用系统中的应用发起内存块申请时,在所述各队列中查与申请的内存块尺寸匹配的内存块并分配给所述应用。

2.根据权利要求1所述的方法,其特征在于,所述根据应用系统的内存需求配置至少一个队列之前,包括:

为所述应用系统配置内存量大于所述应用系统的内存需求的内存堆;以及

在所述各队列中未查与申请的内存块尺寸匹配的内存块并分配给所述应用时,包括:

在所述内存堆中分割与所述申请的内存块尺寸匹配的内存块,并分配给所述应用。

3.根据权利要求2所述的方法,其特征在于,若所述内存堆中剩余内存量小于所述申请的内存块尺寸时,通知所述应用申请失败。

4.根据权利要求2所述的方法,其特征在于,所述应用系统已释放的内存块是所述内存堆最后一次分割的内存块时,回收该内存块。

5.根据权利要求4所述的方法,其特征在于,在所述内存堆中分割与所述申请的内存块尺寸匹配的内存块,并分配给所述应用,包括:从所述内存堆的底部依次分割与所述申请的内存块尺寸匹配的内存块。

6.根据权利要求5所述的方法,其特征在于,从所述内存堆的底部依次分割与所述申请的内存块尺寸匹配的内存块之后,还包括:

在所述内存堆头部保存已分配的内存块地址与所述内存堆地址形成的偏移量,并将所述偏移量进行排序;以及

根据排序结果确定所述内存堆即将回收的内存块的地址。

7.根据权利要求1至6任一项所述的方法,其特征在于,当所述应用系统改变,或者所述应用系统的内存需求改变时,根据改变后的应用系统的内存需求重新配置至少一个队列。

8.一种内存管理装置,其特征在于,包括:

配置单元,用于根据应用系统的内存需求配置至少一个队列,不同队列管理不同尺寸的内存块,各队列管理的内存块尺寸由所述内存需求确定,所述应用系统中包含至少一个应用;

存储单元,用于将所述应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中;

分配单元,用于当所述应用系统中的应用发起内存块申请时,在所述各队列中查与申请的内存块尺寸匹配的内存块并分配给所述应用。

9.根据权利要求8所述的装置,其特征在于,所述配置单元,进一步用于为所述应用系统配置内存量大于所述应用系统的内存需求的内存堆;

所述分配单元,进一步用于在所述内存堆中分割与所述申请的内存块尺寸匹配的内存块,并分配给所述应用。

10.根据权利要求9所述的装置,其特征在于,所述分配单元,进一步用于若所述内存堆中剩余内存量小于所述申请的内存块尺寸时,通知所述应用申请失败。

11.根据权利要求9所述的装置,其特征在于,还包括:

回收单元,用于所述应用系统已释放的内存块是所述内存堆最后一次分割的内存块时,回收该内存块。

12.根据权利要求11所述的装置,其特征在于,所述分配单元,进一步用于从所述内存堆的底部依次分割与所述申请的内存块尺寸匹配的内存块。

13.根据权利要求12所述的装置,其特征在于,所述回收单元,进一步用于在所述内存堆头部保存已分配的内存块地址与所述内存堆地址形成的偏移量,并将所述偏移量进行排序;以及,根据排序结果确定所述内存堆即将回收的内存块的地址。

14.根据权利要求9至13任一项所述的装置,其特征在于,所述配置单元,进一步用于当所述应用系统改变,或者所述应用系统的内存需求改变时,根据改变后的应用系统的内存需求重新配置至少一个队列。

说明书
技术领域

技术领域

本发明涉及通信领域,具体而言,涉及一种内存管理方法及装置。

背景技术

在移动通信嵌入式应用领域,嵌入式操作系统的应用日益广泛,但是,硬件平台存在内存限制,这就使得动态内存的使用成为了趋势。通常,使用动态内存可以提高内存的使用效率,提高系统容量。

相关技术提供了一种动态内存管理接口,包括:申请接口malloc()和释放接口free()。但是上述接口长时间的使用以后会出现如图1所示情况,即,内存会被分成大小不同的若干块。若接收到内存申请时,需要遍历整个空闲队列到比当前申请的内存块尺寸相等或者更大的内存块,然后从该内存块上划分申请的内存块尺寸大小的内存,把剩余的内存再挂接在空闲队列上。这样随着不断地申请释放会产生大量的不连续内存碎片,存在较大的内存浪费,而且每次查比当前申请的内存块尺寸相等或者更大的内存块,均需要对整个链表进行遍历,查效率较差。

相关技术中还提供了一些改进的动态内存管理方式,如DSP(Digital Signal Processor,数字信号处理器)上的DSP/BIOS(BasicInstruction Operation System,基本指令操作系统)提供的缓冲池Buffer Pool方式,示意图请参见图2,这种内存管理方式需要预先根据应用的情况分配好各个队列的内存数量,在初始化的时候把队列根据内存的大小和数量建立好,在应用过程中根据需求进行申请和释放。这就可能由于预先划分的不合理出现一种队列中内存使用完了,而其他队列中还有充足内存的情况,这种动态内存管理方式采用固定尺寸管理,灵活性差,内存仍不能得到充分利用。

针对相关技术中内存浪费的问题,目前尚未提出有效的解决方案。

发明内容

本发明的主要目的在于提供一种内存管理方法及装置,以至少解决上述内存浪费的问题。

根据本发明的一个方面,提供了一种内存管理方法,包括:

根据应用系统的内存需求配置至少一个队列,不同队列管理不同尺寸的内存块,各队列管理的内存块尺寸由所述内存需求确定,所述应用系统中包含至少一个应用;

将所述应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中;以及

当所述应用系统中的应用发起内存块申请时,在所述各队列中查与申请的内存块尺寸匹配的内存块并分配给所述应用。

较优的,所述根据应用系统的内存需求配置至少一个队列之前,包括:

为所述应用系统配置内存量大于所述应用系统的内存需求的内存堆;以及

在所述各队列中未查与申请的内存块尺寸匹配的内存块并分配给所述应用时,包括:

在所述内存堆中分割与所述申请的内存块尺寸匹配的内存块,并分配给所述应用。

较优的,若所述内存堆中剩余内存量小于所述申请的内存块尺寸时,通知所述应用申请失败。

较优的,所述应用系统已释放的内存块是所述内存堆最后一次分割的内存块时,回收该内存块。

较优的,在所述内存堆中分割与所述申请的内存块尺寸匹配的内存块,并分配给所述应用,包括:从所述内存堆的底部依次分割与所述申请的内存块尺寸匹配的内存块。

较优的,从所述内存堆的底部依次分割与所述申请的内存块尺寸匹配的内存块之后,还包括:

在所述内存堆头部保存已分配的内存块地址与所述内存堆地址形成的偏移量,并将所述偏移量进行排序;以及

根据排序结果确定所述内存堆即将回收的内存块的地址。

较优的,当所述应用系统改变,或者所述应用系统的内存需求改变时,根据改变后的应用系统的内存需求重新配置至少一个队列。

根据本发明的另一方面,提供了一种内存管理装置,包括:

配置单元,用于根据应用系统的内存需求配置至少一个队列,不同队列管理不同尺寸的内存块,各队列管理的内存块尺寸由所述内存需求确定,所述应用系统中包含至少一个应用;

存储单元,用于将所述应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中;

分配单元,用于当所述应用系统中的应用发起内存块申请时,在所述各队列中查与申请的内存块尺寸匹配的内存块并分配给所述应用。

较优的,所述配置单元,进一步用于为所述应用系统配置内存量大于所述应用系统的内存需求的内存堆;

所述分配单元,进一步用于在所述内存堆中分割与所述申请的内存块尺寸匹配的内存块,并分配给所述应用。

较优的,所述分配单元,进一步用于若所述内存堆中剩余内存量小于所述申请的内存块尺寸时,通知所述应用申请失败。

较优的,回收单元,用于所述应用系统已释放的内存块是所述内存堆最后一次分割的内存块时,回收该内存块。

较优的,所述分配单元,进一步用于从所述内存堆的底部依次分割与所述申请的内存块尺寸匹配的内存块。

较优的,所述回收单元,进一步用于在所述内存堆头部保存已分配的内存块地址与所述内存堆地址形成的偏移量,并将所述偏移量进行排序;以及,根据排序结果确定所述内存堆即将回收的内存块的地址。

较优的,所述配置单元,进一步用于当所述应用系统改变,或者所述应用系统的内存需求改变时,根据改变后的应用系统的内存需求重新配置至少一个队列。

在本发明实施例中,应用系统已释放且未被回收的内存块按尺寸存储在对应的队 列中,当应用系统中的应用发起内存块申请时,在各队列中查与申请的内存块尺寸匹配的内存块并分配给应用,充分利用了未被回收的内存块,提高内存的利用率。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据相关技术的第一种内存管理方法形成的内存块示意图;

图2是根据相关技术的第二种内存管理方法形成的内存块示意图;

图3是根据本发明实施例的内存管理方法的处理流程图;

图4是根据本发明实施例的内存管理方法的实施例的流程图;

图5是根据本发明实施例的内存堆的示意图;

图6是根据本发明实施例的内存管理装置的第一种结构示意图;

图7是根据本发明实施例的内存管理装置的第二种结构示意图。

具体实施方式

下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。

相关技术提到的两种动态内存管理方法均存在内存利用不充分的问题,为解决该技术问题,本发明实施例提出一种内存管理方法,处理流程如图3所示,包括:

步骤302、根据应用系统的内存需求配置至少一个队列,不同队列管理不同尺寸的内存块,各队列管理的内存块尺寸由内存需求确定,应用系统中包含至少一个应用;

步骤304、将应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中;

步骤306、当应用系统中的应用发起内存块申请时,在各队列中查与申请的内存块尺寸匹配的内存块并分配给应用。

在本发明实施例中,应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中,当应用系统中的应用发起内存块申请时,在各队列中查与申请的内存块尺寸匹配的内存块并分配给应用,充分利用了未被回收的内存块,提高内存的利用率。

实施时,根据应用系统的内存需求配置至少一个队列之前,需要首先划分足量的内存作为本发明实施例提供的内存管理方法所使用的内存堆,例如,在本例中,就需要为应用系统配置内存量大于应用系统的内存需求的内存堆,这样才能够满足应用系统的对内存的需求。此时,若在各队列中未查与申请的内存块尺寸匹配的内存块并分配给应用时,还可以在内存堆中分割与申请的内存块尺寸匹配的内存块,并分配给应用。

当然了,在实施时,若内存堆中剩余内存量小于申请的内存块尺寸时,则无法获得可用的内存块,通知应用申请失败。

在本发明实施例中,随着应用的变化,可以结合内存回收功能动态的调整每个队列中的内存块的数量,例如,应用系统已释放的内存块是内存堆最后一次分割的内存块时,回收该内存块。

在一个实施例中,较优的,在内存堆中分割与申请的内存块尺寸匹配的内存块,并分配给应用,可以从内存堆的底部依次分割与申请的内存块尺寸匹配的内存块。这样就可 以避免内存堆被分割成无数零乱的碎片,提高内存的利用率。

从内存堆的底部依次分割与申请的内存块尺寸匹配的内存块之后,可以选择在内存堆头部保存已分配的内存块地址与内存堆地址形成的偏移量,并将偏移量进行排序;根据排序结果确定内存堆即将回收的内存块的地址。根据内存堆头部保存的偏移量,就可以显而易见地判断出此时内存堆应该回收的内存块的地址,减少计算量。

例如,若偏移量是内存块与内存堆的头部地址间的偏移量,形成一个由大到小排序的数组,那么最后一块从内存堆中分割出来的内存块的偏移量是数组中的最后一个,也即是最小的一个;如果偏移量是内存块与内存堆的尾部地址的偏移量,可以将偏移量按从小到大进行排序,形成一个由小到大排序的数组,那么最后一块从内存堆中分割出来的内存块的偏移量是数组中的最后一个,也即是最大的一个。

在本发明实施例中,当应用系统改变,或者应用系统的内存需求改变时,根据改变后的应用系统的内存需求重新配置至少一个队列,避免了队列配置的尺寸不符合当前应用系统,导致队列中存储的内存块无法使用的情况。

综上可得,本发明实施例可以根据应用系统的内存需要灵活地来划分内存,但是又会随着应用的变化,结合内存回收功能来动态的调整每个队列中的内存块的数量,最终每个队列形成固定尺寸大小如图2所示队列,但是具体的尺寸大小与图2所示不一定相同,此处仅仅是对队列的尺寸进行示意。根据本发明实施例能够解决内存碎片、灵活性差等问题,同时还能保证较高的内存利用率。

现对本发明实施例提供的内存管理方法进行说明,参见图4,包括如下步骤:

步骤402、结合应用的内存需求,划分足量的内存作为动态内存管理的内存堆;以及设置管理固定尺寸内存块的队列,这些队列初始为空队列;

步骤404、随着应用申请内存使用,动态管理的内存堆根据申请的情况进行动态的划分,每次申请的内存从内存堆中的底部进行分配,同时保存已经分配的内存地址与堆头部地址形成的偏移量在堆开始部分,依次形成一个由大到小排序好的数组;

步骤406、如果内存释放,那么把释放的内存存放在内存块队列中,队列形成后直接使用释放但未回收的内存来存放内存信息,来形成一个单向链表;

步骤408、如果应用模型发生变化,当前形成的各种尺寸队列中的内存块的数量不再符合最新的应用,那么需要把各个队列中的内存回收到内存堆中,重新生成队列来满足应用。

为使得本发明实施例的目的、技术方案以及优点更加清晰,下面以具体实施例进一步对本发明实施例进行详细说明。

本发明实施例主要是通过应用对内存的申请和释放来自适应地形成按照不同尺寸划分的队列,同时在形成队列过程中使用释放的内存存放构建队列的信息。而且为了更好的处理内存的释放和回收,在内存申请的时候,根据内存地址的偏移量形成了一个由大到小排序好的数组,便于使用算法查等处理,为说明得更详细,现以具体实例进行说明,具体如图5所示,图5中示意了一个内存堆,其堆头部地址为0x80000,其堆底部地址为0x90000,从该内存堆的底部进行内存块的划分,依次划分的内存块尺寸大小为8、34、128、64、24、64、8......,其中内存堆头部存储了已分配的内存块地址与内存堆地址形成的偏移量,从图中可以看出,分配的内存块有四种尺寸:8、24、64、128;据此生成的数组(存储在队 列的表头)也就依次包括:0xFFF8、0xFFE0、0xFFA0、0xFF20......;其中,尺寸为64的列表为空NULL。下面各具体实施例均以图5为示意图。

实施例一:内存申请

首先,根据申请内存的大小,查对应尺寸的队列是否有空闲。若不空,则从队列链表头取一块内存,修改链表信息,返回地址;如若申请96字节的内存,那么需要首先判断128字节的队列是否为空,从图5上看队列不空那么就从队列中分配一块。

若空,则需要从内存堆中分割一块对应尺寸的内存。首先需要判断内存堆中剩余内存量是否能满足申请,如不满足,则申请失败;若满足则从内存堆的底部分割一块对应大小尺寸的内存,修改内存堆信息,计算偏移量,最后返回地址。如果申请60字节的内存,如图5中该队列为空,那么就从内存堆中挖出一个64字节的内存给应用。

实施例二:内存释放

首先,根据地址确定需要释放的内存尺寸,根据地址计算偏移量,在偏移量数组中通过查算法(例如二分法)查到该地址,由前后偏移量可确认尺寸。

其次,根据地址判断该内存是否需要回收,如果需要,直接把内存释放到内存堆中,返回释放完成;如图5中,当前释放的为粗线框所示的128字节的内存,由于当前的内存块是系统最后一次分配出去的内存,因此在释放的时候,可以直接回收。否则,把内存存放到对应尺寸的队列中;在需要释放的内存块中保存之前的链表信息,然后把该内存放在链表头。

实施例三:内存回收

在本实施例中,内存回收的原则是回收最后一次从堆中分割出来并且空闲的内存,处理过程如下:

首先,偏移量数组是在内存申请时候,动态生成的由大到小排序的数组,因此数组的最后一个偏移地址即是当前需要回收的内存;根据该内存的地址和偏移值,计算内存尺寸;如图5中,可以看出粗线框中的128字节的内存是系统最后一次分配出去的内存,因此在回收的时候,需要先回收该内存块。

然后,根据尺寸和内存地址,在相应的链表中查,如果未到,标记该内存需要回收,在内存释放时进行回收;即,若确定当前需要回收128字节的内存块,那么需要在相应的内存空闲队列中查这一内存块。

如果到,从链表中摘除该内存,修改链表信息,把内存回收到内存堆中。如图5所示,如果粗线框中128字节的内存正好在对应的空闲链表中,那么就直接进行回收。

重复上述步骤,直到不需要回收为止。

基于同一发明构思,本发明实施例还提供了一种内存管理装置,其结构示意图如图6,包括:

配置单元601,用于根据应用系统的内存需求配置至少一个队列,不同队列管理不同尺寸的内存块,各队列管理的内存块尺寸由所述内存需求确定,应用系统中包含至少一个应用;

存储单元602,用于将应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中;

分配单元603,用于当应用系统中的应用发起内存块申请时,在各队列中查与申 请的内存块尺寸匹配的内存块并分配给应用。

在一个实施例中,配置单元601可以进一步用于为应用系统配置内存量大于应用系统的内存需求的内存堆;

分配单元603可以进一步用于在内存堆中分割与申请的内存块尺寸匹配的内存块,并分配给应用。

在一个实施例中,分配单元603可以进一步用于若内存堆中剩余内存量小于申请的内存块尺寸时,通知应用申请失败。

在一个实施例中,如图7所示,内存管理装置还可以包括:

回收单元701,用于应用系统已释放的内存块是内存堆最后一次分割的内存块时,回收该内存块。

在一个实施例中,分配单元603可以进一步用于从内存堆的底部依次分割与申请的内存块尺寸匹配的内存块。

在一个实施例中,回收单元701可以进一步用于在内存堆头部保存已分配的内存块地址与内存堆地址形成的偏移量,并将偏移量进行排序;以及,根据排序结果确定内存堆即将回收的内存块的地址。

在一个实施例中,配置单元601可以进一步用于当应用系统改变,或者应用系统的内存需求改变时,根据改变后的应用系统的内存需求重新配置至少一个队列。

从以上的描述中,可以看出,本发明实现了如下技术效果:

在本发明实施例中,应用系统已释放且未被回收的内存块按尺寸存储在对应的队列中,当应用系统中的应用发起内存块申请时,在各队列中查与申请的内存块尺寸匹配的内存块并分配给应用,充分利用了未被回收的内存块,提高内存的利用率。

显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

本文发布于:2024-09-23 20:19:27,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/86332.html

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

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议