CN105528304B - 内存池管理方法 - Google Patents
内存池管理方法 Download PDFInfo
- Publication number
- CN105528304B CN105528304B CN201510882301.6A CN201510882301A CN105528304B CN 105528304 B CN105528304 B CN 105528304B CN 201510882301 A CN201510882301 A CN 201510882301A CN 105528304 B CN105528304 B CN 105528304B
- Authority
- CN
- China
- Prior art keywords
- memory
- memory pool
- header structure
- headroom
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0842—Multiuser, multiprocessor or multiprocessing cache systems for multiprocessing or multitasking
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
Abstract
本发明提供了一种内存池管理方法,包括:将内存池划分为多个大小不同的次级内存池,各个次级内存池按照不同的对齐长度对应不同的内存链表;根据需要的内存空间的大小选择次级内存池,按照与所选择的次级内存池对应的对齐长度分配内存;在分配的内存空间前加一头结构,所述头结构用于记录所述分配的内存空间的大小以及使用状态。每个链表都是独立线程安全的,同步颗粒更小,相应减少了同步,提高了分配性能。并通过所述头结构中的值来判断内存使用的合法性,生成调用堆栈,并记录日志,便于分析和定位问题代码。
Description
技术领域
本发明涉及计算机应用领域,尤其是一种内存池管理方法。
背景技术
现今的操作系统中,对内存的使用已经成为是程序员最棘手的问题,对内存的释放与申请内存长度不同等不当使用往往会造成程序崩溃、内存越界,也可能会出现由于内存越界导致的数据不正确等各种诡异问题。各种语言的自动内存回收等机制也被不断开发出来。即便是能能正确的申请和释放内存,当频繁进行申请和释放也可能会造成以下两个问题。一是对效率的影响,申请和释放内存在操作系统能够内部需要做很多处理,效率往往不高。二是由于系统内存分配机制问题造成,当用户请求一个内存单元小于一个页时,系统会在内存页上分配内存,但当另一个内存请求大于上个页的剩余空间时,系统会在新的页上分配所请求的内存空间,此时第一个页的剩余空间就会形成碎片,形成大量内存碎片后会导致系统运行效率下降,甚至导致程序不能运行。用于频繁接收请求并发送处理结果的网络服务器更容易出现问题,系统会很快的耗尽内存使系统运行效率逐渐降低,最后不能处理请求。
频繁申请和释放内存单元会对降低效率,增加CPU开销,可以使用事先分配足够多内存单元方式降低申请和释放的开销,但事先分配内存单元的缺点是我们并不确定我们将要使用的内存单元大小,如果频繁需求的内存大小远远小于事先分配的内存单元,则会造成内存单元的巨大浪费,同时如果事先分配太多内存到内存池,当用户没有频繁的内存请求时会造成系统和应用程序也不能使用此部分内存,同样造成内存的浪费。并且,在实际开发中经常会出现的内存重复释放,内存越界,内存越界的问题,从而导致服务器不稳定,崩溃,定位困难。
发明内容
本发明的目的在于提供一种内存池管理方法,以提高内存的分配性能并同时判断内存的合法性。
为了达到上述目的,本发明提供了一种内存池管理方法,包括:将内存池划分为多个大小不同的次级内存池,各个次级内存池按照不同的对齐长度对应不同的内存链表;
根据需要的内存空间的大小选择次级内存池,按照与所选择的次级内存池对应的对齐长度分配内存;
在分配的内存空间前加一头结构,所述头结构用于记录所述分配的内存空间的大小以及使用状态。
优选的,在上述的内存池管理方法中,将所述内存池划分为三个大小不同的次级内存池,分别为:第一次级内存池、第二次级内存池和第三次级内存池,所述第一次级内存池的空间小于所述第二次级内存池,所述第二次级内存池小于所述第三次级内存池。
优选的,在上述的内存池管理方法中,当需要的内存空间小于等于第一阈值时,选择所述第一次级内存池;当需要的内存空间大于所述第一阈值且小于等于第二阈值时,选择所述第二次级内存池;当需要的内存空间大于所述第二阈值时,选择所述第三次级内存池。
优选的,在上述的内存池管理方法中,所述第一次级内存池的对齐长度为16字节的自然数倍数。
优选的,在上述的内存池管理方法中,所述第一次级内存池的对齐长度为16字节。
优选的,在上述的内存池管理方法中,所述第二次级内存池的对齐长度为128字节的自然数倍数。
优选的,在上述的内存池管理方法中,所述第二次级内存池的对齐长度为128字节。
优选的,在上述的内存池管理方法中,所述头结构包括第一头结构和第二头结构,所述第一头结构用于记录所述分配的内存空间的大小,所述第二头结构用于记录所述分配的内存空间的使用状态。
优选的,在上述的内存池管理方法中,所述第一头结构分配有4个字节。
优选的,在上述的内存池管理方法中,所述第二头结构分配有1个字节,当所述分配的内存空间在使用中时,所述第二头结构中的值设置为1;当所述分配的内存空间被释放后,所述第二头结构中的值设置为0。
在本发明提供的内存池管理方法中,将内存池划分为多个大小不同的次级内存池,各个次级内存池按照不同的对齐长度对应不同的内存链表。每个链表都是独立线程安全的,同步颗粒更小,相应减少了同步,提高了分配性能。根据需要的内存空间的大小选择次级内存池,按照与所选择的次级内存池对应的对齐长度分配内存,并在分配的内存空间前加一用于记录所述分配的内存空间的大小以及使用状态的头结构,并通过所述头结构中的值来判断内存使用的合法性,生成调用堆栈,并记录日志,便于分析和定位问题代码。
附图说明
图1为本发明实施例中内存池管理方法的流程图。
具体实施方式
下面将结合示意图对本发明的具体实施方式进行更详细的描述。根据下列描述和权利要求书,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。
本发明实施例提供了一种内存池管理方法,具体的,如图1所示,包括以下步骤:
S1:将内存池划分为多个大小不同的次级内存池,各个次级内存池按照不同的对齐长度对应不同的内存链表。
在本实施例中,将所述内存池划分为三个大小不同的次级内存池,分别为:第一次级内存池、第二次级内存池和第三次级内存池,所述第一次级内存池的空间小于所述第二次级内存池,所述第二次级内存池小于所述第三次级内存池。
所述第一次级内存池的对齐长度为16字节的自然数倍数。较优的,所述第一次级内存池的对齐长度为16字节。当然在本本发明的其他实施例中,所述第一次级内存池的对齐长度还可以是32字节、48字节或者64字节,但是考虑到在实际应用过程中,对齐长度过长会造成资源浪费,因此在本实施例中所述第一次级内存池的对齐长度选择16字节。
所述第二次级内存池的对齐长度为128字节的自然数倍数。较优的,所述第二次级内存池的对齐长度为128字节。在本发明的其他实施例中,所述第二次级内存池的对齐长度还可以设置为其他长度,但是避免资源浪费,在本实施例中所述第二次级内存池的对齐长度选择128字节。
所述第三次级内存池不设置对齐长度,也就是说,在所述第三次级内存池中按照实际需要分配内存。
S2:根据需要的内存空间的大小选择次级内存池,按照与所选择的次级内存池对应的对齐长度分配内存。
具体的,当需要的内存空间小于等于第一阈值时,选择所述第一次级内存池;当需要的内存空间大于所述第一阈值且小于等于第二阈值时,选择所述第二次级内存池;当需要的内存空间大于所述第二阈值时,选择所述第三次级内存池。
在本实施例中,所述第一阈值为20KB,当所需要的内存空间小于等于20KB时,将按照所述第一次级内存池的对齐长度16字节来分配内存。所述对齐长度是指在分配内存时每次分配的最小长度。例如,当需要的内存空间为12字节时,为其分配16字节的空间。当需要的内存空间为16字节时,为其分配的空间也是16字节。当需要的内存空间为29字节时,则为其分配2个16字节长度的空间,即32字节的空间。
所述第二阈值为1MB。当所需要的内存空间大于20KB时且小于等于1M时,以所述第二次级内存池的对齐长度128字节来分配内存。
具体的,当需要的内存空间为20KB时,仍然以16字节的对齐长度为其分配空间,即为其分配多个16字节长度的空间,使所分配的内存空间满足需要。但是当需要的内存空间为(20KB+1B)时,则按照128字节的对齐长度为其分配空间,即为其分配多个128字节长度的空间,使所分配的内存空间满足需要。
当需要的内存空间大于1M时,按照需要分配内存空间。例如,当需要的内存空间为2M时,直接为其分配2M的内存空间。
在本实施例中所述第一阈值为20KB,所述第二阈值为1MB,在本发明的其他实施例中,所述第一阈值和第二阈值并不限制于此,可以根据实际应用的需要,灵活的设置所述第一阈值和第二阈值,例如,可以将所述第一阈值设置为2KB、3KB或者4KB等。第二阈值设置为8KB、1.5MB、2MB或者其他值。在此不再赘述。
S3:在分配的内存空间前加一头结构,所述头结构用于记录所述分配的内存空间的大小以及使用状态。
具体的,所述头结构包括第一头结构和第二头结构,所述第一头结构分配有4个字节,用于记录所述分配的内存空间的大小。所述第二头结构分配有1个字节,用于记录所述分配的内存空间的使用状态。当所述分配的内存空间在使用中时,所述第二头结构中的值设置为1;当所述分配的内存空间被释放后,所述第二头结构中的值设置为0。通过判断所述第二头结构中的数值,可以高效定位对于已归还内存的重复释放。
进一步的,在所述分配的内存空间的尾部加一尾部结构,所述尾部结构也用于记录所述分配的内存空间的大小。所述尾部结构分配有4个字节。当将所述分配的内存空间归还时,通过比较所述第一头结构和尾部结构中的值判断是否发生内存越界。
具体的,当所述第一头结构中的数值与所述尾部结构中的数值相同时,则说明内存没有越界,当所述第一头结构中的数值与所述尾部结构中的数值不相同时,则说明内存越界了。当内存越界时,通过打印详细调用堆栈的方式,通过对内存申请堆栈的分析,可以定位内存越界位置,即可以快速定位错误发生的代码位置。
以需要19字节的内存空间为例具体的介绍内存池的管理方法。首先,19字节<20KB,因此,选择所述第一次级内存池,以16字节为对齐长度分配内存空间,即为其分配32字节的内存空间。
其次,通过所述第一次级内存池的最大空间值除以对齐的分配大小,获取所述分配的32字节的内存空间在所述第一次级内存池中所对应的池链表索引ID,即以所述第一阈值20KB除以32字节(20K/32)以获取其在所述第一内存池中所对应的池链表索引ID。
最后,在分配的32字节的内存空间的头部加一头结构,尾部加一尾部结构。所述头结构为5字节,其中第一头结构为4字节,用于描述所述分配的32字节的内存空间的大小,即为32。所述第二头结构为1字节,用于描述所述分配的32字节的内存空间的使用状态,即为1。当所述分配的32字节的内存空间被释放时,所述第二头结构中的值为0。
所述尾部结构也为4个字节,用于描述所述分配的32字节的内存空间的大小。当所述尾部结构中的数值也为32时,则没有发生内存越界,当所述尾部结构中的数值大于32时,则说明发生内存越界,需要查找发生内存越界的位置。可以通过打印详细调用堆栈的方式,通过对内存申请堆栈的分析,定位内存越界位置。
综上,在本发明实施例提供的内存池管理方法中,将内存池划分为多个大小不同的次级内存池,各个次级内存池按照不同的对齐长度对应不同的内存链表。每个链表都是独立线程安全的,同步颗粒更小,相应减少了同步,提高了分配性能。根据需要的内存空间的大小选择次级内存池,按照与所选择的次级内存池对应的对齐长度分配内存,并在分配的内存空间前加一用于记录所述分配的内存空间的大小以及使用状态的头结构,并通过所述头结构中的值来判断内存使用的合法性,生成调用堆栈,并记录日志,便于分析和定位问题代码。
上述仅为本发明的优选实施例而已,并不对本发明起到任何限制作用。任何所属技术领域的技术人员,在不脱离本发明的技术方案的范围内,对本发明揭露的技术方案和技术内容做任何形式的等同替换或修改等变动,均属未脱离本发明的技术方案的内容,仍属于本发明的保护范围之内。
Claims (9)
1.一种内存池管理方法,其特征在于,包括:
将内存池划分为多个大小不同的次级内存池,各个次级内存池按照不同的对齐长度对应不同的内存链表;
根据需要的内存空间的大小选择次级内存池,按照与所选择的次级内存池对应的对齐长度分配内存;
在分配的内存空间前加一头结构,所述头结构用于记录所述分配的内存空间的大小以及使用状态;所述头结构包括第一头结构和第二头结构,所述第一头结构用于记录所述分配的内存空间的大小,所述第二头结构用于记录所述分配的内存空间的使用状态;
在分配的内存空间的尾部加一尾部结构,所述尾部结构也用于记录所述分配的内存空间的大小以及使用状态;
当所述尾部结构中的数值大于所述第一头结构中的数值时,则说明发生内存越界。
2.如权利要求1所述的内存池管理方法,其特征在于,将所述内存池划分为三个大小不同的次级内存池,分别为:第一次级内存池、第二次级内存池和第三次级内存池,所述第一次级内存池的空间小于所述第二次级内存池,所述第二次级内存池小于所述第三次级内存池。
3.如权利要求2所述的内存池管理方法,其特征在于,当需要的内存空间小于等于第一阈值时,选择所述第一次级内存池;当需要的内存空间大于所述第一阈值且小于等于第二阈值时,选择所述第二次级内存池;当需要的内存空间大于所述第二阈值时,选择所述第三次级内存池。
4.如权利要求2所述的内存池管理方法,其特征在于,所述第一次级内存池的对齐长度为16字节的自然数倍数。
5.如权利要求4所述的内存池管理方法,其特征在于,所述第一次级内存池的对齐长度为16字节。
6.如权利要求2所述的内存池管理方法,其特征在于,所述第二次级内存池的对齐长度为128字节的自然数倍数。
7.如权利要求6所述的内存池管理方法,其特征在于,所述第二次级内存池的对齐长度为128字节。
8.如权利要求1所述的内存池管理方法,其特征在于,所述第一头结构分配有4个字节。
9.如权利要求1所述的内存池管理方法,其特征在于,所述第二头结构分配有1个字节,当所述分配的内存空间在使用中时,所述第二头结构中的值设置为1;当所述分配的内存空间被释放后,所述第二头结构中的值设置为0。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510882301.6A CN105528304B (zh) | 2015-12-03 | 2015-12-03 | 内存池管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510882301.6A CN105528304B (zh) | 2015-12-03 | 2015-12-03 | 内存池管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105528304A CN105528304A (zh) | 2016-04-27 |
CN105528304B true CN105528304B (zh) | 2019-04-16 |
Family
ID=55770545
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510882301.6A Active CN105528304B (zh) | 2015-12-03 | 2015-12-03 | 内存池管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105528304B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107168890B (zh) * | 2017-04-01 | 2021-03-19 | 杭州联吉技术有限公司 | 一种内存池的管理方法和装置 |
CN108255608B (zh) * | 2018-01-10 | 2020-07-31 | 武汉斗鱼网络科技有限公司 | 一种内存池的管理方法 |
CN112631821A (zh) * | 2021-01-28 | 2021-04-09 | 长沙景嘉微电子股份有限公司 | 内存故障检测定位方法、装置、计算机设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1635482A (zh) * | 2003-12-29 | 2005-07-06 | 北京中视联数字系统有限公司 | 一种嵌入式系统内存管理的方法 |
CN101414281A (zh) * | 2007-10-19 | 2009-04-22 | 大唐移动通信设备有限公司 | 一种内存管理方法及系统 |
CN103838859A (zh) * | 2014-03-19 | 2014-06-04 | 厦门雅迅网络股份有限公司 | 一种减少linux下多进程间数据拷贝的方法 |
US8862560B1 (en) * | 2010-06-21 | 2014-10-14 | Emc Corporation | Compression system pause and auto-resume |
-
2015
- 2015-12-03 CN CN201510882301.6A patent/CN105528304B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1635482A (zh) * | 2003-12-29 | 2005-07-06 | 北京中视联数字系统有限公司 | 一种嵌入式系统内存管理的方法 |
CN101414281A (zh) * | 2007-10-19 | 2009-04-22 | 大唐移动通信设备有限公司 | 一种内存管理方法及系统 |
US8862560B1 (en) * | 2010-06-21 | 2014-10-14 | Emc Corporation | Compression system pause and auto-resume |
CN103838859A (zh) * | 2014-03-19 | 2014-06-04 | 厦门雅迅网络股份有限公司 | 一种减少linux下多进程间数据拷贝的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105528304A (zh) | 2016-04-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101799773B (zh) | 并行计算的内存访问方法 | |
CN105528304B (zh) | 内存池管理方法 | |
CN103838859B (zh) | 一种减少linux下多进程间数据拷贝的方法 | |
US7908454B2 (en) | Application-specific heap management | |
CN103034544B (zh) | 一种用户态与内核态共享内存的管理方法和装置 | |
CN106649857A (zh) | 一种基于读写分离的数据库操作方法及装置 | |
CN108334396A (zh) | 一种数据处理方法和装置、资源组的创建方法和装置 | |
US10073648B2 (en) | Repartitioning data in a distributed computing system | |
CN108519917A (zh) | 一种资源池分配方法和装置 | |
CN108829523A (zh) | 内存资源分配方法、装置、电子设备及可读存储介质 | |
CN110515706A (zh) | 一种请求处理方法、装置、设备及可读存储介质 | |
CN112000287A (zh) | 一种io请求处理装置、方法、设备及可读存储介质 | |
CN110727517A (zh) | 一种基于分区设计的内存分配方法和装置 | |
CN105718319A (zh) | 一种内存池版图解析方法和内存池装置 | |
CN101226553A (zh) | 一种嵌入式数据库变长字段存储的实现方法及装置 | |
CN106155917A (zh) | 内存管理方法及装置 | |
CN107832151A (zh) | 一种cpu资源分配方法、装置及设备 | |
CN110334069A (zh) | 多进程间的数据共享方法及相关装置 | |
CN112685333A (zh) | 一种堆内存管理方法及装置 | |
CN105320676A (zh) | 一种客户数据查询服务方法及装置 | |
CN101727503A (zh) | 一种创建磁盘文件系统的方法 | |
CN104115127B (zh) | 存储系统和数据管理方法 | |
US20170193006A1 (en) | Distributed file system and method of creating files effectively | |
CN106855845A (zh) | 堆空间的内存分配管理系统及嵌入式芯片 | |
CN111797497A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |