CN110895512A - 一种内存管理方法 - Google Patents
一种内存管理方法 Download PDFInfo
- Publication number
- CN110895512A CN110895512A CN201811066251.4A CN201811066251A CN110895512A CN 110895512 A CN110895512 A CN 110895512A CN 201811066251 A CN201811066251 A CN 201811066251A CN 110895512 A CN110895512 A CN 110895512A
- Authority
- CN
- China
- Prior art keywords
- memory
- bucket
- size
- subscript
- bktidx
- 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.)
- Pending
Links
Images
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/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
Abstract
本申请公开了一种内存管理方法,包括:设置内存的配置文件,所述内存的配置文件中包括至少一个桶bucket的配置信息,每个bucket中存放大小相同的内存片;初始化用于进行内存寻址的Map数组,所述Map数组的第m个元素的取值对应内存片大小大于或者等于且最接近m*2base的bucket的下标i;其中,m和i从0开始计数;当需要分配内存时,根据所需内存大小确定对应的Map数组的下标mapIdx,并根据Map数组的第mapIdx个元素的取值确定bucket的下标bktIdx,在所确定的下标为bktIdx的bucket中进行内存分配。应用本申请公开的技术方案,能够提高内存分配的效率,减少内存碎片。
Description
技术领域
本申请涉及内存管理技术领域,特别涉及一种内存管理方法。
背景技术
通常,应用程序使用内存时都是通过调用系统的内存分配和释放函数,而在C语言编程中,我们习惯直接使用malloc、free函数来申请、释放内存。这样做的缺点在于:由于所申请内存块的大小不确定,当频繁使用时会造成大量的内存碎片,进而降低性能。
malloc函数是C语言中用于在程序运行时在堆中进行动态内存分配的库函数。free函数是C语言中用于进行内存释放的库函数。
malloc函数实际分配的内存将大于我们需要的内存大小,这主要由两方面因素决定:
1、字节对齐:字节对齐将对齐到机器最受限的类型(具体的实现因机器而异)。
2、块头部信息:每个空闲块都有“头部”控制信息,其中包含一个指向链表中下一个块的指针、当前块的大小和一个指向本身的指针。
下面简要说明现有malloc/free实现过程:
1、空闲存储空间以空闲链表的方式组织(地址递增),每个块包含一个长度域、一个指向下一块的指针,如图1所示。
2、当有申请内存空间的请求时,malloc函数将扫描空闲链表,直到找到一个足够大的块为止(首次适应),因此,每次调用malloc函数时所花费的时间并不完全相同。
3、如果该块的尺寸恰好与请求的大小相符,则将其从链表中移走并返回给用户;如果该块的尺寸太大,则将其分为两部分,尾部的部分返回给用户,剩下的部分留在空闲链表中,并更改该块的头部信息。
4、当释放内存空间时,首先搜索空闲链表,找到可以插入被释放块的合适位置。如果与被释放块相邻的两边中的任何一边是一个空闲块,则将被释放块与其相邻的该空闲块合为一个更大的块,以减少内存碎片。
如前所述,使用malloc函数和free函数进行内存申请和释放的缺点在于:由于所申请内存块的大小不确定,当频繁使用时会造成大量的内存碎片,进而降低性能。
并且,malloc函数和free函数分配和释放的是堆(stack)的内存,但是,又没有内存使用的统计信息,而使用系统命令ps或者top查看的是整个程序使用内存的情况,没有单独查询堆内存的统计信息入口。而且,现有技术对整个程序使用内存的情况进行的统计也过于笼统,无法进行内存的特点分析,无法查看内存使用的细节。
在C程序设计中,内存操作相关的错误非常常见,同时也是非常隐蔽的一类错误。这类错误往往导致程序不明原因地崩溃、耗尽系统资源,或是形成严重的安全弱点。现有技术很难检测这类错误,并且发生错误时也很难进行定位。
发明内容
本申请提供了一种应用程序的内存管理方法,以提高内存分配的效率,减少内存碎片。
本申请公开了一种内存管理方法,包括:
设置内存的配置文件,所述内存的配置文件中包括至少一个桶bucket的配置信息,每个bucket中存放大小相同的内存片;所述配置信息包括:bucket的基本内存片的大小、各个bucket中内存片的大小、各个bucket中内存片的数量;其中:
所述bucket的基本内存片的大小为2base,base为大于1的整数;
所述各个bucket中内存片的大小为2base的整数倍;
初始化用于进行内存寻址的Map数组,所述Map数组的第m个元素的取值分别对应内存片大小大于或者等于且最接近m*2base的bucket的下标i;其中,m和i从0开始计数;
当需要分配内存时,根据所需内存大小确定对应的Map数组的下标mapIdx,并根据Map数组的第mapIdx个元素的取值确定bucket的下标bktIdx,在所确定的下标为bktIdx的bucket中进行内存分配。
较佳的,所述根据所需内存大小确定对应的Map数组的下标mapIdx包括:
计算所需内存大小对2base的模,或者对所需内存大小进行右移base位,得到mapIdx。
较佳的,所述在所确定的下标为bktIdx的bucket中进行内存分配包括:
判断下标为bktIdx的bucket中的内存大小是否满足所需内存大小;
如果满足,将下标为bktIdx的bucket中的下一个可用内存地址分配使用;
否则,将下标为bktIdx+1的bucket中的下一个可用内存地址分配使用。
较佳的,该方法还包括:
设置管理信息对所述各个bucket的使用情况进行管理,所述管理信息包括:各个bucket中内存片的大小、数量、下一个可用内存地址的指针、内存分配成功的次数、内存分配失败的次数、当前已分配的内存的数量。
较佳的,所述内存的配置文件中还包括堆heap的配置信息,所述heap的配置信息包括:heap的大小。
较佳的,该方法还包括:设置管理信息对所述heap的使用情况进行管理,所述管理信息包括:heap的大小、下一个可用内存地址的指针、内存分配成功的次数、内存分配失败的次数、当前剩余的内存空间大小。
由上述技术方案可见,本申请提供的内存管理方法,通过预先申请分配一定数量的内存块,内存块的大小通过配置进行计算,按照配置的内存大小和数量进行管理小块内存,采用bucket的方式进行管理,避免了大量小内存碎片的出现,从而达到了减少内存碎片的目的。此外,本申请提供的内存寻址算法简洁高效,其寻址速度不随内存的规模变化而变化。
本申请提供的方案中,内存的大小、内存块的分布都是可配的。在上述方案的基础上,为实现更为方便的内存管理,本申请还提供了查看内存使用的统计功能。通过查看内存使用的统计信息反过来可以调整配置文件的参数。并且,由于整个内存大小是预先限定的,结合本申请提供的精细的统计信息,可以为判断内存泄漏提供定位手段。
此外,本申请可根据应用程序的类型、特点,通过配置文件调整内存池的配置,而不需要重新编译程序,极大地提高了效率。
附图说明
图1为空闲存储空间中块的示意图;
图2为本发明内存管理方法的流程示意图;
图3为本发明方案的配置文件示意图;
图4为本发明方案中bucket和Map的映射关系示意图;
图5为本发明方案的内存空间管理的管理信息示意图;
图6为本发明方案应用的逻辑结构图。
具体实施方式
为使本申请的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本申请作进一步详细说明。
为解决现有技术所存在的问题,本申请提出一种如图2所示的内存管理方法,该方法包括:
步骤201:设置内存的配置文件,所述内存的配置文件中包括至少一个桶(bucket)的配置信息。其中,每个bucket中存放大小相同的内存片,各个bucket各自的内存片大小不相同;所述配置信息包括:bucket中基本内存片的大小、各个bucket中内存片的大小、各个bucket中内存片的数量;其中:
所述bucket中基本内存片的大小为2base,base为大于1的整数;根据CPU的位数对齐要求,2base须为4的整数倍;
所述各个bucket中内存片的大小为2base的整数倍。
步骤202:初始化用于进行内存寻址的Map数组,所述Map数组的第m个元素的取值分别对应内存片大小大于或者等于且最接近m*2base的bucket的下标i;其中,m和i均从0开始计数。
步骤203:当需要分配内存时,根据所需内存大小确定对应的Map数组的下标mapIdx,并根据Map数组的第mapIdx个元素的取值确定bucket的下标bktIdx,在所确定的下标为bktIdx的bucket中进行内存分配。
上述步骤201和步骤202之间可以没有明确的先后次序之分。
对于上述步骤201,内存的配置文件中还可以包括堆(heap)的配置信息,所述heap的配置信息包括:heap的大小。一种内存的配置文件的示意如图3所示,该示例性配置文件中设置了以下配置信息:
bucket中基本内存片的大小bktBaseSize为16Byte,即2base=16,base=4;
heap的总大小heapSize为60MB;
bucket[0]中内存片的大小bucket[0].bktSize=64Byte;
bucket[0]中内存片的数量bucket[0].bktNumBlks=2000;
bucket[1]中内存片的大小bucket[1].bktSize=128Byte;
bucket[1]中内存片的数量bucket[1].bktNumBlks=1000;
bucket[2]中内存片的大小bucket[2].bktSize=256Byte;
bucket[2]中内存片的数量bucket[2].bktNumBlks=250;
bucket[3]中内存片的大小bucket[3].bktSize=512Byte;
bucket[3]中内存片的数量bucket[3].bktNumBlks=125。
可以按照应用程序的特征配置上述各个bucket的内存片的大小,并且,bucket和heap可以同时存在,并单独进行配置。对heap中内存的分配和释放,可以按照系统内存分配算法(malloc、free)实现。
上述步骤202是关于初始化Map数组。本申请中,Map数组是所需内存大小和满足其大小需求的内存所在bucket的映射表数组。参见图4举一示例对Map数组与bucket的对应关系进行说明:
假设bucket[i].bktSize=m*2base,bucket[i+1].bktSize=n*2base,m<n;
则在设置Map数组时,将Map[m].bktIdx的取值置为i;
将Map[m+1].bktIdx、……Map[n-1].bktIdx、Map[n].bktIdx的取值均置为i+1;
从而,在后续根据所需内存大小按照Map数组进行寻址时,对于所需内存大小在m*2base以内的内存可以在bucket[i]中分配,对于所需内存大小在(m*2base,n*2base]范围内的内存可以在bucket[i+1]中分配。
上述步骤203中,根据所需内存大小确定对应的Map数组的下标mapIdx的具体方法包括:计算所需内存大小对2base的模,或者对所需内存大小进行右移base位,即可得到mapIdx。
上述步骤203中,在所确定的下标为bktIdx的bucket中进行内存分配包括:
判断下标为bktIdx的bucket中的内存大小是否满足所需内存大小;
如果满足,将下标为bktIdx的bucket中的下一个可用内存地址分配使用;
否则,将下标为bktIdx+1的bucket中的下一个可用内存地址分配使用。
在上述方法的基础上,本申请还可以进一步提供关于内存的使用情况的统计信息,具体的实现方法为:
设置管理信息对所述各个bucket的使用情况进行管理,其中,所述管理信息可以包括:各个bucket中内存片的大小、数量、下一个可用内存地址的指针、内存分配成功的次数、内存分配失败的次数、当前已分配的内存的数量。
此外,还可以设置管理信息对heap的使用情况进行管理,其中,所述管理信息可以包括:heap的大小、下一个可用内存地址的指针、内存分配成功的次数、内存分配失败的次数、当前剩余的内存空间大小。
在具体实现时,可以另外开辟一片内存用于存储上述的管理信息。
以上内存空间管理的管理信息示例如图5所示。通过提供细化的内存使用情况管理信息(也可称之为统计信息),能够帮助分析应用程序对内存的需求情况,程序消耗内存的分布特点等,通过查看内存使用的统计信息反过来可以调整配置文件的参数。并且,由于整个内存大小是预先限定的,并提供精细的统计信息,为判断内存泄漏提供了定位手段。
本发明提出的以上内存管理方法通过提供灵活的可伸缩的可配置的配置文件对内存进行管理,在程序启动时通过读取配置文件初始化内存,使得不需要重新编译程序,就可以改变程序内存的配置,降低了方案的复杂度,并大大缩短了改变内存所需的时间。
由上述方案可见,本发明通过预先申请分配一定数量的大块内存块,按照配置分成bucket管理空间和heap管理空间。本申请对于小块内存采用bucket的方式进行管理,每个bucket中管理的内存由相同大小的内存片组成,并以链表方式进行管理。这样可以尽可能在反复分配、释放内存块时,避免每次都对内存块进行分割。而分割内存块将产生大量的小内存碎片,犹如一堆散沙,以后很难将这些散沙与其余内存结合起来。
此外,本发明提出的高效的寻址算法,其寻址速度不随内存的规模变化而变化。该算法在bucket内存寻址中使用,通过bktBaseSize参数设置最小的内存片大小,该大小必须是2的base指数倍,记为2base,每个bucket的内存片的大小都是bktBaseSize的整数倍。本发明寻址算法由Map数组来支持,具体而言:
当需要寻找内存大小为memSize的内存时,首先将memSize右移base位,得到数值mapIdx,取Map数组下标为mapIdx的映射的bucket下标bktIdx;然后,判断下标为bktIdx的bucket中的内存大小是否满足需要,满足即摘取下一个可用内存地址,不满足则取下标为bktIdx+1的bucket的下一个可用内存地址。整个寻址过程所需的步骤是固定的,不随内存规模的增大而增加。
图6为本发明方案应用的逻辑结构图,参见图6,包括:
第1步:根据应用程序的特点配置内存的配置文件。
第2步:启动应用程序。
第3步:读取内存的配置文件。
第4步:按照配置文件初始化内存。
第5步:应用程序根据需要分配/释放内存。
第6步:运行一段时间后,查询内存使用统计信息,判断内存的配置是否合理,如果合理,则继续执行,否则,返回第1步,调整内存配置文件。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
Claims (6)
1.一种内存管理方法,其特征在于,包括:
设置内存的配置文件,所述内存的配置文件中包括至少一个桶bucket的配置信息,每个bucket中存放大小相同的内存片;所述配置信息包括:bucket的基本内存片的大小、各个bucket中内存片的大小、各个bucket中内存片的数量;其中:
所述bucket的基本内存片的大小为2base,base为大于1的整数;
所述各个bucket中内存片的大小为2base的整数倍;
初始化用于进行内存寻址的Map数组,所述Map数组的第m个元素的取值分别对应内存片大小大于或者等于且最接近m*2base的bucket的下标i;其中,m和i从0开始计数;
当需要分配内存时,根据所需内存大小确定对应的Map数组的下标mapIdx,并根据Map数组的第mapIdx个元素的取值确定bucket的下标bktIdx,在所确定的下标为bktIdx的bucket中进行内存分配。
2.根据权利要求1所述的方法,其特征在于,所述根据所需内存大小确定对应的Map数组的下标mapIdx包括:
计算所需内存大小对2base的模,或者对所需内存大小进行右移base位,得到mapIdx。
3.根据权利要求1或2所述的方法,其特征在于,所述在所确定的下标为bktIdx的bucket中进行内存分配包括:
判断下标为bktIdx的bucket中的内存大小是否满足所需内存大小;
如果满足,将下标为bktIdx的bucket中的下一个可用内存地址分配使用;
否则,将下标为bktIdx+1的bucket中的下一个可用内存地址分配使用。
4.根据权利要求1或2所述的方法,其特征在于,该方法还包括:
设置管理信息对所述各个bucket的使用情况进行管理,所述管理信息包括:各个bucket中内存片的大小、数量、下一个可用内存地址的指针、内存分配成功的次数、内存分配失败的次数、当前已分配的内存的数量。
5.根据权利要求1或2所述的方法,其特征在于:
所述内存的配置文件中还包括堆heap的配置信息,所述heap的配置信息包括:heap的大小。
6.根据权利要求5所述的方法,其特征在于,该方法还包括:
设置管理信息对所述heap的使用情况进行管理,所述管理信息包括:heap的大小、下一个可用内存地址的指针、内存分配成功的次数、内存分配失败的次数、当前剩余的内存空间大小。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811066251.4A CN110895512A (zh) | 2018-09-13 | 2018-09-13 | 一种内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811066251.4A CN110895512A (zh) | 2018-09-13 | 2018-09-13 | 一种内存管理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110895512A true CN110895512A (zh) | 2020-03-20 |
Family
ID=69785376
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811066251.4A Pending CN110895512A (zh) | 2018-09-13 | 2018-09-13 | 一种内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110895512A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113268349A (zh) * | 2021-06-04 | 2021-08-17 | 科东(广州)软件科技有限公司 | 一种计算机内存管理方法、装置、设备及存储介质 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5687377A (en) * | 1995-10-06 | 1997-11-11 | Electronic Data Systems Corporation | Method for storing variables in a programming language |
CN101697131A (zh) * | 2009-11-04 | 2010-04-21 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
US7818729B1 (en) * | 2003-09-15 | 2010-10-19 | Thomas Plum | Automated safe secure techniques for eliminating undefined behavior in computer software |
CN102043659A (zh) * | 2010-12-08 | 2011-05-04 | 上海交通大学 | 消除内存访问冲突的编译装置及其实现方法 |
CN103150257A (zh) * | 2013-02-28 | 2013-06-12 | 天脉聚源(北京)传媒科技有限公司 | 一种内存管理方法和装置 |
US9542118B1 (en) * | 2014-09-09 | 2017-01-10 | Radian Memory Systems, Inc. | Expositive flash memory control |
CN106681829A (zh) * | 2016-12-09 | 2017-05-17 | 上海斐讯数据通信技术有限公司 | 一种内存管理方法及系统 |
CN107203477A (zh) * | 2017-06-16 | 2017-09-26 | 深圳市万普拉斯科技有限公司 | 内存分配方法、装置、电子设备及可读存储介质 |
-
2018
- 2018-09-13 CN CN201811066251.4A patent/CN110895512A/zh active Pending
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5687377A (en) * | 1995-10-06 | 1997-11-11 | Electronic Data Systems Corporation | Method for storing variables in a programming language |
US7818729B1 (en) * | 2003-09-15 | 2010-10-19 | Thomas Plum | Automated safe secure techniques for eliminating undefined behavior in computer software |
CN101697131A (zh) * | 2009-11-04 | 2010-04-21 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
CN102043659A (zh) * | 2010-12-08 | 2011-05-04 | 上海交通大学 | 消除内存访问冲突的编译装置及其实现方法 |
CN103150257A (zh) * | 2013-02-28 | 2013-06-12 | 天脉聚源(北京)传媒科技有限公司 | 一种内存管理方法和装置 |
US9542118B1 (en) * | 2014-09-09 | 2017-01-10 | Radian Memory Systems, Inc. | Expositive flash memory control |
CN106681829A (zh) * | 2016-12-09 | 2017-05-17 | 上海斐讯数据通信技术有限公司 | 一种内存管理方法及系统 |
CN107203477A (zh) * | 2017-06-16 | 2017-09-26 | 深圳市万普拉斯科技有限公司 | 内存分配方法、装置、电子设备及可读存储介质 |
Non-Patent Citations (1)
Title |
---|
李明: "多核路由器动态内存分配器的设计与实现", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113268349A (zh) * | 2021-06-04 | 2021-08-17 | 科东(广州)软件科技有限公司 | 一种计算机内存管理方法、装置、设备及存储介质 |
CN113268349B (zh) * | 2021-06-04 | 2022-02-18 | 科东(广州)软件科技有限公司 | 一种计算机内存管理方法、装置、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5784699A (en) | Dynamic memory allocation in a computer using a bit map index | |
US10409526B2 (en) | Adaptive garbage collection | |
US7480782B2 (en) | Reference-updating using per-chunk referenced-address ranges in a compacting garbage collector | |
US9170885B2 (en) | Independent management of data and parity logical block addresses | |
US11249664B2 (en) | File system metadata decoding for optimizing flash translation layer operations | |
US9535628B2 (en) | Memory system with shared file system | |
CN105389264B (zh) | 存储系统中垃圾收集的方法和系统 | |
US6742078B1 (en) | Management, data link structure and calculating method for flash memory | |
US20120317377A1 (en) | Dual flash translation layer | |
US11237756B2 (en) | System and method of writing to nonvolatile memory using write buffers | |
US20050149686A1 (en) | Method and apparatus for dynamic incremental defragmentation of memory | |
CN103608782A (zh) | Lsb页面和msb页面中的选择性数据存储 | |
CN111159061A (zh) | 存储设备、存储设备的操作方法和控制存储设备的主机的操作方法 | |
US20140281132A1 (en) | Method and system for ram cache coalescing | |
CN112558868B (zh) | 一种配置数据存储的方法和装置及设备 | |
CN115599544A (zh) | 内存管理方法、装置、计算机设备及存储介质 | |
US11327939B2 (en) | Method and device for indexing dirty data in storage system page | |
CN110895512A (zh) | 一种内存管理方法 | |
US11287997B2 (en) | Method, electronic device and computer program product for managing disk array | |
US7792880B2 (en) | Method and apparatus for efficient implementation of discontiguous objects | |
US7159094B1 (en) | Kernel memory defragmentation method and apparatus | |
CN111813708B (zh) | 用于存储装置的块映射系统和方法 | |
CN113535392A (zh) | 基于cma实现支持大内存连续分配的内存管理方法及系统 | |
CN102693325B (zh) | 一种文件存储方法和装置 | |
US9747226B2 (en) | Packet processing system, method and device to optimize packet buffer space |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
AD01 | Patent right deemed abandoned | ||
AD01 | Patent right deemed abandoned |
Effective date of abandoning: 20220405 |