CN102012870B - 内存分配方法 - Google Patents

内存分配方法 Download PDF

Info

Publication number
CN102012870B
CN102012870B CN2010105501179A CN201010550117A CN102012870B CN 102012870 B CN102012870 B CN 102012870B CN 2010105501179 A CN2010105501179 A CN 2010105501179A CN 201010550117 A CN201010550117 A CN 201010550117A CN 102012870 B CN102012870 B CN 102012870B
Authority
CN
China
Prior art keywords
length
memory
node
location
blank
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
Application number
CN2010105501179A
Other languages
English (en)
Other versions
CN102012870A (zh
Inventor
胡事民
阎栋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tsinghua University
Original Assignee
Tsinghua University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tsinghua University filed Critical Tsinghua University
Priority to CN2010105501179A priority Critical patent/CN102012870B/zh
Publication of CN102012870A publication Critical patent/CN102012870A/zh
Application granted granted Critical
Publication of CN102012870B publication Critical patent/CN102012870B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Memory System (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种内存分配方法。所述方法包括步骤S1:对所要管理的内存建立并初始化线段树结构;S2:内核或应用程序申请内存;S3:线段树回收内核或应用释放的内存。采用线段树的方式进行物理内存管理,能够保证所提供的内存地址是物理连续的,且可高效地申请特定物理地址的内存进行分配而不会影响整体的性能,克服了普通内存管理方法的易于产生内存碎片,效率不高,无法保证物理地址连续等缺点。

Description

内存分配方法
技术领域
本发明涉及计算机科学技术领域,特别涉及一种内存分配方法。
背景技术
随着计算机硬件制造技术的不断发展,市场上不仅出现了速度更快容量更大的内存,越来越多的应用也依赖于操作系统对内存的良好管理才能发挥作用。伴随着操作系统从单用户单任务发展到多任务多用户,内存管理也从最早的固定区域内存划分(即现在的嵌入式系统中的内存池管理方法)发展到内存管理单元(Memory ManagementUnit,MMU)出现之后所支持的段页式的内存管理,再到虚拟内存的概念,内存管理不断提供更强更灵活的服务给用户。
在基于段页式的的内存分配方法中无论是较为早期的buddy算法还是基于buddy的slab算法,都是将内存划分为事先约定好的2的幂次方大小的内存块,以此为基础再进行内存的分配和回收。而用户通常所申请的内存区域往往并不是2的幂次方,这样就不可避免的产生大量的块内碎片,从而降低了内存的使用效率。另一方面在有些应用场景下,用户可能希望系统分配指定地址的内存,而buddy和slab限于所使用的内存组织方式很难提供这样的服务。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题是:如何提出一种内存分配方法解决传统内存管理方法所存在容易产生碎片和无法分配指定区域内存的问题。
(二)技术方案
为解决上述技术问题,本发明提供了一种内存分配方法,包括以下步骤:
S1:将内存划分为固定大小的内存块,为所述内存建立一棵线段树,所述线段树的叶节点对应所述固定大小的内存块,从内存起始位开始,以每两个相邻叶节点为子节点依次创建一个内部节点,以相邻两个内部节点为子节点创建上一层内部节点,依次向上递归直到创建出一个根节点,所述每个节点记录如下信息,并在分配时初始化所述信息:
所述节点对应的内存区域的起始和终止端点:start和end;
所述节点对应的内存区域内最大连续空闲内存的长度max_blank_length和其起始位置location;
所述节点对应的内存区域内由起始端点向右的最长连续空闲内存长度left_blank_length,由终止端点向左的最长连续空闲内存长度right_blank_length;
S2:响应内核或是应用程序申请内存的请求,根据所述线段树分配申请的内存;
S3:根据所述线段树回收内核或是应用程序释放的内存。
其中,所述步骤S1具体包括:
统计所述内存的长度;
根节点的start和end分别为所述内存的起始位置和终止位置,初始情况下默认整个内存区域全部为空闲状态,max_blank_length为内存区域的长度,location等于start,left_blank_length等于right_blank_length等于max_blank_length;
自顶向下,根据每个节点的父节点信息及本身所在左子树或右子树,采用递归方式初始化每个节点的start、end、max_blank_length、location、left_blank_length和right_blank_length,至叶子节点为止。
其中,所述步骤S2具体包括:
查找根节点的所述信息,若申请的内存区域长度mem_length大于根节点的max_blank_length返回错误信息,否则,返回根节点中的location,记为start_location,则要申请的内存区域为[start_location,start_location+mem_length);
从根节点开始依次向下递归处理上一步得到的[start_location,start_location+mem_length),若start_location=start且start_location+mem_length=end,当前节点所对应的内存区域就是所要处理的区间,则当前节点的start和end不变,max_blank_length置零location置-1代表此节点所对应的内存区域已经全部都被分配,left_blank_length和right_blank_length也均置零;
若start_location>start或start_location+mem_length<end两个条件中有至少一个成立则将[start_location,location+mem_length)拆分为[start_location,start_location+(start+end)/2)和[start_location+(start+end)/2,start_location+mem_length)分别交由左子节点和右子节点处理,直到递归到叶子节点对应的内存为止;
由叶节点开始自底向上,更新每个节点的所述信息,由节点更新过的子节点更新节点本身的信息,最终到根节点为止,max_length取左子节点中的max_length、右子节点中的max_length及左子节点的right_blank_length加右子节点的left_blank_length之和三者中的最大值,location取三者中最大值的内存区域所对应的location,left_blank_length更新为左子节点的left_blank_length,right_blank_length更新为右子节点的right_blank_length。
其中,所述固定大小的内存块为256B~64KB。
其中,所述固定大小的内存块为4KB。
(三)有益效果
本发明通过将内存划分为指定大小的内存块,并建立和内存块对应的线段树来分配和回收内存,避免了内存碎片的产生,并能高效地实现指定内存区域的分配。
附图说明
图1是本发明实施例的一种内存分配方法流程图;
图2是本发明实施例的内存分配方法中建立的线段树示意图;
图3是本发明实施例的内存分配方法中内存某一分配状态示意图;
图4是根据图2中线段树进行非指定区域分配内存的示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
如图1所示,本发明实施例的一种内存分配方法流程图,包含内存的分配和回收,具体包括:
步骤S101,获得内存信息,即将管理的内存划分为固定大小的内存块,并为所述内存建立一棵线段树。线段树的叶节点对应所述固定大小的内存块,从内存起始位开始,以每两个相邻叶节点为子节点依次创建一个内部节点,以相邻两个内部节点为子节点创建上一层内部节点,依次向上递归直到创建出一个根节点。由此看出,树中的每个节点代表一段指定的内存区间,除叶子节点外每个节点均有两个子节点,分别代表此节点的左子区间和右子区间,根节点代表被线段树所管理的整个内存区间。叶子节点为线段树所管理内存的最细粒度,即固定内存块的大小,一般为256B~8KB。由于在实际的实现中,线段树的每个节点本身需要耗费一定的空间来存储其所管理内存区域的统计信息,因此若叶子节点的管理粒度细至每个Byte,则整个树的空间耗费会比其所管理的内存区间还大,出于实际情况的考虑,同内存的分页机制相结合,每个叶子节点代表的固定内存块为一个内存页大小,即4KB,是较为合适的管理粒度。如图2所示,示出了一棵长为16(16×4KB)的线段树,每个叶子节点对应的内存区域为4KB。以管理采用32位地址的从0x00000000起始的长度为512M的内存为例。512M共有217个页,每页对应一个叶子节点,则需要217个叶子节点。每两个相邻的叶子节点作为一个管理两个页的内部节点的孩子,而每两个管理两个页的内部节点作为管理四个页的内部节点的孩子,依次向上递归直到根节点,可知共217-1个内部节点。
每个节点记录如下信息,并在分配时进行初始化所述信息:
所述节点对应的内存区域的起始和终止端点:start和end;
所述节点对应的内存区域内最大连续空闲内存的长度max_blank_length和其起始位置location;
所述节点对应的内存区域内由起始端点向右的最长连续空闲内存长度left_blank_length,由终止端点向左的最长连续空闲内存长度right_blank_length。
在创建和初始化的同时分配线段树自己占用的内存,因为存储线段树的数据结构本身需要占用一定的内存,这里默认线段树自身所占用的内存也是为自己所管理的,故需事先分配。
步骤S102,在内存分配和释放前,需要初始化线段树。其步骤为:
统计所述内存的长度,(遵循左闭右开的表示方式,包括已分配给线段树的内存区域的长度);
根节点的start和end分别为所述内存的起始位置和终止位置,初始情况下默认整个内存区域全部为空闲状态,max_blank_length为内存区域的长度,location等于start,left_blank_length等于right_blank_length等于max_blank_length;
自顶向下,根据每个节点的父节点信息及本身所在左子树或右子树,采用递归方式初始化每个节点的start、end、max_blank_length、location、left_blank_length和right_blank_length,至叶子节点为止。
如图3所示,设有节点node其代表从[0x0000ff00,0x00010000)这么一段内存,其中黑色代表已经被分配,白色代表空闲。则:
start=0x0000ff00,
end=0x00010000,
max_blank_length=0x60,
location=0x40,
left_blank_length=0x0000ff20-0x0000ff00=0x20,
right_blank_length=0x00010000-0x0000ffe0=0x20。
步骤S103,响应内核或是应用程序申请内存的请求,根据所述线段树分配申请的内存,图4示出了内存区间[3,10)分配示意图。查找根节点的所述信息,若申请的内存区域长度mem_length大于根节点的max_blank_length返回错误信息,否则,返回根节点中的location,记为start_location,则要申请的内存区域为[start_location,start_location+mem_length)。
从根节点开始依次向下递归处理上一步得到的[start_location,start_location+mem_length),若start_location=start且start_location+mem_length=end,当前节点所对应的内存区域就是所要处理的区间,则当前节点的start和end不变,max_blank_length置零location置-1代表此节点所对应的内存区域已经全部都被分配,left_blank_length和right_blank_length也均置零。
若start_location>start或start_location+mem_length<end两个条件中有至少一个成立则将[start_location,location+mem_length)拆分为[start_location,start_location+(start+end)/2)和[start_location+(start+end)/2,start_location+mem_length)分别交由左子节点和右子节点处理,直到递归到叶子节点对应的内存为止。
若要分配指定区域的内存,设其为[request_start,request_end),只需在上述的分配操作中将[start_location,start_location+mem_length)替换为[request_start,request_end)即可,所有操作均相同。
步骤S104,由叶节点开始自底向上,更新每个节点的所述信息,由节点更新过的子节点更新节点本身的信息,最终到根节点为止,max_length取左子节点中的max_length、右子节点中的max_length及左子节点的right_blank_length加右子节点的left_blank_length之和三者中的最大值,location取三者中最大值的内存区域所对应的location,left_blank_length更新为左子节点的left_blank_length,right_blank_length更新为右子节点的right_blank_length。
步骤S105,向返回用户所申请的地址。
根据所述线段树回收内核或是应用程序释放的内存,其回收过程与分配过程为完全对称的操作,包括:
步骤S106,合并相邻的空闲内存区域,即将释放后相邻的两个或多个内存区域合并为一个内存区域。
步骤S107,更新线段树,其更新过程和S104相似,只是具体应用中数值的不同。
采用上述的内存分配和回收方式,内存各个段的使用情况被统计在一棵二维的静态树形结构中,这样便可将一维区间上的操作分解为在二维树状结构上的操作,从而提高了内存分配及回收过程中查询和修改操作的效率。具体来看,在一段区间上的操作,如采用普通的线性数据组织方式则查询耗费为O(1),维护耗费为O(n)。而把数据组织为线段树形结构,则可使查询与维护的耗费取得一个平衡,使查询和耗费均为O(log2M)。M为所操作区间的长度。
以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。

Claims (3)

1.一种内存分配方法,其特征在于,包括以下步骤:
S1:将内存划分为固定大小的内存块,为所述内存建立一棵线段树,所述线段树的叶节点对应所述固定大小的内存块,从内存起始位开始,以每两个相邻叶节点为子节点依次创建一个内部节点,以相邻两个内部节点为子节点创建上一层内部节点,依次向上递归直到创建出一个根节点,每个节点记录如下信息,并在分配时初始化所述信息:
所述节点对应的内存区域的起始和终止端点:start和end;
所述节点对应的内存区域内最大连续空闲内存的长度max_blank_length和其起始位置location;
所述节点对应的内存区域内由起始端点向右的最长连续空闲内存长度left_blank_length,由终止端点向左的最长连续空闲内存长度right_blank_length;该步骤具体包括:
统计所述内存的长度;
根节点的start和end分别为所述内存的起始位置和终止位置,初始情况下默认整个内存区域全部为空闲状态,max_blank_length为内存区域的长度,location等于start,left_blank_length等于right_blank_length等于max_blank_length;
自顶向下,根据每个节点的父节点信息及本身所在左子树或右子树,采用递归方式初始化每个节点的start、end、max_blank_length、location、left_blank_length和right_blank_length,至叶子节点为止;
S2:响应内核或是应用程序申请内存的请求,根据所述线段树分配申请的内存,具体包括:
查找根节点的所述信息,若申请的内存区域长度mem_length大于根节点的max_blank_length返回错误信息,否则,返回根节点中的location,记为start_location,则要申请的内存区域为[start_location,start_location+mem_length);
从根节点开始依次向下递归处理上一步得到的[start_location,start_location+mem_length),若start_location=start且start_location+mem_length=end,当前节点所对应的内存区域就是所要处理的区间,则当前节点的start和end不变,max_blank_length置零location置-1代表此节点所对应的内存区域已经全部都被分配,left_blank_length和right_blank_length也均置零;
若start_location>start或start_location+mem_length<end两个条件中有至少一个成立则将[start_location,location+mem_length)拆分为[start_location,start_location+(start+end)/2)和[start_location+(start+end)/2,start_location+mem_length)分别交由左子节点和右子节点处理,直到递归到叶子节点对应的内存为止;
由叶节点开始自底向上,更新每个节点的所述信息,由节点更新过的子节点更新节点本身的信息,最终到根节点为止,max_length取左子节点中的max_length、右子节点中的max_length及左子节点的right_blank_length加右子节点的left_blank_length之和三者中的最大值,location取三者中最大值的内存区域所对应的location,left_blank_length更新为左子节点的left_blank_length,right_blank_length更新为右子节点的right_blank_length;
S3:根据所述线段树回收内核或是应用程序释放的内存,释放过程是和分配过程为完全对称的操作,包括:合并相邻的空闲内存区域,即将释放后相邻的两个或多个内存区域合并为一个内存区域,更新线段树。
2.如权利要求1所述的内存分配方法,其特征在于,所述固定大小的内存块为256B~8KB。
3.如权利要求2所述的内存分配方法,其特征在于,所述固定大小的内存块为4KB。
CN2010105501179A 2010-11-18 2010-11-18 内存分配方法 Active CN102012870B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2010105501179A CN102012870B (zh) 2010-11-18 2010-11-18 内存分配方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2010105501179A CN102012870B (zh) 2010-11-18 2010-11-18 内存分配方法

Publications (2)

Publication Number Publication Date
CN102012870A CN102012870A (zh) 2011-04-13
CN102012870B true CN102012870B (zh) 2012-05-23

Family

ID=43843045

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2010105501179A Active CN102012870B (zh) 2010-11-18 2010-11-18 内存分配方法

Country Status (1)

Country Link
CN (1) CN102012870B (zh)

Families Citing this family (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102591789B (zh) * 2011-12-26 2014-11-05 华为数字技术(成都)有限公司 存储空间回收方法及装置
CN106294189B (zh) * 2015-05-25 2020-09-25 中兴通讯股份有限公司 内存碎片整理方法及装置
US10397365B2 (en) 2015-11-06 2019-08-27 International Business Machines Corporation Method to reduce reactivation time of cloud based services
CN107133182A (zh) * 2016-02-29 2017-09-05 北大方正集团有限公司 一种内存管理方法及装置
CN105957011B (zh) * 2016-05-25 2019-05-21 北京小米移动软件有限公司 图片处理方法及装置
CN106446178A (zh) * 2016-09-23 2017-02-22 南京航空航天大学 磁盘区间树批量更新方法
CN108446178A (zh) * 2018-03-05 2018-08-24 北京小米移动软件有限公司 优化卡顿的方法及装置
CN108647150A (zh) * 2018-04-14 2018-10-12 温州职业技术学院 一种内存管理方法及系统
CN108874684B (zh) * 2018-05-31 2021-05-28 北京领芯迅飞科技有限公司 拆分cache缓存的nvdimm接口数据读写装置
CN109710542B (zh) * 2018-12-28 2021-03-16 北京像素软件科技股份有限公司 一种满n叉树构建方法及装置
CN110704214B (zh) * 2019-10-14 2021-05-25 北京京东乾石科技有限公司 进程间通信方法和装置
WO2021233187A1 (zh) * 2020-05-18 2021-11-25 中科寒武纪科技股份有限公司 一种在存储器中为数据分配存储地址的方法和设备
CN111857575A (zh) * 2020-06-24 2020-10-30 国汽(北京)智能网联汽车研究院有限公司 计算平台内存空间确定方法、装置、设备及存储介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7225186B2 (en) * 2004-03-26 2007-05-29 Kyocera Wireless Corp. Binary search tree system and method
US7392257B2 (en) * 2004-11-30 2008-06-24 Intel Corporation Incorporating structural information into an extensible markup language document
CN100468410C (zh) * 2007-06-27 2009-03-11 腾讯科技(深圳)有限公司 一种构建内存树的方法及系统
CN101763308B (zh) * 2009-12-25 2012-02-22 中国科学院计算技术研究所 在运行时对堆数据进行池分配的方法

Also Published As

Publication number Publication date
CN102012870A (zh) 2011-04-13

Similar Documents

Publication Publication Date Title
CN102012870B (zh) 内存分配方法
CN102999369B (zh) 虚拟机升级的方法及装置
EP2455865B1 (en) Memory management device
Rao et al. Performance issues of heterogeneous hadoop clusters in cloud computing
CN102779072B (zh) 一种嵌入式系统及其应用进程的休眠与唤醒方法
CN105245523B (zh) 应用于桌面虚拟化场景的存储服务平台及其实现方法
CN105187512A (zh) 一种虚拟机集群负载均衡方法及系统
CN101968755B (zh) 一种自适应应用负载变化的快照生成方法
CN102982505A (zh) 虚拟gpu
CN102707900A (zh) 虚拟盘存储技术
CN102246152A (zh) 保存程序执行状态
CN103503376A (zh) 云计算系统和管理云计算系统中存储资源的方法
CN101420459B (zh) 一种管理应用配置信息的方法、应用系统和存储设备
CN109144406B (zh) 分布式存储系统中元数据存储方法、系统及存储介质
CN103248696B (zh) 一种云计算环境下的虚拟资源动态配置方法
CN104572242A (zh) 一种扩展虚拟机磁盘空间的方法、装置及虚拟机系统
CN108064377A (zh) 一种多系统共享内存的管理方法及装置
Liang et al. Memory-aware resource management algorithm for low-energy cloud data centers
TW201805815A (zh) 固態儲存器容量管理系統與方法
WO2023071576A1 (zh) 容器集群构建方法及系统
CN110162396A (zh) 内存回收方法、装置、系统和存储介质
CN104391736B (zh) 虚拟机的休眠模式设置方法和装置
CN101610197A (zh) 一种缓冲区管理方法及其系统
CN101419560B (zh) 一种基于可扩展固件接口的操作系统切换方法
CN105469173A (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