CN109947560A - 一种内存管理方法 - Google Patents
一种内存管理方法 Download PDFInfo
- Publication number
- CN109947560A CN109947560A CN201910136177.7A CN201910136177A CN109947560A CN 109947560 A CN109947560 A CN 109947560A CN 201910136177 A CN201910136177 A CN 201910136177A CN 109947560 A CN109947560 A CN 109947560A
- Authority
- CN
- China
- Prior art keywords
- memory
- gear area
- memory size
- size
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 19
- 230000011218 segmentation Effects 0.000 abstract description 4
- 238000009826 distribution Methods 0.000 description 8
- 238000007726 management method Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 3
- 238000013467 fragmentation Methods 0.000 description 3
- 238000006062 fragmentation reaction Methods 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 238000005520 cutting process Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000007599 discharging Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000001105 regulatory effect Effects 0.000 description 1
- 238000003860 storage Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Landscapes
- Computer And Data Communications (AREA)
Abstract
一种内存管理方法,包括内存分配步骤,具体地,将系统内存按照内存大小从低到高的等级分割成N个档位区;在N个档位区中,选择与需申请的内存大小相近且大于等于申请的内存大小的档位区作为预档位区;从预档位区开始至最高档位区逐级寻找,寻找到某个档位区中出现空闲节点则停止寻找并把向相应的档位区作为所申请内存区,若没有出现空闲节点,则申请失败;判断所申请内存区是否需要分割,所申请内存区的内存大小减去数据内存大小得到剩余内存大小,若剩余内存大小小于最低档位区的内存大小,则不分割,否则需分割;若需分割时,在N个档位区空闲链表中选择与剩余内存大小相近而且小于等于剩余内存大小的空闲链表挂入。本发明可加快内存分配速度。
Description
技术领域
本发明涉及一种内存管理方法。
背景技术
现有网络协议栈的内存分配技术一般有两类,一类是使用的是通用内存分配技术,没有针对其特殊性做优化,一类是使用网络协议栈专业内存分配技术。现有的通用内存分配技术,大多数是通过初始化的时候在内存块的起始地址处建立一个内存控制块称为mcb,把内存块的地址以及大小等信息填到mcb里面,再建立一个数据结构用于管理内存控制块的称为bufmgr,bufmgr里面有两个链表,一个称为空闲链表,用于把空闲的内存控制块串联起来,另一个称为已分配链表,用于把已经分配出去的内存控制块串联起来,在内存管理初始化完成了之后,系统中只存在一个mcb,并且其在bufmgr的空闲链表中。在需要分配内存的时候,系统会遍历bufmgr的空闲链表,比较mcb中的内存的大小是否大于需要分配的大小,若大于,则把mcb从空闲链表中取出,切出所需内存,再把剩余的插回空闲链表,把其加入到bufmgr的空闲链表中去;若不大于,则继续找链表中的下一个节点,直到找到大于的节点为止,若找不到,则内存分配失败。在释放内存的时候,需要遍历整个已分配的链表,找到用户所释放的内存所在节点控制块mcb,把其从已分配链表中移除,并且在空闲链表控制块中寻找其内存地址相邻的控制块,若找不到,则直接把其加入到空闲链表中,若找到,则把相邻的控制块合并成一块大内存后才加入到空闲链表中。这是目前使用的最普遍的内存分配算法。
另一类就是有些网络协议栈会内存分配做一些优化,比如,LWIP可以采用通用的分配方法,也就是上面的第一类方法,也可以使用内存池的分配方法,这点依赖于用户配置LWIP的方式,例如用户在头文件opt.h文件中定义LWIP_UDP为1,则在编译的时候与UDP类型内存池就会被建立;定义LWIP_TCP为1,则在编译的时候与TCP类型内存池就会被建立。另外,还有很多其他类型的内存池,如专门存放网络包数据信息的PBUF_POOL、还有上面讲解动态内存堆分配策略时提到的CUSTOM_POOLS等。某种类型的POOL其单个大小是固定的,而分配该类POOL的个数是可以用户配置的,用户应该根据协议栈实际使用状况进行配置。把协议栈中所有的POOL挨个放到一起,并把它们放在一片连续的内存区域,这呈现给用户的就是一个大的缓冲池。所以,所谓的缓冲池的内部组织应该是这样的:开始处放了A类型的POOL池a个,紧接着放上B类型的POOL池b个,再接着放上C类型的POOL池c个….直至最后N类型的POOL池n个。
根据以上可知,现有技术中通用内存管理方法主要存在以下的缺陷:
1.分配以及释放内存的时间不确定:在分配和释放内存的时候,需要遍历链表,也就意味着,当节点越多,遍历的时间就越长,内存分配的性能也就越差。
2.内存碎片化问题严重:随着系统的运行,频繁的分配和释放内存之后,内存的碎片化会越来越严重,最后可能导致的结果是,即使系统整体的内存是足够的,也无法满足连续内存的需求了。
而专用的内存分配方法在使用内存池分配技术的时候,每次都只能分配固定大小的内存池,这样会造成内存的极大的浪费。
发明内容
针对上述技术问题,本发明提供一种内存管理方法,包括内存分配步骤,具体步骤如下:
步骤1:将系统内存按照内存大小从低到高的等级分割成N个档位区;
步骤2:在N个档位区中,选择与需申请的内存大小相近且大于等于申请的内存大小的档位区作为预档位区;
步骤3:从预档位区开始至最高档位区逐级寻找,寻找到某个档位区中出现空闲节点则停止寻找并把向相应的档位区作为所申请内存区,若没有出现空闲节点,则申请失败;
步骤4:判断所申请内存区是否需要分割,所申请内存区的内存大小减去数据内存大小得到剩余内存大小,若剩余内存大小小于最低档位区的内存大小,则不分割,否则需分割;
步骤5:若需分割时,在N个档位区空闲链表中选择与剩余内存大小相近而且小于等于剩余内存大小的空闲链表挂入。
本发明的方法还包括内存释放的步骤,具体地,根据需要释放内存的位置,找寻需要释放内存的位置的相邻位置的内存是否为空闲状态,若为空闲状态,则将需要释放内存位置以及相邻位置内存大小进行叠加,叠加完后挂入N个档位区中合适的档位区空闲链表上。
有益效果:本发明相对于现有技术而言的好处:每次分配以及释放内存都是O(1)的算法复杂度,不需要遍历链表,加快内存分配的速度。再者减少内存碎片,通过每次释放时聚合,并且每次只能分配固定档位大小的内存,并且当某一块内存小于最小档位时就不能再进行切割这些措施能有效减少系统的内存碎片。
具体实施方式
下面对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明涉及一种内存管理方法,包括内存分配方法,内存分配方法包括以下步骤:
步骤1:将系统内存大小固定分成N个档位区,N个档位区中每一区均设置有一条空闲链表,N个档位区中按照存储内存大小从低到高的等级排列,例如:N个档位区内存大小分别为32、64、128、256、512、1024、2048、4096、8192个字节。
步骤2:根据需要申请的内存大小自动寻找预档位区,具体地,若N个档位区中其中一个的内存大小与需要申请的内存大小一致,则选择该档位区为预档位区,若N个档位区中没有一个的内存大小与需要申请的内存大小一致,则选择与需申请内存大小相近而且大于需申请内存大小的档位区作为预档位区,例如:用户申请56个字节大小的内存,但是我们没有56这个档,那么,系统就会自动调整为申请64个字节。
步骤3:申请合适的档位区,具体地,判断预档位区是否还有空闲节点,若有空闲节点,则选择预档位区为所需申请的档位区;若没有空闲节点,则判断比预档位区高一档位区是否有空闲节点,若有空闲节点,则选择该档位区为所需申请的档位区,若没有空闲节点,则判断比该档位区高一档位区是否有空闲节点,直到寻找到有空闲节点的档位区,而申请内存成功,若直到最高档位区均没有空闲节点,则申请内存失败,例如:步骤2中64个字节的档位区没有空闲节点,则判断128个字节的档位区是否有,128个字节的档位区也没有,则继续向更高档位区判断,直到某一个档位区有空闲节点,申请内存成功,若直到最高档位区均没有空闲节点,则申请内存失败。
步骤4:若申请内存成功后,判断是否需要对被申请档位区进行分割,具体地,当被申请档位区的内存大小减去需要申请内存大小得到剩余内存大小,若剩余内存大小小于最低档位区的内存大小,则无需分割;若剩余内存大小大于最低档位区的内存大小,根据剩余内存大小在N个档位区选择适合档位区的空闲链表挂入,当剩余内存大小等于N个档位区中其中一个档位区内存的大小,则选择该档位区的空闲链表挂入;当剩余内存大小与N个档位区中的内存大小都不相同,则选择剩余内存大小相近而且小于需剩余内存大小的档位区的空闲链表挂入,例如:需要在含有128个字节的档位区中申请内存大小为64个字节的内存,则需把128个字节切割成2个64个字节,其中一个被申请占用,另外一个则直接挂入具有64个字节档位区的空闲链表,再者,需要在含有256个字节的档位区中申请内存大小为64个字节的内存,则需把256个字节切割成1个64个字节以及一个192个字节,其中64个字节被申请占用,而192个字节挂入具有128个字节档位区的空闲链表。
步骤5:再次申请内存时,若申请到的档位区为剩余内存大小挂入的档位区时,会根据再次申请内存大小判断剩余内存大小是否再次分割,具体的分割步骤与步骤4的一样,当192个字节挂到128的字节的档位区时,例如再次申请128个字节大小的内存时,选择了192个字节挂到128的字节的档位区时,则会对192进行切割,把128个字节申请被占用,剩下64个字节挂入含有64个字节档位区空闲链表上。
本发明的方法还包括内存释放步骤,具体步骤如下:
根据需要释放内存的位置,找寻需要释放内存的位置的相邻位置的内存是否为空闲状态,若为空闲状态,则将需要释放内存位置以及相邻位置内存大小进行叠加,叠加完后挂入N个档位区中合适的档位区空闲链表上。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
Claims (2)
1.一种内存管理方法,包括内存分配步骤,具体步骤如下:
步骤1:将系统内存按照内存大小从低到高的等级排列分割成N个档位区;
步骤2:在N个档位区中,选择与需申请的内存大小相近且大于等于申请的内存大小的档位区作为预档位区;
步骤3:从预档位区开始至最高档位区逐级寻找,寻找到某个档位区中出现空闲节点则停止寻找并把向相应的档位区作为所申请内存区,若没有出现空闲节点,则申请失败;
步骤4:判断所申请内存区是否需要分割,所申请内存区的内存大小减去数据内存大小得到剩余内存大小,若剩余内存大小小于最低档位区的内存大小,则不分割,否则需分割;
步骤5:若需分割时,在N个档位区空闲链表中选择与剩余内存大小相近而且小于等于剩余内存大小的空闲链表挂入。
2.根据权利要求1所述的方法,其特征在于:还包括内存释放的步骤,具体地,根据需要释放内存的位置,找寻需要释放内存的位置的相邻位置的内存是否为空闲状态,若为空闲状态,则将需要释放内存位置以及相邻位置内存大小进行叠加,叠加完后挂入N个档位区中合适的档位区空闲链表上。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910136177.7A CN109947560A (zh) | 2019-02-25 | 2019-02-25 | 一种内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910136177.7A CN109947560A (zh) | 2019-02-25 | 2019-02-25 | 一种内存管理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109947560A true CN109947560A (zh) | 2019-06-28 |
Family
ID=67006781
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910136177.7A Pending CN109947560A (zh) | 2019-02-25 | 2019-02-25 | 一种内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109947560A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111338981A (zh) * | 2020-02-21 | 2020-06-26 | 深圳震有科技股份有限公司 | 一种内存防碎片方法、系统及储存介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1963788A (zh) * | 2005-11-08 | 2007-05-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
CN101149703A (zh) * | 2007-10-10 | 2008-03-26 | 中兴通讯股份有限公司 | 一种固定内存的管理方法 |
CN101266575A (zh) * | 2007-03-13 | 2008-09-17 | 中兴通讯股份有限公司 | 一种提高内存池利用率的方法 |
CN107153618A (zh) * | 2016-03-02 | 2017-09-12 | 阿里巴巴集团控股有限公司 | 一种内存分配的处理方法及装置 |
-
2019
- 2019-02-25 CN CN201910136177.7A patent/CN109947560A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1963788A (zh) * | 2005-11-08 | 2007-05-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
CN101266575A (zh) * | 2007-03-13 | 2008-09-17 | 中兴通讯股份有限公司 | 一种提高内存池利用率的方法 |
CN101149703A (zh) * | 2007-10-10 | 2008-03-26 | 中兴通讯股份有限公司 | 一种固定内存的管理方法 |
CN107153618A (zh) * | 2016-03-02 | 2017-09-12 | 阿里巴巴集团控股有限公司 | 一种内存分配的处理方法及装置 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111338981A (zh) * | 2020-02-21 | 2020-06-26 | 深圳震有科技股份有限公司 | 一种内存防碎片方法、系统及储存介质 |
CN111338981B (zh) * | 2020-02-21 | 2022-11-08 | 深圳震有科技股份有限公司 | 一种内存防碎片方法、系统及储存介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6757802B2 (en) | Method for memory heap and buddy system management for service aware networks | |
JP2571664B2 (ja) | コンピュータ主記憶域管理システムおよび方法 | |
US6760826B2 (en) | Store data in the system memory of a computing device | |
US5860082A (en) | Method and apparatus for allocating storage in a flash memory | |
CN1132112C (zh) | 用于保留资源的方法及计算机系统 | |
CN105095094B (zh) | 内存管理方法和设备 | |
CN101286878B (zh) | 一种终端的内存池的管理方法 | |
CN1996258A (zh) | 一种动态内存池的实现方法 | |
CN105718319B (zh) | 一种内存池版图解析方法和内存池装置 | |
CN110727517A (zh) | 一种基于分区设计的内存分配方法和装置 | |
CN112685333B (zh) | 一种堆内存管理方法及装置 | |
US20050268049A1 (en) | Dynamic memory management | |
CN109947560A (zh) | 一种内存管理方法 | |
CN101232450B (zh) | 数据分组处理设备 | |
CN110096225A (zh) | 针对网络设备中的分组处理指令表的存储器的动态分配 | |
CN110493060A (zh) | 一种虚拟ip分配方法及相关装置 | |
EP0844564B1 (en) | Memory manager system and method therefor | |
US20060236065A1 (en) | Method and system for variable dynamic memory management | |
CN102436355B (zh) | 一种数据传输方法、设备及系统 | |
US10061513B2 (en) | Packet processing system, method and device utilizing memory sharing | |
US6704851B2 (en) | Method of dynamically allocating a memory | |
CN100417077C (zh) | 一种静态动态结合的存储区管理的方法 | |
CN101976224B (zh) | 一种嵌入式系统的内存管理方法 | |
US5727185A (en) | Memory allocation method for allocating two logical store areas to a free store, that is one common physical store area of a computer | |
CN106201910A (zh) | 一种小块内存的管理方法和装置 |
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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190628 |
|
RJ01 | Rejection of invention patent application after publication |