CN107844372B - 一种内存分配的方法、系统 - Google Patents

一种内存分配的方法、系统 Download PDF

Info

Publication number
CN107844372B
CN107844372B CN201710967200.8A CN201710967200A CN107844372B CN 107844372 B CN107844372 B CN 107844372B CN 201710967200 A CN201710967200 A CN 201710967200A CN 107844372 B CN107844372 B CN 107844372B
Authority
CN
China
Prior art keywords
memory
node
binary tree
value
adapter
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
CN201710967200.8A
Other languages
English (en)
Other versions
CN107844372A (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.)
Guangdong Eflycloud Computing Co Ltd
Original Assignee
Guangdong Eflycloud Computing Co Ltd
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 Guangdong Eflycloud Computing Co Ltd filed Critical Guangdong Eflycloud Computing Co Ltd
Priority to CN201710967200.8A priority Critical patent/CN107844372B/zh
Publication of CN107844372A publication Critical patent/CN107844372A/zh
Application granted granted Critical
Publication of CN107844372B publication Critical patent/CN107844372B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation 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/5016Allocation 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System (AREA)
  • Techniques For Improving Reliability Of Storages (AREA)

Abstract

一种内存分配的方法、系统,包括适配器、二叉树和二维数组,包括适配器分配内存的过程:步骤A:适配器获取程序所申请的内存值,然后适配器从二叉树的根节点向下开始遍历,在节点中寻找可分配的所述内存块;步骤B:在节点中找到与内存值相同大小的可分配的内存块,以2的幂次方的形式分配给内存值;步骤C:在节点中找到大于内存值的可分配的内存块,以2的幂次方的形式分配给内存值;步骤D:遍历二维数组,统计未分配节点上的内存块,合并内存块,以2的幂次方的形式分配给内存值。本发明的一种内存分配的方法、系统,实现在内存分配中,提高内存复用率、减少内存碎片、避免浪费内存目的。

Description

一种内存分配的方法、系统
技术领域
本发明涉及计算机内存分配领域,尤其涉及一种内存分配的方法、系统。
背景技术
内存的分配在操作适配器中占有重要的地位,是操作适配器的核心。任何程序的执行,都必须在操作适配器中获得内存空间。内存是计算机中的重要资源,对于他们的资源分配和访问方式都直接影响到整个适配器的性能和效率。如何有效的管理、合理的分配内存资源,对于提升适配器性能,尤其是内存的使用效率和进程的运行速度显得尤为重要。
现有技术中常见的几种内存分配有以下4种,分别是首次适应算法、可变大小分配、连续内存分配和离散分配内存;首次适应算法即当申请内存时,适配器总是返回一个固定大小的内存空间,固定尺寸最明显的缺点就是不灵活。如果定长空间过小,则容易引起溢出,如果定长过大,又会造成内存的浪费;可变大小分配即适配器处理不同尺寸的分配请求,并分配合适大小的内存空间;连续内存分配主要优点是简介,额外开销也比较低,但是也会分配不同程度的内部碎片或者外部碎片;离散内存分配最大的有点就是有效避免了内存碎片的产生,提高内存资源利用率。但在程序运行过程中,若程序被分配在过多的不连续区域上,就要多次的地址校验,这就会降低了运行效率。
以上的几种内存分配算法都会存在大量的内存碎片,产生内存的浪费,内存分配没有达到理想效果,不连续的内存块无法进行合并。
发明内容
本发明的目的在于提出一种内存分配的方法、系统,以在内存分配中,实现提高内存复用率、减少内存碎片、避免浪费内存目的。
为达此目的,本发明采用以下技术方案:
一种内存分配的方法,包括适配器、二叉树和二维数组,所述二叉树的节点标记内存块的使用状态,所述二叉树分为x层,所述二叉树的根节点位于所述二叉树的第一层;所述二叉树的第y层上的每一个所述节点都存储有2^(x-y)大小的所述内存块,y大于零且小于等于x;所述二维数组存储有未分配节点的信息;
包括所述适配器分配内存的过程:
步骤A:所述适配器获取程序所申请的内存值,然后所述适配器从所述二叉树的根节点向下开始遍历,在所述节点中寻找可分配的所述内存块;
步骤B:在所述节点中寻找与所述内存值相同大小的可分配的所述内存块,若找到,则将找到的所述内存块分配给所述内存值,将该所述节点标记为已分配状态,并返回内存地址;
若找不到,则寻找比所述内存值大的可分配的所述内存块,将寻找到所述内存块分配给所述内存值,并将该所述节点标记为已分配状态,然后返回内存地址;
步骤C:最后将比所述内存值大的所述内存块分配后还剩下的所述内存块存储到所述未分配节点中,并将所述未分配节点在所述二叉树中的信息存储到所述二维数组中;
步骤D:若找不到与所述内存值相同或者比所述内存值大的可分配的所述内存块,则遍历所述二维数组,将所述未分配节点找出来,统计所有所述未分配节点上的所述内存块,若统计的所述内存块比所述内存值大,则将所述未分配节点上的所述内存块进行合并,然后再分配给所述内存值,并将合并的所述未分配节点标记为已分配状态,返回内存地址;
若统计的所述内存块比所述内存值小,则返回内存不足,请求分配失败的信息。
通过一个所述二叉树来监控和管理内存,所述二叉树的所述节点用于标记相应所述内存块的使用状态,高节点对应大的所述内存块,低节点对应小的所述内存块。比如二叉树一共有4层,即x为4,则所述二叉树的第一层存储着2^(4-1)大小的所述内存块,即所述内存块大小为8,以此类推,第二层、第三层和第四层的所述内存块大小分别为4、2和1。举例说明内存分配过程,假设现有一个二叉树,共4层,若要分配所述内存值为2的内存,则从根节点开始往下找,找到所述二叉树的第三层,然后将所述第三层中的一个节点上的内存块分配出去;若要分配内存值为5的内存,则找到存有比5大的内存块那一层,即第一层,将第一层上存有8内存的节点分配5内存出去,还剩下3内存,将这3内存存到所述二维数组中去;若我要分配内存值为6的内存,应该找第一层上的节点,由于第一层上的节点分配完了,找不到与6内存一样或者比6内存大的节点,但由于所述二维数组上存储着为所述分配节点的信息,遍历所述二维数组,二维数组中有一个2内存和一个4内存的节点,则将这两个节点合并起来,然后分配出去。
满足用户通过二叉树节点的结构进行内存块的查找,加快内存分配的查询,将多余分配出去得内存块回收加入到空闲节点当中,这样就能避免了内存的浪费,再将空闲的内存通过组合的方式分配出去,达到了减少内存碎片的效果。
优选的,包括所述适配器给与所述内存块相同或者大于所述内存块的所述内存值分配内存的过程:
步骤B1:所述适配器将所述内存值分解为2的最大次幂i加上一个余数;
步骤B2:判断所述余数是否不等于0,若所述余数等于0,则要分配的所述内存块大小为2的i次方,然后从所述二叉树的根节点向下开始遍历所述二叉树,寻找到存储有要分配的所述内存块的所述节点,并标记该所述节点为已分配状态,最后返回内存地址;
步骤B3:若所述余数不等于0,则要分配的内存块大小为2的(i+1)次方,然后从所述二叉树的根节点向下开始遍历所述二叉树,寻找到存储有要分配的所述内存块的的所述节点,并标记该所述节点为已分配状态,返回内存地址;
再将分配完还剩下的所述内存块从小到大的顺序以的幂次方拆分,添加到所述未分配节点中去,并将所述未分配节点在所述二叉树中的信息添加到所述二维数组中。
举例说明,假设有一个4层的二叉树,若要分配内存值为1的内存,则将1拆分为2的0次幂加0,即i和余数都为0,接着遍历二叉树,找到存有内存块为1的节点,分配内存并标记该内存;若要分配内存值为3的内存,则将3拆分为2的1次幂加上1,即i为1,余数为1,余数不等于0,则找存储有内存块大小为4的节点,即找的内存块大小为2^(i+1)=4的内存块,将3内存分配出去,剩下的1内存存储到所述未分配节点中去,并将该节点在二叉树中的信息存储到二维数组中。
由于内存都是以2的幂次方来定义大小的,因此通过2的幂次方的形式来分配内存,提升分配效率,将多余的内存回收存储,减少了内存碎片,将分配出去多余的内存块以2的幂次方进行拆分,将多个小的内存块重新分配到节点当中,避免了内存的浪费,提高内存的复用率。
优选的,包括了所述适配器给找不到与所述内存块相同或者大于所述内存块的所述内存值分配内存的过程:
步骤D1:当所述适配器找不到跟所述内存值相同或者大于所述内存值的所述内存块时,所述适配器便会遍历所述二维数组,从所述二维数组寻找是否有所述未分配节点的信息;
步骤D2:若找到所述二维数组中有所述未分配节点的信息,则将所有所述未分配节点上的所述内存块统计起来,判断一个或者多个所述未分配节点上的所述内存块的合并是否足够分配内存;
步骤D3:若足够分配内存则将所述未分配节点上的所述内存块合并起来并分配内存;若不足够分配内存,则返回内存不足,请求分配失败。
由于所述二维数组中存储着回收的小内存块,通过多个小内存块合并成大内存块,再分配出去,可以增加内存的复用率,减少内存的浪费。
优选的,所述二叉树的每一个所述节点都设置有索引n,所述索引n最小值为零,对应所述二叉树的根节点,后一个所述节点比前一个所述节点的索引n大1。
通过给节点设置索引,方便二维数组存储节点信息。
优选的,所述二维数组中设置有两个数组,第一个数组存储有所述二叉树的所述层数x,第二个数组存储有所述二叉树的所述节点的所述索引n;
包括了所述二维数组存储所述未分配节点的信息的过程:
步骤C1:所述适配器获取一个所述未分配节点在所述二叉树中的所述层数x,并将所述层数x存储到所述二维数组的第一个数组中;
步骤C2:接着所述适配器获取该已存好所述层数x的该所述未分配节点在所述二叉树中的所述索引n,并将所述索引n存储到所述二维数组的第二个数组中。
增加一个二维数组的映射关系,能够快速找到哪个节点拥有空闲的内存,将空闲的内存通过组合的方式分配出去,达到了减少内存碎片的效果。
一种内存分配方法的系统,包括适配器、二叉树和二维数组,所述二叉树的节点标记内存块的使用状态,所述二叉树分为x层,所述二叉树的根节点位于所述二叉树的第一层;所述二叉树的第y层上的每一个所述节点都存储有2^(x-y)大小的所述内存块,y大于零且小于等于x;所述二维数组存储有未分配节点的信息;
包括所述适配器分配内存模块,用于为操作系统分配内存;
步骤a:所述适配器获取程序所申请的内存值,然后所述适配器从所述二叉树的根节点向下开始遍历,在所述节点中寻找可分配的所述内存块5;
步骤b:在所述节点中寻找与所述内存值相同大小的所述内存块,若找到,则将找到的所述内存块分配给所述内存值,将该所述节点标记为已分配状态,并返回内存地址;
若找不到,则寻找比所述内存值大的所述内存块,将寻找到所述内存块分配给所述内存值,并将该所述节点标记为已分配状态,然后返回内存地址;
步骤c:最后将比所述内存值大的所述内存块分配后还剩下的所述内存块存储到所述未分配节点中,并将所述未分配节点在所述二叉树中的信息存储到所述二维数组中;
步骤d:若找不到跟所述内存值相同或者比所述内存值大的所述内存块,则遍历所述二维数组,将所述未分配节点找出来,统计所有所述未分配节点上的所述内存块,若统计的所述内存块比所述内存值大,则将所述未分配节点上的所述内存块进行合并,然后再分配给所述内存值,并将合并的所述未分配节点标记为已分配状态,返回内存地址;
若统计的所述内存块比所述内存值小,则返回内存不足,请求分配失败的信息。
优选的,包括所述适配器给与所述内存块相同或者大于所述内存块的所述内存值分配内存模块,用于所述适配器为大于或等于所述内存块5的所述内存值分配内存;
步骤b1:所述适配器将所述内存值分解为2的最大次幂i加上一个余数;
步骤b2:判断所述余数是否不等于0,若所述余数等于0,则要分配的所述内存块大小为2的i次方,然后从所述二叉树的根节点向下开始遍历所述二叉树,寻找到存储有要分配的所述内存块的所述节点,并标记该所述节点为已分配状态,最后返回内存地址;
步骤b3:若所述余数不等于0,则要分配的内存块大小为2的(i+1)次方,然后从所述二叉树的根节点向下开始遍历所述二叉树,寻找到存储有要分配的所述内存块的的所述节点,并标记该所述节点为已分配状态,返回内存地址;
再将分配完还剩下的所述内存块从小到大的顺序以的幂次方拆分,添加到所述未分配节点中去,并将所述未分配节点在所述二叉树中的信息添加到所述二维数组中。
优选的,包括所述适配器给找不到与所述内存块相同或者大于所述内存块的所述内存值分配内存模块,用于所述适配器为小于所述内存块的所述内存值分配内存;
步骤d1:当所述适配器找不到跟所述内存值相同或者大于所述内存值的所述内存块时,所述适配器便会遍历所述二维数组,从所述二维数组寻找是否有所述未分配节点的信息;
步骤d2::若找到所述二维数组中有所述未分配节点的信息,则将所有所述未分配节点上的所述内存块统计起来,判断一个或者多个所述未分配节点上的所述内存块的合并是否足够分配内存;
步骤d3:若足够分配内存则将所述未分配节点上的所述内存块合并起来并分配内存;若不足够分配内存,则返回内存不足,请求分配失败。
优选的,所述二叉树的每一个所述节点都设置有索引n,所述索引n最小值为零,对应所述二叉树的根节点,后一个所述节点比前一个所述节点的索引n大1。
优选的,所述二维数组中设置有两个数组,第一个数组存储有所述二叉树的所述层数x,第二个数组存储有所述二叉树的所述节点的所述索引n;
包括了所述二维数组存储所述未分配节点的信息模块,用于所述二维数组存储所述未分配节点的信息;
步骤c1:所述适配器获取一个所述未分配节点在所述二叉树中的所述层数x,并将所述层数x存储到所述二维数组的第一个数组中;
步骤c2:接着所述适配器获取该已存好所述层数x的该所述未分配节点在所述二叉树中的所述索引n,并将所述索引n存储到所述二维数组的第二个数组中。
附图说明
图1是本发明的内存分配流程图;
图2是本发明的适配器给与内存块相同或者大于所述内存块的内存值分配内存的流程图;
图3是本发明的适配器给找不到与内存块相同或者大于内存块的内存值分配内存的流程图;
图4是本发明的将未分配节点信息添加到二维数组中的流程图;
图5是本发明的举例说明的示意图。
其中:适配器1、二叉树2、二维数组3、节点4、内存块5、内存值6、未分配节点7、余数8、索引n、2的最大次幂i。
具体实施方式
下面结合附图并通过具体实施方式来进一步说明本发明的技术方案。
本实施例的一种内存分配的方法,包括适配器1、二叉树2和二维数组3,所述二叉树2的节点4标记内存块5的使用状态,所述二叉树2分为x层,所述二叉树2的根节点位于所述二叉树2的第一层;所述二叉树2的第y层上的每一个所述节点4都存储有2^(x-y)大小的所述内存块5,y大于零且小于等于x;所述二维数组3存储有未分配节点7的信息;
如图1所示,包括所述适配器1分配内存的过程:
步骤A:所述适配器1获取程序所申请的内存值6,然后所述适配器1从所述二叉树2的根节点向下开始遍历,在所述节点4中寻找可分配的所述内存块5;
步骤B:在所述节点4中寻找与所述内存值6相同大小的可分配的所述内存块5,若找到,则将找到的所述内存块5分配给所述内存值6,将该所述节点4标记为已分配状态,并返回内存地址;
若找不到,则寻找比所述内存值6大的可分配的所述内存块5,将寻找到所述内存块5分配给所述内存值6,并将该所述节点4标记为已分配状态,然后返回内存地址;
步骤C:最后将比所述内存值6大的所述内存块5分配后还剩下的所述内存块5存储到所述未分配节点7中,并将所述未分配节点7在所述二叉树2中的信息存储到所述二维数组3中;
步骤D:若找不到与所述内存值6相同或者比所述内存值6大的可分配的所述内存块5,则遍历所述二维数组3,将所述未分配节点7找出来,统计所有所述未分配节点7上的所述内存块5,若统计的所述内存块5比所述内存值6大,则将所述未分配节点7上的所述内存块5进行合并,然后再分配给所述内存值6,并将合并的所述未分配节点7标记为已分配状态,返回内存地址;
若统计的所述内存块5比所述内存值6小,则返回内存不足,请求分配失败的信息。
如图5所示,通过一个所述二叉树来监控和管理内存,所述二叉树的所述节点用于标记相应所述内存块的使用状态,高节点对应大的所述内存块,低节点对应小的所述内存块。比如二叉树一共有4层,即x为4,则所述二叉树的第一层存储着2^(4-1)大小的所述内存块,即所述内存块大小为8,以此类推,第二层、第三层和第四层的所述内存块大小分别为4、2和1。举例说明内存分配过程,假设现有一个二叉树,共4层,若要分配所述内存值为2的内存,则从根节点开始往下找,找到所述二叉树的第三层,然后将所述第三层中的一个节点上的内存块分配出去;若要分配内存值为5的内存,则找到存有比5大的内存块那一层,即第一层,将第一层上存有8内存的节点分配5内存出去,还剩下3内存,将这3内存存到所述二维数组中去;若我要分配内存值为6的内存,应该找第一层上的节点,由于第一层上的节点分配完了,找不到与6内存一样或者比6内存大的节点,但由于所述二维数组上存储着为所述分配节点的信息,遍历所述二维数组,二维数组中有一个2内存和一个4内存的节点,则将这两个节点合并起来,然后分配出去。
优选的,如图2所示,包括所述适配器1给与所述内存块5相同或者大于所述内存块5的所述内存值6分配内存的过程:
步骤B1:所述适配器1将所述内存值6分解为2的最大次幂i加上一个余数8;
步骤B2:判断所述余数8是否不等于0,若所述余数8等于0,则要分配的所述内存块5大小为2的i次方,然后从所述二叉树2的根节点向下开始遍历所述二叉树2,寻找到存储有要分配的所述内存块5的所述节点4,并标记该所述节点4为已分配状态,最后返回内存地址;
步骤B3:若所述余数8不等于0,则要分配的内存块5大小为2的(i+1)次方,然后从所述二叉树2的根节点向下开始遍历所述二叉树2,寻找到存储有要分配的所述内存块5的的所述节点4,并标记该所述节点4为已分配状态,返回内存地址;
再将分配完还剩下的所述内存块5从小到大的顺序以2的幂次方拆分,添加到所述未分配节点7中去,并将所述未分配节点7在所述二叉树2中的信息添加到所述二维数组3中。
优选的,如图3所示,包括了所述适配器1给找不到与所述内存块5相同或者大于所述内存块5的所述内存值6分配内存的过程:
步骤D1:当所述适配器1找不到跟所述内存值6相同或者大于所述内存值6的所述内存块5时,所述适配器1便会遍历所述二维数组3,从所述二维数组3寻找是否有所述未分配节点7的信息;
步骤D2::若找到所述二维数组3中有所述未分配节点7的信息,则将所有所述未分配节点7上的所述内存块5统计起来,判断一个或者多个所述未分配节点7上的所述内存块5的合并是否足够分配内存;
步骤D3:若足够分配内存则将所述未分配节点7上的所述内存块5合并起来并分配内存;若不足够分配内存,则返回内存不足,请求分配失败。
优选的,所述二叉树2的每一个所述节点4都设置有索引n,所述索引n最小值为零,对应所述二叉树2的根节点,后一个所述节点4比前一个所述节点4的索引n大1。
优选的,如图4所示,所述二维数组3中设置有两个数组,第一个数组存储有所述二叉树2的所述层数x,第二个数组存储有所述二叉树2的所述节点的所述索引n;
包括了所述二维数组3存储所述未分配节点7的信息的过程:
步骤C1:所述适配器1获取一个所述未分配节点7在所述二叉树2中的所述层数x,并将所述层数x存储到所述二维数组3的第一个数组中;
步骤C2:接着所述适配器1获取该已存好所述层数x的该所述未分配节点7在所述二叉树中的所述索引n,并将所述索引n存储到所述二维数组3的第二个数组中。
一种内存分配方法的系统,包括适配器1、二叉树2和二维数组3,所述二叉树2的节点4标记内存块5的使用状态,所述二叉树2分为x层,所述二叉树2的根节点位于所述二叉树2的第一层;所述二叉树2的第y层上的每一个所述节点4都存储有2^(x-y)大小的所述内存块5,y大于零且小于等于x;所述二维数组3存储有未分配节点7的信息;
包括所述适配器1分配内存模块,用于为操作系统分配内存;
步骤a:所述适配器1获取程序所申请的内存值6,然后所述适配器1从所述二叉树2的根节点向下开始遍历,在所述节点4中寻找可分配的所述内存块5;
步骤b:在所述节点4中寻找与所述内存值6相同大小的所述内存块5,若找到,则将找到的所述内存块5分配给所述内存值6,将该所述节点4标记为已分配状态,并返回内存地址;
若找不到,则寻找比所述内存值6大的所述内存块5,将寻找到所述内存块5分配给所述内存值6,并将该所述节点4标记为已分配状态,然后返回内存地址;
步骤c:最后将比所述内存值6大的所述内存块5分配后还剩下的所述内存块5存储到所述未分配节点7中,并将所述未分配节点7在所述二叉树2中的信息存储到所述二维数组3中;
步骤d:若找不到跟所述内存值6相同或者比所述内存值6大的所述内存块5,则遍历所述二维数组3,将所述未分配节点7找出来,统计所有所述未分配节点7上的所述内存块5,若统计的所述内存块5比所述内存值6大,则将所述未分配节点7上的所述内存块5进行合并,然后再分配给所述内存值6,并将合并的所述未分配节点7标记为已分配状态,返回内存地址;
若统计的所述内存块5比所述内存值6小,则返回内存不足,请求分配失败的信息。
优选的,包括所述适配器1给与所述内存块5相同或者大于所述内存块5的所述内存值6分配内存模块,用于所述适配器1为大于或等于所述内存块5的所述内存值6分配内存;
步骤b1:所述适配器1将所述内存值6分解为2的最大次幂i加上一个余数8;
步骤b2:判断所述余数8是否不等于0,若所述余数8等于0,则要分配的所述内存块5大小为2的i次方,然后从所述二叉树2的根节点向下开始遍历所述二叉树2,寻找到存储有要分配的所述内存块5的所述节点4,并标记该所述节点4为已分配状态,最后返回内存地址;
步骤b3:若所述余数8不等于0,则要分配的内存块5大小为2的(i+1)次方,然后从所述二叉树2的根节点向下开始遍历所述二叉树2,寻找到存储有要分配的所述内存块5的的所述节点4,并标记该所述节点4为已分配状态,返回内存地址;
再将分配完还剩下的所述内存块5从小到大的顺序以2的幂次方拆分,添加到所述未分配节点7中去,并将所述未分配节点7在所述二叉树2中的信息添加到所述二维数组3中。
优选的,包括所述适配器1给找不到与所述内存块5相同或者大于所述内存块5的所述内存值6分配内存模块,用于所述适配器1为小于所述内存块5的所述内存值6分配内存;
步骤d1:当所述适配器1找不到跟所述内存值6相同或者大于所述内存值6的所述内存块5时,所述适配器1便会遍历所述二维数组3,从所述二维数组3寻找是否有所述未分配节点7的信息;
步骤d2::若找到所述二维数组3中有所述未分配节点7的信息,则将所有所述未分配节点7上的所述内存块5统计起来,判断一个或者多个所述未分配节点7上的所述内存块5的合并是否足够分配内存;
步骤d3:若足够分配内存则将所述未分配节点7上的所述内存块5合并起来并分配内存;若不足够分配内存,则返回内存不足,请求分配失败。
优选的,所述二叉树2的每一个所述节点4都设置有索引n,所述索引n最小值为零,对应所述二叉树2的根节点,后一个所述节点4比前一个所述节点4的索引n大1。
优选的,所述二维数组3中设置有两个数组,第一个数组存储有所述二叉树2的所述层数x,第二个数组存储有所述二叉树2的所述节点的所述索引n;
包括了所述二维数组3存储所述未分配节点7的信息模块,用于所述二维数组3存储所述未分配节点7的信息;
步骤c1:所述适配器1获取一个所述未分配节点7在所述二叉树2中的所述层数x,并将所述层数x存储到所述二维数组3的第一个数组中;
步骤c2:接着所述适配器1获取该已存好所述层数x的该所述未分配节点7在所述二叉树中的所述索引n,并将所述索引n存储到所述二维数组3的第二个数组中。
以上结合具体实施例描述了本发明的技术原理。这些描述只是为了解释本发明的原理,而不能以任何方式解释为对本发明保护范围的限制。基于此处的解释,本领域的技术人员不需要付出创造性的劳动即可联想到本发明的其它具体实施方式,这些方式都将落入本发明的保护范围之内。

Claims (4)

1.一种内存分配的方法,包括适配器、二叉树和二维数组,所述二叉树的节点标记内存块的使用状态,所述二叉树分为x层,所述二叉树的根节点位于所述二叉树的第一层;所述二叉树的第y层上的每一个所述节点都存储有2^(x-y)大小的所述内存块,y大于零且小于等于x;所述二维数组存储有未分配节点的信息;
其特征在于:包括所述适配器分配内存的过程:
步骤A:所述适配器获取程序所申请的内存值,然后所述适配器从所述二叉树的根节点向下开始遍历,在所述节点中寻找可分配的所述内存块;
步骤B:在所述节点中寻找与所述内存值相同大小的可分配的所述内存块,若找到,则将找到的所述内存块分配给所述内存值,将该所述节点标记为已分配状态,并返回内存地址;
若找不到,则寻找比所述内存值大的可分配的所述内存块,将寻找到所述内存块分配给所述内存值,并将该所述节点标记为已分配状态,然后返回内存地址;
步骤C:最后将比所述内存值大的所述内存块分配后还剩下的所述内存块存储到所述未分配节点中,并将所述未分配节点在所述二叉树中的信息存储到所述二维数组中;
步骤D:若找不到与所述内存值相同或者比所述内存值大的可分配的所述内存块,则遍历所述二维数组,将所述未分配节点找出来,统计所有所述未分配节点上的所述内存块,若统计的所述内存块比所述内存值大,则将所述未分配节点上的所述内存块进行合并,然后再分配给所述内存值,并将合并的所述未分配节点标记为已分配状态,返回内存地址;
若统计的所述内存块比所述内存值小,则返回内存不足,请求分配失败的信息;
包括了所述适配器给找不到与所述内存块相同或者大于所述内存块的所述内存值分配内存的过程:
步骤D1:当所述适配器找不到跟所述内存值相同或者大于所述内存值的所述内存块时,所述适配器便会遍历所述二维数组,从所述二维数组寻找是否有所述未分配节点的信息;
步骤D2:若找到所述二维数组中有所述未分配节点的信息,则将所有所述未分配节点上的所述内存块统计起来,判断一个或者多个所述未分配节点上的所述内存块的合并是否足够分配内存;
步骤D3:若足够分配内存则将所述未分配节点上的所述内存块合并起来并分配内存;若不足够分配内存,则返回内存不足,请求分配失败;
所述二叉树的每一个所述节点都设置有索引n,所述索引n最小值为零,对应所述二叉树的根节点,后一个所述节点比前一个所述节点的索引n大1;
所述二维数组中设置有两个数组,第一个数组存储有所述二叉树的层数x,第二个数组存储有所述二叉树的所述节点的所述索引n;
包括了所述二维数组存储所述未分配节点的信息的过程:
步骤C1:所述适配器获取一个所述未分配节点在所述二叉树中的所述层数x,并将所述层数x存储到所述二维数组的第一个数组中;
步骤C2:接着所述适配器获取该已存好所述层数x的该所述未分配节点在所述二叉树中的所述索引n,并将所述索引n存储到所述二维数组的第二个数组中。
2.根据权利要求1所述一种内存分配的方法,其特征在于:包括所述适配器给与所述内存块相同或者大于所述内存块的所述内存值分配内存的过程:
步骤B1:所述适配器将所述内存值分解为2的最大次幂i加上一个余数;
步骤B2:判断所述余数是否不等于0,若所述余数等于0,则要分配的所述内存块大小为2的i次方,然后从所述二叉树的根节点向下开始遍历所述二叉树,寻找到存储有要分配的所述内存块的所述节点,并标记该所述节点为已分配状态,最后返回内存地址;
步骤B3:若所述余数不等于0,则要分配的内存块大小为2的(i+1)次方,然后从所述二叉树的根节点向下开始遍历所述二叉树,寻找到存储有要分配的所述内存块的的所述节点,并标记该所述节点为已分配状态,返回内存地址;
再将分配完还剩下的所述内存块从小到大的顺序以的幂次方拆分,添加到所述未分配节点中去,并将所述未分配节点在所述二叉树中的信息添加到所述二维数组中。
3.一种内存分配方法的系统,包括适配器、二叉树和二维数组,所述二叉树的节点标记内存块的使用状态,所述二叉树分为x层,所述二叉树的根节点位于所述二叉树的第一层;所述二叉树的第y层上的每一个所述节点都存储有2^(x-y)大小的所述内存块,y大于零且小于等于x;所述二维数组存储有未分配节点的信息;
其特征在于:包括所述适配器分配内存模块,用于为操作系统分配内存;
步骤a:所述适配器获取程序所申请的内存值,然后所述适配器从所述二叉树的根节点向下开始遍历,在所述节点中寻找可分配的所述内存块5;
步骤b:在所述节点中寻找与所述内存值相同大小的所述内存块,若找到,则将找到的所述内存块分配给所述内存值,将该所述节点标记为已分配状态,并返回内存地址;
若找不到,则寻找比所述内存值大的所述内存块,将寻找到所述内存块分配给所述内存值,并将该所述节点标记为已分配状态,然后返回内存地址;
步骤c:最后将比所述内存值大的所述内存块分配后还剩下的所述内存块存储到所述未分配节点中,并将所述未分配节点在所述二叉树中的信息存储到所述二维数组中;
步骤d:若找不到跟所述内存值相同或者比所述内存值大的所述内存块,则遍历所述二维数组,将所述未分配节点找出来,统计所有所述未分配节点上的所述内存块,若统计的所述内存块比所述内存值大,则将所述未分配节点上的所述内存块进行合并,然后再分配给所述内存值,并将合并的所述未分配节点标记为已分配状态,返回内存地址;
若统计的所述内存块比所述内存值小,则返回内存不足,请求分配失败的信息;
包括所述适配器给找不到与所述内存块相同或者大于所述内存块的所述内存值分配内存模块,用于所述适配器为小于所述内存块的所述内存值分配内存;
步骤d1:当所述适配器找不到跟所述内存值相同或者大于所述内存值的所述内存块时,所述适配器便会遍历所述二维数组,从所述二维数组寻找是否有所述未分配节点的信息;
步骤d2:若找到所述二维数组中有所述未分配节点的信息,则将所有所述未分配节点上的所述内存块统计起来,判断一个或者多个所述未分配节点上的所述内存块的合并是否足够分配内存;
步骤d3:若足够分配内存则将所述未分配节点上的所述内存块合并起来并分配内存;若不足够分配内存,则返回内存不足,请求分配失败;
所述二叉树的每一个所述节点都设置有索引n,所述索引n最小值为零,对应所述二叉树的根节点,后一个所述节点比前一个所述节点的索引n大1;
所述二维数组中设置有两个数组,第一个数组存储有所述二叉树的层数x,第二个数组存储有所述二叉树的所述节点的所述索引n;
包括了所述二维数组存储所述未分配节点的信息模块,用于所述二维数组存储所述未分配节点的信息;
步骤c1:所述适配器获取一个所述未分配节点在所述二叉树中的所述层数x,并将所述层数x存储到所述二维数组的第一个数组中;
步骤c2:接着所述适配器获取该已存好所述层数x的该所述未分配节点在所述二叉树中的所述索引n,并将所述索引n存储到所述二维数组的第二个数组中。
4.根据权利要求3所述一种内存分配方法的系统,其特征在于:包括所述适配器给与所述内存块相同或者大于所述内存块的所述内存值分配内存模块,用于所述适配器为大于或等于所述内存块5的所述内存值分配内存;
步骤b1:所述适配器将所述内存值分解为2的最大次幂i加上一个余数;
步骤b2:判断所述余数是否不等于0,若所述余数等于0,则要分配的所述内存块大小为2的i次方,然后从所述二叉树的根节点向下开始遍历所述二叉树,寻找到存储有要分配的所述内存块的所述节点,并标记该所述节点为已分配状态,最后返回内存地址;
步骤b3:若所述余数不等于0,则要分配的内存块大小为2的(i+1)次方,然后从所述二叉树的根节点向下开始遍历所述二叉树,寻找到存储有要分配的所述内存块的的所述节点,并标记该所述节点为已分配状态,返回内存地址;
再将分配完还剩下的所述内存块从小到大的顺序以的幂次方拆分,添加到所述未分配节点中去,并将所述未分配节点在所述二叉树中的信息添加到所述二维数组中。
CN201710967200.8A 2017-10-17 2017-10-17 一种内存分配的方法、系统 Active CN107844372B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710967200.8A CN107844372B (zh) 2017-10-17 2017-10-17 一种内存分配的方法、系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710967200.8A CN107844372B (zh) 2017-10-17 2017-10-17 一种内存分配的方法、系统

Publications (2)

Publication Number Publication Date
CN107844372A CN107844372A (zh) 2018-03-27
CN107844372B true CN107844372B (zh) 2021-09-07

Family

ID=61662422

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710967200.8A Active CN107844372B (zh) 2017-10-17 2017-10-17 一种内存分配的方法、系统

Country Status (1)

Country Link
CN (1) CN107844372B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110837416B (zh) * 2019-09-24 2021-04-30 深圳市火乐科技发展有限公司 内存管理方法、智能投影仪及相关产品
CN111104347B (zh) * 2019-12-23 2022-03-25 北京东土军悦科技有限公司 堆内存块查找方法、装置、设备及存储介质
CN112596908B (zh) * 2020-12-28 2022-09-16 中孚安全技术有限公司 一种基于完全二叉树的内存管理方法及系统
CN115617531B (zh) * 2022-11-16 2023-04-28 沐曦集成电路(上海)有限公司 一种快速检测离散资源的方法、装置、存储介质及设备
CN115658561B (zh) * 2022-11-16 2023-03-14 石家庄科林电气股份有限公司 配电终端内存管理方法、装置、电子设备及存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101320351A (zh) * 2008-06-27 2008-12-10 华中科技大学 内存的分配、清理和释放方法及内存管理的装置
CN101470667A (zh) * 2007-12-28 2009-07-01 英业达股份有限公司 Linux系统平台上指定地址范围分配物理内存的方法
CN103366016A (zh) * 2013-08-01 2013-10-23 南京大学 基于hdfs的电子文件集中存储及优化方法
CN105302738A (zh) * 2015-12-09 2016-02-03 北京东土科技股份有限公司 一种内存分配方法及装置
CN105760230A (zh) * 2016-02-18 2016-07-13 广东睿江云计算股份有限公司 一种自动调整云主机运行的方法及装置
CN107133182A (zh) * 2016-02-29 2017-09-05 北大方正集团有限公司 一种内存管理方法及装置

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101470667A (zh) * 2007-12-28 2009-07-01 英业达股份有限公司 Linux系统平台上指定地址范围分配物理内存的方法
CN101320351A (zh) * 2008-06-27 2008-12-10 华中科技大学 内存的分配、清理和释放方法及内存管理的装置
CN103366016A (zh) * 2013-08-01 2013-10-23 南京大学 基于hdfs的电子文件集中存储及优化方法
CN105302738A (zh) * 2015-12-09 2016-02-03 北京东土科技股份有限公司 一种内存分配方法及装置
CN105760230A (zh) * 2016-02-18 2016-07-13 广东睿江云计算股份有限公司 一种自动调整云主机运行的方法及装置
CN107133182A (zh) * 2016-02-29 2017-09-05 北大方正集团有限公司 一种内存管理方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
Linux2.6内存管理反向映射分析与改进;王帅;《万方在线出版》;20071105;第2章 *

Also Published As

Publication number Publication date
CN107844372A (zh) 2018-03-27

Similar Documents

Publication Publication Date Title
CN107844372B (zh) 一种内存分配的方法、系统
CN109154917B (zh) 存储系统和固态硬盘
US10152501B2 (en) Rollover strategies in a n-bit dictionary compressed column store
KR102198680B1 (ko) 확장 가능한 멀티-스테이지 데이터 처리 시스템들에서의 효율적인 데이터 캐싱 관리
US6757802B2 (en) Method for memory heap and buddy system management for service aware networks
CN106294190B (zh) 一种存储空间管理方法及装置
US9329780B2 (en) Combining virtual mapping metadata and physical space mapping metadata
WO2016045483A1 (zh) 一种地址的处理方法、相关设备和系统
US10394782B2 (en) Chord distributed hash table-based map-reduce system and method
CN106681829A (zh) 一种内存管理方法及系统
JP6275119B2 (ja) メモリ要素の割当てのために一方向リンク付けリストを区分化するシステム及び方法
CN107969153B (zh) 一种资源分配方法、装置及numa系统
CN105975398A (zh) 一种内存碎片管理方法
US20050268049A1 (en) Dynamic memory management
WO2024099448A1 (zh) 内存释放、内存恢复方法、装置、计算机设备及存储介质
CN110765094B (zh) 文件创建方法、装置、系统及存储介质
CN114327917A (zh) 内存管理方法、计算设备及可读存储介质
CN112650577A (zh) 内存管理方法和装置
CN109902033B (zh) 应用于NVMe SSD控制器的namespace的LBA分配方法和映射方法
CN112506813B (zh) 一种内存管理方法和系统
CN102867037A (zh) 一种基于位管理的分布式文件系统节点编号分配方法
CN114116194A (zh) 一种内存的分配方法及系统
CN111881066B (zh) 一种pl反向元数据的存储方法、系统、设备及存储介质
CN117311997B (zh) 一种计算芯片的内存管理方法、装置及计算芯片
CN115033378B (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
GR01 Patent grant
GR01 Patent grant