CN1303534C - 一种内存池管理的方法 - Google Patents
一种内存池管理的方法 Download PDFInfo
- Publication number
- CN1303534C CN1303534C CNB031050522A CN03105052A CN1303534C CN 1303534 C CN1303534 C CN 1303534C CN B031050522 A CNB031050522 A CN B031050522A CN 03105052 A CN03105052 A CN 03105052A CN 1303534 C CN1303534 C CN 1303534C
- Authority
- CN
- China
- Prior art keywords
- memory
- pool
- sub
- memory block
- memory pool
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Memory System (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本发明提供一种内存池管理的方法,包括以下步骤:设置若干个子内存池,为每个子内存池申请一定数目大小相同的gen内存块,并将同一子内存池的gen进一步划分为若干个大小相同的mem内存块,将未被划分的内存设置为OS内存池;应用模块申请内存时,虚拟操作系统先判断其所申请内存的大小是否大于每个子内存池中mem的大小,如果是则直接从OS内存池中为该应用模块分配内存块,否则根据其申请的大小找到相应的子内存池,并判断该子内存池中是否有空闲的mem,如果是则直接将该子内存池中的空闲mem分配给应用模块;否则虚拟操作系统先为该子内存池从OS内存池中动态申请一个gen后,再将该gen中的空闲mem分配给应用模块,并将已分配的mem标为占用。
Description
技术领域
本发明涉及内存管理技术领域,特别是指一种内存池管理的方法。
背景技术
目前,为了避免直接使用系统调用分配内存带来的内存碎片化问题,现有的虚拟操作系统都有一套内存管理机制。该内存管理机制一般是将底层操作系统的全部内存一次性地划分为大小不同的内存池,再将每一内存池中的内存划分为固定的大小一致的内存块。通常情况下,内存池的大小是2的幂字节数,并且一个内存池的大小是它左邻居内存池大小的2倍,例如,一个虚拟操作系统有N个内存池,一般每个内存池中内存块的大小分别为2、4、8、16、32、64......1024、2048字节......。由于内存池的个数、每个内存池中内存块的大小、内存块的数目等参数是在虚拟操作系统初始化时就被固定下来的,并且这些参数在虚拟操作系统运行过程中不会动态改变,因此为了高效地利用内存,必须事先统计各种不同内存的使用情况,例如每种内存的使用平均值、峰值等,根据这些统计数据再将内存进行合理地划分。
内存池的属性是由内存池描述符来描述,在内存池描述符中记录了该内存池中内存决的大小、类型、总数量、空闲的数量等属性。同时每个内存池中有两个链表一一空闲内存块链表和占用内存块链表。
在应用模块申请内存时,虚拟操作系统从其现有的内存块大小最接近应用模块所要求的内存池中指定一内存块,将该内存块的指针返给应用模块,同时将该内存块从其所在内存池的空闲内存块链表中取出,插入到占用内存块链表中。当应用模块释放内存时,虚拟操作系统再将该内存块从其所在内存池的占用内存块链表中移到空闲内存块链表中。
现有内存管理机制的缺陷在于:每种内存池的数目及每个内存池中内存块的数目是在虚拟操作系统运行前预先划分好的,这样在应用模块申请内存时,如果某种大小的内存块已消耗完毕,则可能因应用模块申请不到内存而造成系统异常,即使虚拟操作系统能够从较大的内存池中分配一内存块给该应用模块,也会造成系统内存的浪费;如果应用模块要申请一个所有内存池都无法提供的超大内存块,则会因应用模块申请不到内存而造成系统异常。
发明内容
有鉴于此,本发明提供一种内存池管理的方法,使应用模块随时都可申请到与之相匹配的内存块,并且在系统剩余内存空间允许的情况下,应用模块可随时申请到超大内存块。
为达到上述目的本发明的技术方案是这样实现的:
一种内存池管理的方法,该方法包括以下步骤:
a、设置一个以上子内存池,为每个子内存池从底层操作系统中申请一定数目大小相同的单位内存块,并将同一子内存池中的每个单位内存块进一步划分为至少一个以上大小相同的存贮内存块;然后将底层操作系统中未被划分的内存设置为操作系统内存池;
b、当应用模块申请内存时,虚拟操作系统先判断所申请内存的大小是否大于每个子内存池所能提供的存贮内存块的大小,如果是,则进入步骤c,否则,进入步骤d;
c、判断所申请内存的大小是否小于等于当前操作系统内存池所能提供的内存的大小,如果是,则虚拟操作系统直接从操作系统内存池中为该应用模块分配内存块,结束本流程,否则拒绝本次申请,结束本流程;
d、虚拟操作系统根据所申请内存的大小找到存贮内存块的大小与之相匹配的子内存池,并判断该子内存池中是否有空闲的存贮内存块,如果是,则直接将该子内存池中的空闲存贮内存块分配给应用模块后,将已分配的存贮内存块标记为占用;否则,虚拟操作系统为该子内存池从操作系统内存池中动态申请一单位内存块后,再将该单位内存块中的空闲存贮内存块分配给应用模块,并将已分配的存贮内存块标记为占用。
较佳地,步骤a所述子内存池被划分为控制块内存和缓冲器内存两种类型。
较佳地,步骤a所述的一定数目是根据单位内存块的使用平均值而确定的。
较佳地,不同子内存池中单位内存块所划分的存贮内存块大小不同。
较佳地,步骤d中,所述找到的子内存池为:与当前应用模块申请内存的类型相匹配的子内存池。
较佳地,当应用模块释放直接从操作系统内存池中申请的超大内存块时,将该超大内存块直接返回给操作系统内存池。
较佳地,步骤d之后,该方法进一步包括:当应用模块释放内存后,虚拟操作系统取消对该存贮内存块的占用标记,并当由于应用模块释放内存而出现空闲单位内存块时,判断其相应子内存池中单位内存块的个数是否超过初始化时所设定的一定数目,如果是,则将超出初始化数目的空闲单位内存块返还给底层操作系统;否则不做处理。
应用本发明,通过动态管理内存块,使应用模块随时都可申请到与之匹配的内存块,解决了由于某种内存块被耗尽后,应用模块因申请失败而导致系统异常的问题;同时解决了因应用模块被分配给大于其需求的内存块而导致系统内存资源使用浪费的问题。另外,只要在虚拟操作系统剩余内存空间允许的范围内,应用模块可直接从操作系统内存池中申请所有子内存池都不能提供的超大内存块,当应用模块释放该超大内存块时,该超大内存块将直接返回给操作系统内存池,应用此方法,解决了应用模块因申请不到超大内存块而导致系统异常的问题。同时,本发明有效地避免了底层操作系统内存碎片化的问题。
附图说明
图1为应用本发明内存池管理方法的示意图;
图2为应用本发明一实施例的示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下对本发明做进一步详细说明。
图1所示为应用本发明内存池管理方法的示意图。虚拟操作系统设置若干个子内存池(Subpool),并从底层操作系统内存中为每个子内存池申请一定数目的大小一致的单位内存块(gen),并将该gen进一步划分为若干个大小相同的存贮内存块(mem)。其中,子内存池又分为两种类型:一种是控制块内存(CB POOL),用于存储应用模块的控制块等较为永久的数据;另一种是缓冲器内存(BUF POOL),用于存储应用模块之间传递的消息数据。同时,为实现本发明的管理方法,使用了一些数据结构对底层操作系统内存进行管理,如图1中CB POOL CB为管理控制内存的数据结构、BUFPOOL CB为管理缓冲器内存的数据结构、Subpool CB为子内存池数组,且该数组中的每一元素对应一子内存池。除去上述底层操作系统中已被划分的内存,将底层操作系统中未被划分的内存设置为操作系统内存池(OSPOOL)。
在虚拟操作系统初始化时,虚拟操作系统从底层操作系统中为每个子内存池申请若干个大小一致的gen,其申请gen的个数是根据该类内存块的使用平均值而定。一个gen包含若干个mem内存块,因此,一个gen是一个较大的内存块,且一个子内存池中gen的数目是动态可变的,即一个子内存池中单位内存块的个数是可变的。由于每个子内存池最初所申请gen的数目都是该类内存块的使用平均值而不是峰值,所以,在初始化底层操作系统后,势必会剩余一大块未被虚拟操作系统“瓜分”的内存,该剩余的内存即为OS POOL。
在系统运行过程中,当应用模块申请内存时,虚拟操作系统根据申请内存的类型和大小,从最合适的子内存池中分配以mem为单位的内存块给应用模块,并同时将这块内存标记为占用,相应地,当应用模块释放内存时,系统取消对该mem内存块的标记。如果某个子内存池中所有以mem为单位的内存块都被标记为占用,即该子内存池中所有的gen内存块都已耗净,则虚拟操作系统将从OS内存池中为该子内存池申请一个gen内存块,然后继续从该gen中为应用模块分配mem内存块。如果一个子内存池中gen的个数超过了其初始化时的数目,并且由于应用模块释放内存使得某些gen中的mem内存块全部空闲,则虚拟操作系统将把超出初始化数目的gen返还给底层操作系统,即系统总是尽量保持每个子内存池中内存块gen的数目为该子内存池的初始值。由此可见,一个子内存池中内存块的数目是可动态变化的,并且虚拟操作系统总是以gen为单位从操作系统内存池中申请或释放内存,gen的容量一般较大,例如可以定为10K,因此可有效地避免底层操作系统内存碎片化的问题。
当应用模块申请一任何子内存池都不能提供的超大内存块时,系统将直接从OS内存池中为该应用模块申请内存块,只要OS内存池的剩余空间足够大,应用模块的要求都会被满足,超大内存块被释放时,也是直接返还到0S内存池中。
图2为应用本发明一实施例的示意图。假设在BUF POOL中有两个子内存池,其每个子内存池中mem的大小分别为2.5K和5K。图中mem内存块的右下角有黑三角标记的,代表该mem内存块已被应用模块占用,而没有黑三角标记的mem内存块,表示该内存块还处于空闲状态。
如果现有一应用模块需要申请2K的缓冲区内存,则虚拟操作系统首先根据应用模块所申请内存块大小定位到mem内存块的大小为2.5K的子内存池中,并判断该子内存池中的mem内存块是否都被标为占用,如果不是,则直接为其分配一个mem内存块,以满足其需求,并将已分配的men内存块标为占用,否则,虚拟操作系统先从OS POOL中为该子内存池申请一个gen,然后再从该gen中为应用模块分配一个2.5K的mem内存块,以满足其需求,并将已分配的men内存块标为占用;当应用模块释放内存时,取消对该mem内存块的标记,如果由于应用模块释放内存而出现了一个完全空闲的gen,并且该子内存池中gen的总数目又大于初始化时gen的数目,则将该空闲的gen归还给OS POOL。
如果现有一应用模块需要申请100K的超大内存,则虚拟操作系统首先判断是否有能够提供100K内存块的子内存池,如果有,就直接为其分配100K大小的mem内存块,并标记该mem内存块为占用,否则,判断当前OS POOL中的内存是否大于等于100K,如果是,则直接从OS POOL中为该应用模块提供内存块,否则,拒绝本次应用模块的申请;当该超大内存块时被释放时,直接返还到OS POOL中。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (7)
1、一种内存池管理的方法,其特征在于该方法包括以下步骤:
a、设置一个以上子内存池,为每个子内存池从底层操作系统中申请一定数目大小相同的单位内存块,并将同一子内存池中的每个单位内存块进一步划分为至少一个以上大小相同的存贮内存块;然后将底层操作系统中未被划分的内存设置为操作系统内存池;
b、当应用模块申请内存时,虚拟操作系统先判断所申请内存的大小是否大于每个子内存池所能提供的存贮内存块的大小,如果是,则进入步骤c,否则,进入步骤d;
c、判断所申请内存的大小是否小于等于当前操作系统内存池所能提供的内存的大小,如果是,则虚拟操作系统直接从操作系统内存池中为该应用模块分配内存块,结束本流程,否则拒绝本次申请,结束本流程;
d、虚拟操作系统根据所申请内存的大小找到存贮内存块的大小与之相匹配的子内存池,并判断该子内存池中是否有空闲的存贮内存块,如果是,则直接将该子内存池中的空闲存贮内存块分配给应用模块后,将已分配的存贮内存块标记为占用;否则,虚拟操作系统为该子内存池从操作系统内存池中动态申请一单位内存块后,再将该单位内存块中的空闲存贮内存块分配给应用模块,并将已分配的存贮内存块标记为占用。
2、根据权利要求1所述的方法,其特征在于:步骤a所述子内存池被划分为控制块内存和缓冲器内存两种类型。
3、根据权利要求1所述的方法,其特征在于,步骤a所述的一定数目是根据单位内存块的使用平均值而确定的。
4、根据权利要求1所述的方法,其特征在于,不同子内存池中单位内存块所划分的存贮内存块大小不同。
5、根据权利要求2所述的方法,其特征在于,步骤d中,所述找到的子内存池为:与当前应用模块申请内存的类型相匹配的子内存池。
6、根据权利要求1所述的方法,其特征在于该方法进一步包括:当应用模块释放直接从操作系统内存池中申请的超大内存块时,将该超大内存块直接返回给操作系统内存池。
7、根据权利要求1或5所述的方法,其特征在于,步骤d之后,该方法进一步包括:当应用模块释放内存后,虚拟操作系统取消对该存贮内存块的占用标记,并当由于应用模块释放内存而出现空闲单位内存块时,判断其相应子内存池中单位内存块的个数是否超过初始化时所设定的一定数目,如果是,则将超出初始化数目的空闲单位内存块返还给底层操作系统;否则不做处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB031050522A CN1303534C (zh) | 2003-03-03 | 2003-03-03 | 一种内存池管理的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB031050522A CN1303534C (zh) | 2003-03-03 | 2003-03-03 | 一种内存池管理的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1527206A CN1527206A (zh) | 2004-09-08 |
CN1303534C true CN1303534C (zh) | 2007-03-07 |
Family
ID=34282493
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB031050522A Expired - Fee Related CN1303534C (zh) | 2003-03-03 | 2003-03-03 | 一种内存池管理的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1303534C (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521143A (zh) * | 2011-12-14 | 2012-06-27 | 瑞斯康达科技发展股份有限公司 | 一种堆数据处理方法及装置 |
Families Citing this family (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100382048C (zh) * | 2005-11-08 | 2008-04-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
WO2007109920A1 (fr) * | 2006-03-27 | 2007-10-04 | Zte Corporation | Procédé de construction et d'utilisation d'un pool de mémoire |
US8156492B2 (en) * | 2007-09-07 | 2012-04-10 | Oracle International Corporation | System and method to improve memory usage in virtual machines running as hypervisor guests |
CN100527098C (zh) * | 2007-11-27 | 2009-08-12 | 北京大学 | 一种虚拟机管理器的动态内存映射方法 |
CN101286878B (zh) * | 2008-04-22 | 2012-02-29 | 中兴通讯股份有限公司 | 一种终端的内存池的管理方法 |
CN101950273B (zh) * | 2010-09-26 | 2012-05-23 | 中国人民解放军海军工程大学 | 一种dsp数据区动态管理方法 |
CN102436421B (zh) * | 2010-09-29 | 2015-12-16 | 腾讯科技(深圳)有限公司 | 缓存数据的方法 |
CN102455974A (zh) * | 2010-10-21 | 2012-05-16 | 上海宝信软件股份有限公司 | 一种内存消耗可控的高速内存申请释放管理系统及方法 |
CN102279804A (zh) * | 2011-08-16 | 2011-12-14 | 天津市天祥世联网络科技有限公司 | 视频监控平台系统的内存池结构及实现方法 |
CN103077126B (zh) * | 2012-12-24 | 2016-08-03 | 中兴通讯股份有限公司 | 一种内存管理方法和装置 |
CN103984639B (zh) * | 2014-04-29 | 2016-11-16 | 宁波三星医疗电气股份有限公司 | 一种动态内存分配方法 |
CN104133642B (zh) * | 2014-07-29 | 2018-07-13 | 浙江宇视科技有限公司 | SSD Cache填充方法及装置 |
CN105718319B (zh) * | 2016-02-23 | 2019-03-15 | 中国科学院微电子研究所 | 一种内存池版图解析方法和内存池装置 |
CN108304259B (zh) * | 2017-01-11 | 2023-04-14 | 中兴通讯股份有限公司 | 内存管理方法及系统 |
CN107247674B (zh) | 2017-06-16 | 2020-07-31 | 深圳市万普拉斯科技有限公司 | 内存块类型处理方法、装置、电子设备及可读存储介质 |
CN108958911B (zh) * | 2018-05-30 | 2022-02-08 | 北京小米移动软件有限公司 | 进程的控制方法及装置 |
CN109710408B (zh) * | 2018-12-24 | 2020-08-04 | 杭州迪普科技股份有限公司 | 内存管理方法和装置 |
CN113961485B (zh) * | 2021-10-26 | 2025-02-18 | 西安广和通无线通信有限公司 | 内存优化方法、装置、终端、存储介质 |
CN114356795A (zh) * | 2021-12-30 | 2022-04-15 | 中国民航信息网络股份有限公司 | 一种内存管理方法和相关装置 |
CN116048803A (zh) * | 2023-02-07 | 2023-05-02 | 奥特酷智能科技(南京)有限公司 | 一种在资源受限型mcu设备上实现内存池管理的方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5675790A (en) * | 1993-04-23 | 1997-10-07 | Walls; Keith G. | Method for improving the performance of dynamic memory allocation by removing small memory fragments from the memory pool |
CN1320863A (zh) * | 2000-06-13 | 2001-11-07 | 深圳市中兴通讯股份有限公司 | 一种实时系统中内存快速分配与释放的方法 |
CN1393780A (zh) * | 2001-06-28 | 2003-01-29 | 华为技术有限公司 | 自适应动态内存管理方法 |
-
2003
- 2003-03-03 CN CNB031050522A patent/CN1303534C/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5675790A (en) * | 1993-04-23 | 1997-10-07 | Walls; Keith G. | Method for improving the performance of dynamic memory allocation by removing small memory fragments from the memory pool |
CN1320863A (zh) * | 2000-06-13 | 2001-11-07 | 深圳市中兴通讯股份有限公司 | 一种实时系统中内存快速分配与释放的方法 |
CN1393780A (zh) * | 2001-06-28 | 2003-01-29 | 华为技术有限公司 | 自适应动态内存管理方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521143A (zh) * | 2011-12-14 | 2012-06-27 | 瑞斯康达科技发展股份有限公司 | 一种堆数据处理方法及装置 |
CN102521143B (zh) * | 2011-12-14 | 2015-04-15 | 瑞斯康达科技发展股份有限公司 | 一种堆数据处理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN1527206A (zh) | 2004-09-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1303534C (zh) | 一种内存池管理的方法 | |
WO2014171618A1 (ko) | 스토리지 시스템 및 스토리지 시스템의 쓰기 데이터 처리 방법 | |
CN101847127B (zh) | 一种内存管理方法及装置 | |
KR100769402B1 (ko) | 메모리 카드 | |
CN1276361C (zh) | 一种嵌入式系统内存管理的方法 | |
KR20110117099A (ko) | 메모리 장치에서 맵핑 어드레스 테이블을 유지관리하는 방법 | |
CN1271524C (zh) | 一种静态内存管理方法 | |
JPH03180941A (ja) | 外部記憶装置群のスペース管理方法 | |
US20020099918A1 (en) | Methods and systems for managing heap creation and allocation | |
US6801991B2 (en) | Method and apparatus for buffer partitioning without loss of data | |
JP2013206457A (ja) | ストレージシステムによるメモリ管理の方法および装置 | |
CN102968380B (zh) | 内存文件系统中内存分区的管理方法和装置 | |
US6219772B1 (en) | Method for efficient memory allocation of small data blocks | |
CN104317734A (zh) | 一种适用于slab的内存分配方法及装置 | |
CN1081362C (zh) | 在介质存储设备上提供存取保护的系统 | |
CN1181434C (zh) | 自适应动态内存管理方法 | |
US7969781B2 (en) | Method of controlling memory system | |
CN1567249A (zh) | 计算机系统的内存管理方法 | |
CN111078407A (zh) | 内存管理的方法、装置、存储介质及电子设备 | |
CN1627272A (zh) | 移动终端的闪存中的文件管理方法 | |
CN105630403A (zh) | 文件存储系统及其文件存储控制方法与装置 | |
CN1327348C (zh) | 解决频繁分配释放同等大小内存的方法 | |
CN116502225A (zh) | 自适应分组冗余编排的病毒扫描方法、装置及电子设备 | |
CN112650693B (zh) | 一种静态内存管理方法及装置 | |
CN110209489B (zh) | 一种适用于内存页结构的内存管理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20070307 Termination date: 20110303 |