CN1740975A - 解决频繁分配释放同等大小内存的方法 - Google Patents
解决频繁分配释放同等大小内存的方法 Download PDFInfo
- Publication number
- CN1740975A CN1740975A CN 200510060795 CN200510060795A CN1740975A CN 1740975 A CN1740975 A CN 1740975A CN 200510060795 CN200510060795 CN 200510060795 CN 200510060795 A CN200510060795 A CN 200510060795A CN 1740975 A CN1740975 A CN 1740975A
- Authority
- CN
- China
- Prior art keywords
- memory
- memory pool
- pool
- freen
- free
- 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.)
- Granted
Links
Images
Landscapes
- Memory System (AREA)
Abstract
本发明公开了一种解决频繁分配释放同等大小内存的方法。本发明的方法通过维护一个可以扩展的内存池的链表,用函数来动态控制内存池链表中内存池的大小和内存池的数量。用链表来管理内存池,避免了一般内存池分配方式在内存池不够大的情况下,需要扩展原来的内存池,不能扩展的时候不得不重新分配更大的内存块作为内存池,导致内存碎片增多,不断的扩展内存池又导致了频繁分配内存的情况。用函数来控制分配的内存池的大小和数量,使得应用程序能更有效的利用内存和节约内存,提高应用程序内存的可定制性。
Description
技术领域
本发明涉及应用程序内存管理技术,特别是涉及一种解决频繁分配释放同等大小内存的方法。
背景技术
内存是计算机类产品的重要硬件设施,应用程序的内存分配释放都是建立在操作系统对内存的管理之上的。操作系统提供接口比如malloc,free等函数供应用程序进行内存的相关操作,操作系统本身则对应用程序的内存使用情况进行管理。
操作系统的内存管理机制会产生几种内存浪费的情况:内部碎片和外部碎片。
操作系统的内存管理机制遵循一些基本的内存分配规则。例如,所有内存的分配必须起始于可被4、8或16整除的地址。内存管理机制把仅仅预定大小的内存块分配给应用程序。当一个应用程序请求一个43字节的内存块的时候,内存管理机制可能会给它分配44个字节、或者48个字节甚至更多满足内存分配规则的内存。由所需大小四舍五入而产生的多余空间叫内部碎片。
当已分配内存块之间出现未被使用的差额时,就会产生外部碎片。例如,一个应用程序分配三个连续的内存块,然后释放中间的内存块。操作系统的内存管理机制可以重新使用中间的内存块供将来的内存块进行分配。但不太可能将来分配的内存块的大小跟操作系统的所有空闲内存块一样大。那么内存管理机制只能从大的空闲内存块中间分割出小的满足应用程序要求的内存块,这样一直继续下来,最后会出现很多小的内存之间的碎片,它们不能满足应用程序的任何一个内存请求,这些就是外部碎片。
在频繁分配释放同等大小内存的时候,操作系统会产生大量的外部内存碎片,并影响操作系统的效率。传统的解决方法是采用内存池。但是单一的内存池存在着定制性差、内存浪费、在扩展内存池的时候有可能产生内存碎片等缺陷,因此,对传统的频繁分配释放同等大小内存的方法进行改造,可以增加应用程序内存的可定制性,提高系统内存的使用效率,改善系统性能。
一个内存池是应用程序从操作系统中预先申请得到的一块连续内存,内存池的属性包括内存池的大小、起始地址、结束地址、内存块的大小、内存块的个数、内存块的标志、内存块的其它信息等。内存池的大小为内存块的个数乘以内存块的大小、内存块的标志大小与内存块的其它信息大小之和。
应用程序根据需要分配内存的大小,从对应的内存池取空闲内存块的地址进行使用,使用完后返回给内存池。
内存池没有空闲内存块的时候,应用程序扩展内存池,操作系统负责根据操作系统的内存管理机制扩展内存池或者重新分配更大的内存池,并且把原有的内存池信息复制到新的内存池。
现有的内存池管理方法,在应用程序刚开始的时候就限制了内存池的大小,可定制性较差,尽管当内存池不够大的时候可以扩展内存池,但同样可能会产生外部内存碎片,而且在内存池一直扩大的情况下,不停扩展内存池就相当于频繁分配内存,对系统效率有明显的影响。
因此,如果能提出更有效的解决频繁分配同等大小的方法,可以提高整个应用程序内存的可定制性,更有效的利用内存和节约内存,提高应用程序的运行速度,减少响应时间。
发明内容
本发明的目的在于提供一种解决频繁分配释放同等大小内存的方法。
本发明采用的技术方案如下:
1)记频繁分配释放同等大小内存的大小为msize,内存池链表的指针为plist,第n个内存池为mpn,内存池的起始地址为psn,结束地址为pen,内存池的第一个free标志的内存在该内存池的位置为freen;
2)定义一个函数f(n)用来决定第n个内存池的大小,f(n)值等于0或者小于0,则表示应用程序设定了大小为msize的内存块的个数上限,大小为前面n-1次分配的内存块的个数的和;
3)当应用程序需要大小为msize的内存时,则从内存池链表的第一个内存池开始,逐个判断内存池的freen是否大于f(n);如果freen小于等于f(n),表示该内存池有空闲内存可以分配,返回该内存池;如果freen大于f(n),表示该内存池没有空闲内存可以使用,判断下一个内存池;如果没有下一个内存池,并且f(n)>0,那么新建一个大小为F(n)的内存池,其中F(n)=(msize+标志位大小)*f(n);同时初始化所有的标志位为free,初始化freen为1,然后返回该内存池;如果f(n)<=0,则通知应用程序已达内存上限;
4)得到有空闲内存可以使用的内存池以后,把该内存池的位置为freen的内存给应用程序使用,同时把位置为freen的内存的标志设为used,然后从位置freen+1开始,逐个判断内存池的内存的标志是否为free,如果在内存池结束前找到标志为free的内存,则令该内存池的freen等于找到的标志为free的内存所在的位置,如果没找到标志为free的内存,则令该内存池的freen等于f(n)+1;
5)当应用程序释放大小为msize的内存时,则把该内存的标志设为free,同时判断该内存在所在内存池的位置是否大于所在内存池的freen,如果小于freen,则令freen等于该内存在所在内存池的位置;
6)应用程序退出的时候,销毁内存池链表中的所有内存池。
本发明和已有技术相比,具有的有益的效果是:用内存池链表替代单一的内存池、用函数来控制内存池的数量和大小,从而提高了整个应用程序内存的可定制性,更有效的利用内存和节约内存,提高应用程序的运行速度,减少响应时间。
附图说明
图1是内存池结构图;
图2是内存池链表的总结构图;
图3是有1个新建内存池的内存池链表;
图4是应用程序分配了1块大小为32的内存后的内存池链表;
图5是在图4状态上,应用程序连续分配了5块大小为32的内存后的内存池链表;
图6是在图5状态上,应用程序释放了位于内存池链表中内存池mp1第2个位置的内存块后的内存池链表状态。
具体实施方式
下面结合附图,用一个实施例来说明如何用本发明解决频繁分配释放同等大小内存的情况。
记频繁分配释放同等大小内存的大小为msize,内存池链表的指针为plist,第n个内存池为mpn,内存池的起始地址为psn,结束地址为pen,内存池的第一个free标志的内存在该内存池的位置为freen;定义一个函数f(n)用来决定第n个内存池的大小,f(n)值等于0或者小于0,则表示应用程序设定了大小为msize的内存块的个数上限,大小为前面n-1次分配的内存块的个数的和,见图1和图2所示。
步骤1:采用技术方案1)初始化频繁分配释放同等大小的内存的大小msize=32,内存池链表的指针为plist为空;
步骤2:采用技术方案2)初始化函数f,令f(1)=5,f(2)=7,f(3)=0,表示应用程序设定了内存大小为32的内存块的个数上限为5+7=12个;
步骤3:采用技术方案3)取得有空闲内存的内存池mp1,内存池mp1的5个内存块的标志全部为free(用F简写),内存池的第一个空闲内存块的位置free1=1。(见图3所示)
步骤4:得到有空闲内存块的内存池后,采用技术方案4)把位置为1的内存块给应用程序使用,同时把位置1的内存块的标志改成used(用U简写),内存池mp1的第一个空闲内存块的位置free1=2。(见图4所示)
步骤5:采用技术方案3)和4)再分配5块大小为32的内存给应用程序使用,这时内存池mp1的第一个空闲内存块的位置free1=6,内存池mp2的第一个空闲内存块的位置free2=2。(见图5所示)
步骤6:采用技术方案5)释放内存池mp1的位置为2的内存块,这时把该内存块的标志改为free,同时令内存池mp1的第一个空闲内存块的位置free1=2。(见图6所示)
步骤7:采用技术方案6)销毁内存池链表plist中的内存池mp1和mp2。这时,plist为空。
Claims (1)
1一种解决频繁分配释放同等大小内存的方法,其特征在于:
1)记频繁分配释放同等大小内存的大小为msize,内存池链表的指针为plist,第n个内存池为mpn,内存池的起始地址为psn,结束地址为pen,内存池的第一个free标志的内存在该内存池的位置为freen;
2)定义一个函数f(n)用来决定第n个内存池的大小,f(n)值等于0或者小于0,则表示应用程序设定了大小为msize的内存块的个数上限,大小为前面n-1次分配的内存块的个数的和;
3)当应用程序需要大小为msize的内存时,则从内存池链表的第一个内存池开始,逐个判断内存池的freen是否大于f(n);如果freen小于等于f(n),表示该内存池有空闲内存可以分配,返回该内存池;如果freen大于f(n),表示该内存池没有空闲内存可以使用,判断下一个内存池;如果没有下一个内存池,并且f(n)>0,那么新建一个大小为F(n)的内存池,其中F(n)=(msize+标志位大小)*f(n);同时初始化所有的标志位为free,初始化freen为1,然后返回该内存池;如果f(n)<=0,则通知应用程序已达内存上限;
4)得到有空闲内存可以使用的内存池以后,把该内存池的位置为freen的内存给应用程序使用,同时把位置为freen的内存的标志设为used,然后从位置freen+1开始,逐个判断内存池的内存的标志是否为free,如果在内存池结束前找到标志为free的内存,则令该内存池的freen等于找到的标志为free的内存所在的位置,如果没找到标志为free的内存,则令该内存池的freen等于f(n)+1;
5)当应用程序释放大小为msize的内存时,则把该内存的标志设为free,同时判断该内存在所在内存池的位置是否大于所在内存池的freen,如果小于freen,则令freen等于该内存在所在内存池的位置;
6)应用程序退出的时候,销毁内存池链表中的所有内存池。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2005100607956A CN1327348C (zh) | 2005-09-16 | 2005-09-16 | 解决频繁分配释放同等大小内存的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2005100607956A CN1327348C (zh) | 2005-09-16 | 2005-09-16 | 解决频繁分配释放同等大小内存的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1740975A true CN1740975A (zh) | 2006-03-01 |
CN1327348C CN1327348C (zh) | 2007-07-18 |
Family
ID=36093377
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2005100607956A Expired - Fee Related CN1327348C (zh) | 2005-09-16 | 2005-09-16 | 解决频繁分配释放同等大小内存的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1327348C (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100530140C (zh) * | 2007-11-08 | 2009-08-19 | Ut斯达康通讯有限公司 | 应用程序级的内存管理方法 |
WO2011015022A1 (zh) * | 2009-08-06 | 2011-02-10 | 深圳市融创天下科技发展有限公司 | 一种高效的先进先出数据池读写方法 |
CN102253900A (zh) * | 2011-06-13 | 2011-11-23 | 华中师范大学 | 一种Windows CE操作系统下的内存优化方法 |
CN105874439A (zh) * | 2014-05-28 | 2016-08-17 | 联发科技股份有限公司 | 不同计算单元共享内存池的内存池管理方法和相关的计算机可读介质和内存池管理装置 |
WO2021087662A1 (zh) * | 2019-11-04 | 2021-05-14 | 深圳市欢太科技有限公司 | 内存分配方法、装置、终端及计算机可读存储介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6574718B2 (en) * | 2001-02-28 | 2003-06-03 | International Business Machines Corporation | Excessive spin detection and avoidance for systems using a least recently used page replacement algorithm |
CN1183453C (zh) * | 2001-12-21 | 2005-01-05 | 上海贝尔有限公司 | 一种内存管理系统及其分配方法 |
CN100337192C (zh) * | 2003-08-13 | 2007-09-12 | 华为技术有限公司 | 一种定时器管理方法 |
-
2005
- 2005-09-16 CN CNB2005100607956A patent/CN1327348C/zh not_active Expired - Fee Related
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100530140C (zh) * | 2007-11-08 | 2009-08-19 | Ut斯达康通讯有限公司 | 应用程序级的内存管理方法 |
WO2011015022A1 (zh) * | 2009-08-06 | 2011-02-10 | 深圳市融创天下科技发展有限公司 | 一种高效的先进先出数据池读写方法 |
CN102253900A (zh) * | 2011-06-13 | 2011-11-23 | 华中师范大学 | 一种Windows CE操作系统下的内存优化方法 |
CN102253900B (zh) * | 2011-06-13 | 2013-06-12 | 华中师范大学 | 一种Windows CE操作系统下的内存优化方法 |
CN105874439A (zh) * | 2014-05-28 | 2016-08-17 | 联发科技股份有限公司 | 不同计算单元共享内存池的内存池管理方法和相关的计算机可读介质和内存池管理装置 |
WO2021087662A1 (zh) * | 2019-11-04 | 2021-05-14 | 深圳市欢太科技有限公司 | 内存分配方法、装置、终端及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN1327348C (zh) | 2007-07-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1276361C (zh) | 一种嵌入式系统内存管理的方法 | |
US10613762B2 (en) | Memory allocation buffer for reduction of heap fragmentation | |
US9805048B2 (en) | System and method for managing a deduplication table | |
US7519639B2 (en) | Method and apparatus for dynamic incremental defragmentation of memory | |
CN1669055A (zh) | 用于区域渲染的自动存储器管理 | |
US20150154216A1 (en) | System and methods for prioritizing data in a cache | |
CN1740975A (zh) | 解决频繁分配释放同等大小内存的方法 | |
CN101042684A (zh) | 改进系统dma映射同时实质上减少存储器分段的系统和方法 | |
CN101847127B (zh) | 一种内存管理方法及装置 | |
CN104899156A (zh) | 一种面向大规模社交网络的图数据存储及查询方法 | |
US20080244185A1 (en) | Reduction of cache flush time using a dirty line limiter | |
CN106339324B (zh) | 一种选择垃圾回收块的方法及装置 | |
CN1271524C (zh) | 一种静态内存管理方法 | |
CN1303534C (zh) | 一种内存池管理的方法 | |
US20160147670A1 (en) | Page cache device and method for efficient mapping | |
EP2645246A1 (en) | Method and apparatus of memory management by storage system | |
CN102968380A (zh) | 内存文件系统中内存分区的管理方法和装置 | |
US8327111B2 (en) | Method, system and computer program product for batched virtual memory remapping for efficient garbage collection of large object areas | |
CN1292352C (zh) | 利用存储元数据处理管理数据访问请求的方法和系统 | |
CN114327917A (zh) | 内存管理方法、计算设备及可读存储介质 | |
CN1573747A (zh) | 阴影分页 | |
CN107870922B (zh) | 一种用于数据去重的方法、设备和系统 | |
CN102650959A (zh) | 一种检测内存单元的方法及设备 | |
CN102521143A (zh) | 一种堆数据处理方法及装置 | |
CN1991778A (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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20070718 Termination date: 20160916 |
|
CF01 | Termination of patent right due to non-payment of annual fee |