CN105302734B - 内存管理系统和方法 - Google Patents
内存管理系统和方法 Download PDFInfo
- Publication number
- CN105302734B CN105302734B CN201410351834.7A CN201410351834A CN105302734B CN 105302734 B CN105302734 B CN 105302734B CN 201410351834 A CN201410351834 A CN 201410351834A CN 105302734 B CN105302734 B CN 105302734B
- Authority
- CN
- China
- Prior art keywords
- node
- memory block
- chained list
- big
- small
- 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
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及内存管理系统和方法。该内存管理方法包括建立大内存块;在所述大内存块中建立小内存块;接收请求分配预定大小内存的内存分配请求;将所述预定大小与阈值进行比较;如果所述预定大小不大于所述阈值,判断所述大内存块中是否存在空闲小内存块;如果所述大内存块中存在空闲小内存块,为所述请求分配所述空闲小内存块。
Description
技术领域
本公开的实施例涉及内存管理系统和方法,尤其涉及内存的分配和释放。
背景技术
在C/C++程序的运行过程中,经常需要动态地分配、释放不同大小的内存块,最常见的就是使用new/delete操作符来为各种类型的对象分配和释放内存。大多数编译器对这两个操作符的缺省实现是调用C运行时库的malloc和free,但由于分配的内存块大小不定、释放顺序不定,频繁使用时容易产生内存碎片;另外,调用这两个函数也比较耗时,C运行时库实际还会多分配一些字节来维护一些信息,如内存块的大小等。用户请求分配的字节越少,额外的内存开销越明显,这些情况对应用程序的性能和稳定性不利。
发明内容
本发明目的是解决上述问题中的一个或多个。
本发明在一个方面提供一种内存管理方法,包括:
建立大内存块;
在所述大内存块中建立小内存块;
接收请求分配预定大小内存的内存分配请求;
将所述预定大小与阈值进行比较;
如果所述预定大小不大于所述阈值,判断所述大内存块中是否存在空闲小内存块;
如果所述大内存块中存在空闲小内存块,为所述请求分配所述空闲小内存块。
本发明在另一个方面提供一种内存管理方法,包括:
接收内存释放请求,所述请求包括要释放的内存块的地址和大小;
将所述内存块大小与阈值进行比较;
如果所述内存块大小不大于所述阈值;
根据所述内存块大小计算节点分配器索引值;
由与所述索引值对应的节点分配器根据所述地址释放所述内存块。
本发明在又一个方面提供一种内存管理系统,包括:
用于管理大内存块的块分配器;
用于管理小内存块的节点分配器;和
用于管理节点分配器的节点分配管理器。
根据本发明,预先通过malloc分配较大的内存块,当应用程序需要小内存块时,从大内存块中分配;应用程序释放小内存块时,将其归还到大内存块中。大内存块往往过较长时间后才通过free释放,甚至在程序退出前才释放。因此,可以减少malloc/free的调用,使内存的分配释放更高效。
本发明提供的小内存块的分配方案,其特点是分配、释放操作非常快,能有效地减少内存碎片,保证较高的内存利用率。此方案适用于需长时间运行、频繁分配释放小内存块的场合。尤其是考虑到绝大多数程序在运行过程中频繁分配、释放的通常是不同尺寸的小内存块,本发明尤其有用。
附图说明
从下面结合附图对本发明的具体实施方式的描述中可以更好地理解本发明,其中:
图1示出根据本发明示例性实施例的内存管理系统;
图2示出根据本发明一个示例性实施例的链表;
图3示出根据本发明另一个示例性实施例的链表;
图4示出根据本发明又一个示例性实施例的链表;
图5示出根据本发明示例性实施例的大内存块的链表和小内存块的链表形成的嵌套结构;
图6示出根据本发明的示例性实施例的内存分配方法;
图7示出根据本发明的示例性实施例的内存释放方法;
图8示出根据本发明的示例性实施例的计算装置。
具体实施方式
下面将详细描述本发明各个方面的特征和示例性实施例。下面的描述涵盖了许多具体细节,以便提供对本发明的全面理解。但是,对于本领域技术人员来说显而易见的是,本发明可以在不需要这些具体细节中的一些细节的情况下实施。下面对实施例的描述仅仅是为了通过示出本发明的示例来提供对本发明更清楚的理解。本发明绝不限于下面所提出的任何具体配置,而是在不脱离本发明的精神的前提下覆盖了相关元素或部件的任何修改、替换和改进。
本发明中的术语“大内存块”和“小内存块”中的相对术语“大”和“小”是相对而言的。即“大内存块”是指相对于“小内存块”字节数多的内存块,“小内存块”是指相对于“大内存块”字节数小的内存块。通常“大内存块”中可以建立一个或多个小内存块。
图1示出根据本发明示例性实施例的内存管理系统。内存管理系统包括用于管理大内存块的块分配器101,用于管理小内存块的节点分配器102,用于管理节点分配器的节点分配管理器103。
块分配器(ChunkAllocator)101对大内存块的管理主要包括分配和释放大内存块。在本发明的一个示例实施例中,块分配器101以链表(例如,单链表)的方式管理大内存块。链表的每个节点是一个大内存块。
图2给出了块分配器101可以使用的链表的例子。在图2的示例中,链表包括节点N1-N4。虽然图2中示出四个节点,本领域的技术人员可以理解,链表可以包括更多或更少的节点。
每个节点都有一个头部(也称作指针域)H。头部可以用于存放下一个节点的地址。例如,节点N1的头部H存放节点N2的地址,节点N2的头部存放节点N3的地址。节点N3的头部存放节点N4的地址。节点N4头部存储值“NULL”,表示这是最后一个节点。
每个节点还包括用于存储数据的数据域D,即可用的内存空间。根据本发明的示例实施例,链表还可以包括头指针HP,保存有链表中第一节点N1的地址。链表可由头指针HP来唯一确定,在C语言中例如可用“结构指针”来描述头指针。由于头指针HP中存放的是链表的第一个节点的地址,因此如果头指针的值为NULL,表示链表含有0个节点。
要释放一个大内存块,即删除一个节点时,块分配器101会调用库函数,例如调用库函数free,从而释放相应的空间。块分配器101还会修改前一节点中存储的地址,将其修改为删除节点的下一节点的地址。以图2给出的链表为例,例如,当删除节点N3时,块分配器101会调用库函数free,释放该大内存块,块分配器101还会将节点N2头部改为存储N4的地址。如果要删除的是第一节点N1,块分配器101会调用库函数free,释放节点N1,块分配器101还会从节点N1头部获取N2的地址,从而将头指针的地址改为N2的地址。
如果块分配器101要遍历大内存块链表,依次释放掉所有的大内存块,这时会从第一节点开始。还是以图2给出的链表为例,块分配器101会先释放第一节点N1,并将头指针的地址改为第二节点N2的地址(事实上,这时第二节点成为新的第一节点)。然后块分配器101会释放第二节点N2,并将头指针的地址改为第三节点N3的地址。当块分配器101释放最后一个节点N4时,头指针的值变为节点N4头部中存储的Null,这表明已释放了所有大内存块。
当分配新的大内存块,即建立一个节点时,块分配器101会调用库函数,例如malloc,从而在链表中插入新节点。新节点同样包括头部和数据域。新节点可以插在链表中的任一位置。以图2给出的链表为例,例如,新节点也可以插入例如节点N2和N3之间或者N3和N4之间,或者可以将新节点放置在N4之后。在本发明的一个可选实施例中,新节点插在第一个节点N1前,新节点的头部存储节点N1的地址,头指针中的地址则相应修改为新节点的地址。
节点分配器(NodeAllocator)102主要负责在块分配器101分配(或建立)的大内存块中分配、释放小内存块。类似于块分配器101,节点分配器102也可以以链表(例如,单链表)的方式管理内存,区别是节点分配器管理的是小内存块。也就是说,节点分配器可以在大内存块中建立小内存块的链表,每个节点是一个小内存块。根据本发明的一个示例性实施例,一个大内存块中建立一个小内存块链表,或者一个大内存块中建立多个小内存块链表。根据本发明的另一个示例性实施例,在多个大内存块中建立一个小内存块链表。根据本发明的示例性实施例,链表中的每个小内存块大小相同。小内存块的链表也可以采用图2给出的链表结构,每个节点同样可以包括头部和用于存储数据的数据域。
图5示出根据本发明的一个示例性实施例大内存块的链表里面建立小内存块的链表形成的嵌套结构。图中大内存块的链表的相应符号带撇,小内存块的链表的相应符号不带撇。在图5示出的示例性实施例中,大内存块的链表包括节点N1’、N2’和N3’。在这三个节点中建立一个小内存块的链表,指针LP保存其第一个节点的地址。在大内存块节点N3’中的小内存块节点N12是小内存块的链表的最后一个节点,其头部存储值Null。当然本领域的技术人员可以理解,图5中给出的节点数目只是示例,大内存块的链表和小内存块的链表均可以包括更多或更少的节点。
因为一个小内存块节点在一个时刻只能处于两种状态之一(空闲状态和被使用的状态),小内存块节点中的头部(也称作指针域)和数据域可以是重叠的。例如,可以规定空闲节点的前几个字节(例如前4个字节)用于存放下一个空闲节点的地址。
根据本发明一个示例性实施例,当小内存块节点被分配给用户后(变为被使用的状态),整个节点都可被用户使用(存储用户数据或程序数据),从而,小内存块节点中不再保存其他节点的地址;当小内存块节点被用户释放后(变为空闲的状态),它的前几字节(例如前4个字节)用于存放下一个空闲节点的地址。例如,在图5的基础上经过如下几步分配、释放(要注意的是,分配、释放操作的是链表的头节点,本质上就是出栈、入栈操作):分配N1,分配N2,分配N3,释放N2,释放N1。此时,小内存块N3处于使用状态,空闲节点N2中保存的地址是节点N4的地址,处于使用状态的节点N3已从链表中去除,而链表的首节点仍是N1,其指针域存放N2的地址。如果这时用户释放了N3,那么N3就变成链表的首节点,其指针域存放N1的地址。
节点分配器102为程序分配小内存块链表中的内存空间的时候,会分配节点链表指针LP保存的地址所对应的节点,即将第一空闲节点分配给程序使用。第一空闲节点保存有第二空闲节点的地址,节点链表指针LP保存的地址因此改变为第二空闲节点的地址,这时,第二空闲节点成为链表中新的第一空闲节点,由此,节点链表指针LP始终保存链表中第一空闲节点的地址。详细的内存分配过程会在后文结和图6详细描述。根据本发明一个示例性实施例,当释放小内存块时,将其地址保存到链表指针LP,从而新释放的小内存块成为链表的第一空闲节点。详细的内存释放过程会在后文结和图7详细描述。
而当节点链表指针LP中的地址是从链表中最后一个空闲节点获得的值Null时,表明链表中没有空闲节点。这时,如果节点分配器102要为程序分配内存空间,节点分配器102会请求块分配器101分配一个大内存块,这可以通过例如在大内存块链表中新建一个节点实现。新建的大内存块需要初始化,即由节点分配器102在大内存块中建立一个空闲的小内存块链表。新建的空闲链表中,每个节点的大小例如是相同的,根据大内存块的数据域的大小可容易地计算出新建的链表的节点数。节点链表指针LP中的地址是新建的链表的第一节点的地址。
初始化时,节点分配器102还可以选择进行加锁处理,加锁处理可以采用现有技术中已知的任何类型的锁,本发明不再详述。用户可以定制节点分配器是否需要线程安全,例如当需要在单线程环境中使用节点分配器时,就没有必要同步,可以实现什么也不做的锁或者不进行加锁处理。当需要在多线程环境中使用节点分配器时,可以利用例如Windows平台的临界区实现锁。
节点分配器的数目可以是1个也可以是多个。例如,在图1的示例中,内存管理系统具有一组多个节点分配器,即节点分配器1、节点分配器2,直到节点分配器N(N是大于2的整数)。在一个示例性实施例中一个节点分配器管理一个链表,而在一个可选实施例中一个节点分配器管理多个链表。
节点分配管理器(NodeAllocatorManager)103用于管理节点分配器,主要负责建立或者去除节点分配器。
根据本发明的一个可选实施例,节点分配管理器为节点分配器分配索引值i(i为整数)。例如,第一节点分配器的索引值为i=0,第二节点分配器的索引值为i=1,第N节点分配器的索引值为i=N-1。根据本发明的一个示例实施例,一个节点分配器管理的链表的节点大小(即节点字节数)都是相同的。节点大小也称为粒度,等于索引值加1乘以粒度差值。粒度差值为固定的整数,可以根据需要预先设定。
例如,如果粒度差值为4(即4字节),索引为0的节点分配器负责分配的粒度为粒度差值乘以1,即4字节的内存;索引为1的节点分配器负责分配的粒度为粒度差值乘以2,即8字节的内存;索引为i的节点分配器负责分配的粒度为粒度差值乘以(i+1)字节的内存。索引i的最大值例如可以设为128。那么,节点分配管理器管理的一组节点分配器处理的粒度的最小值为4,粒度的最大值(即最大分配粒度)为512(即512字节)。这样可以满足不同大小内存的分配、释放需求。
根据本发明的一个示例性实施例,节点分配管理器还可以进行判断操作。当节点分配管理器接收到例如程序的分配/释放请求时,将所请求的内存大小与最大分配粒度比较,如果所请求的内存大小大于最大分配粒度,例如可以直接调用C运行库的分配函数进行分配/释放;如果所请求的内存大小小于或等于最大分配粒度,节点分配管理器根据所请求的内存大小计算出节点分配器索引,然后跟据索引值,就可以找到合适的节点分配器。程序(或用户)请求的内存大小(即请求分配的空间大小)除以粒度差值所得的整数部分,即为所需节点分配器的索引值。例如,请求分配的空间大小为11字节,粒度差值为4时,所需节点分配器的索引值为2。节点分配管理器根据索引值2就可以找到相应的节点分配器,由节点分配器进行小内存块的分配/释放。
根据一个可选实施例,静态分配一块内存,用于容纳全部节点分配器。这样做的好处是提高中央处理单元CPU缓存命中率,提高内存利用率,尽量减少内存碎片,使节点分配管理器尽可能高效。
根据本发明,块分配器的分配和释放通过调用例如库函数malloc和free实现。而节点分配器的分配操作本质上是一个出栈操作,仅当没有空闲内存时才通过块分配器分配一个新的大内存块;节点分配器的释放操作直接做一个入栈操作,因此分配、释放操作非常快,而且不会产生内存碎片。C运行库带来的额外内存开销仅仅是分配大内存块时才产生,但由于大内存块比较大,这点开销可以忽略,因此节点分配器的内存利用率也很高。
图3是根据本发明的另一示例实施例的内存块链表。虽然图3中示出四个节点,本领域的技术人员可以理解,链表可以包括更多或更少的节点。这些节点中的每个节点都有一个头部H和数据域D。头部例如可以用于存放上一个节点的地址。第一个节点N1的头部存放最后一个节点N4的地址。由此,从链表中任一节点出发均可找到链表中其他节点。链表可由头指针HP来唯一确定,头指针HP中存放的是列表的第一个节点的地址。
虽然图2和图3中示出的是单链表,本领域的技术人员可以理解本发明还可以使用其他链表,例如图4中所示的双向链表。双向链表中每个节点的头部可以包括两部分H1和H2,第二部分H2存储前一节点地址,第一部分H1存储后一节点地址。
图2-图4的链表可以用于小内存块的链表和/或大内存块的链表。根据本发明的一个示例性实施例,图2-图4的链表用于小内存块的链表时,不使用HP头指针,代替的是使用节点链表指针,节点链表指针上文已经描述过,在此不再重复。
图6示出根据本发明的示例性实施例的内存分配方法。图6示出的内存分配方法例如可以由上文参照图1描述的内存管理系统执行。并且上文参照图1-5的描述也可以适用于图6描述的实施例,为了简洁这些内容在这里不再重复。在步骤601方法开始。接下来在步骤602,接收来自程序或用户的对一定大小的内存空间的分配请求。在步骤603,判断请求的内存大小(即请求分配的字节数)是否符合小内存块的标准(即判断请求分配的字节数是否足够小)。将请求分配的字节数与最大分配粒度比较,如果请求分配的字节数大于最大分配粒度,就进行到步骤604,直接调用C运行库的分配函数;否则进行到步骤605,首先由请求分配的字节数计算出节点分配器索引,有了索引,就可以找到合适的节点分配器。接下来在步骤606判断是否有空闲的节点,如果有就在步骤607返回小内存块链表中第一空闲节点的地址给程序或用户,由此完成内存分配,如果在步骤606判断没有空闲的节点,就在步骤608通过C运行库分配一大内存块,在步骤609在新分配的大内存块中建立小内存块的空闲链表。最后方法在步骤610结束。
图7示出根据本发明的示例性实施例的内存释放方法。图7示出的内存释放方法例如可以由上文参照图1描述的内存管理系统执行。并且上文参照图1-5的描述也可以适用于图7描述的实施例,为了简洁这些内容在这里不再重复。在步骤701方法开始。接下来在步骤702,接收来自程序或用户的对一定大小的内存空间的释放请求,包括要释放的内存块地址和字节数。与分配操作类似,在步骤703,判断请求释放的内存是否足够小,属于小内存块。将请求释放的字节数与最大分配粒度比较,如果请求释放的字节数大于最大分配粒度,就说明请求释放的内存不属于小内存块,就进行到步骤704,直接通过C运行库释放。如果是小内存块,进行到步骤705,首先由请求释放的字节数计算出节点分配器索引,有了索引,就可以找到合适的节点分配器。接下来在步骤706释放内存块。根据本发明的一个可选实施例,在步骤706中,把释放的小内存块作为小内存块链表的第一空闲节点。最后方法在步骤707结束。
图8示出上面描述的实施例的示例性计算装置。图8示出的计算装置仅仅是本发明可用的操作环境的一个例子。示例性计算装置包括,但不限于,个人计算机、服务器计算机、手持或膝上型装置、移动装置(诸如,移动电话、个人数字助理(PDA)、媒体播放器等等)、多处理器系统、消费者电子装置、小型计算机、大型计算机、包括任何的上述系统或装置的分布式计算环境等等。
示例性实施例是在由一个或多个计算装置执行的“计算机可读指令”的一般上下文中被描述的。计算机可读指令可以经由计算机可读介质(下面讨论的)来分发。计算机可读指令可以被实施为诸如功能、对象、应用编程接口(API)、数据结构等等那样的程序模块,所述程序模块执行特定的任务或实施特定的抽象数据类型。典型地,计算机可读指令的功能性可以如在各种环境中希望的那样被组合或分布。
图8包括被配置成实施这里提供的一个或多个实施例的计算装置1002的例子。在一个配置中,计算装置1002包括至少一个处理单元1006和存储器1008。取决于计算装置的确切配置和类型,存储器1008可以是易失性的(举例而言,诸如RAM)、非易失性的(举例而言,诸如ROM、闪速存储器等等)、或二者的某种组合。这种配置在图8上用虚线1004例示。存储器1008是上文所述的内存的一个例子。
在其它实施例中,装置1002可包括附加特征和/或功能性。例如,装置1002还可包括附加的存储装置(例如,可拆卸和/或不可拆卸的),包括但不限于,磁存储装置、光存储装置等等。这样的附加存储装置在图8上用存储装置1010例示。在一个实施例中,实施这里提供的一个或多个实施例的计算机可读指令可以是在存储装置1010中。存储装置1010还可存储实施操作系统、应用程序等等的其它计算机可读指令。计算机可读指令可被装载在存储器1008中,用于例如由处理单元1006执行。
当在这里使用时,术语“计算机可读介质”包括计算机存储介质。计算机存储介质包括以用于存储诸如计算机可读指令或其它数据那样的信息的任何方法或技术实施的易失性和非易失性、可拆卸和不可拆卸的介质。存储器1008和存储装置1010是计算机存储介质的例子。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪速存储器、或其他存储器技术、CD-ROM、数字多功能盘(DVD)、或其它光存储装置、磁带盒、磁带、磁盘存储装置、或其它磁存储装置、或可被使用来存储想要的信息和可被装置1002访问的任何其它介质。任何这样的计算机存储介质可以是装置1002的一部分。
装置1002还可包括允许装置1002与其它装置通信的通信装置1016。通信装置1016可包括但不限于,调制解调器、网络接口卡(NIC)、集成网络接口、射频发射机/接收机、红外端口、USB连接、或用于将计算装置1002连接到其它计算装置的其它接口。通信装置1016可包括有线连接或无线连接。通信装置1016可以发送和/或接收通信介质。
术语“计算机可读介质”可包括通信介质。通信介质典型地体现在诸如载波那样的“调制的数据信号”或其它输送机制中的计算机可读指令或其它数据,并包括任何信息传递介质。术语“调制的数据信号”可包括使其特性以这样的方式设置或改变的信号,即:把信息编码到信号中。
装置1002可包括输入装置1014,诸如键盘、鼠标、笔、话音输入装置、触摸输入装置、红外照相机、视频输入装置、和/或任何其它输入装置。诸如一个或多个显示器、扬声器、打印机、和/或任何其它输出装置那样的输出装置1012也可以被包括在装置1002中。输入装置1014和输出装置1012可以经由有线连接、无线连接或它们的任何组合被连接到装置1002。在一个实施例中,来自另一个计算装置的输入装置或输出装置可被用作用于计算装置1002的输入装置1014或输出装置1012。
计算装置1002的部件可以通过各种互连,诸如总线,而被连接。这样的互连可包括诸如PCI Express那样的外围设备互连(PCI)、通用串行总线(USB)、firewire(IEEE 1394)、光总线结构等等。在另一个实施例中,计算装置1002的部件可以通过网络而互联。例如,存储器1008可以由位于通过网络互连的不同物理位置的多个物理存储器单元组成。
本领域技术人员将认识到,被利用来存储计算机可读指令的存储装置可以跨网络分布。例如,经由网络可访问的另一计算装置可以存储用来实施这里提供的一个或多个实施例的计算机可读指令。计算装置1002可以访问另一计算装置以及下载一部分或所有的计算机可读指令用于执行。替换地,计算装置1002可以按需要下载计算机可读指令的片段,或某些指令可以在计算装置1002上执行而某些指令在另一计算装置上执行。
以上已经参考本发明的具体实施例来描述了本发明,但是本领域技术人员均了解,可以对这些具体实施例进行各种修改、组合和变更,而不会脱离由权利要求或其等同物限定的本发明的精神和范围。
Claims (19)
1.一种内存管理方法,包括:
建立大内存块;
在所述大内存块中建立小内存块;
接收请求分配预定大小内存的内存分配请求;
将所述预定大小与阈值进行比较;
如果所述预定大小不大于所述阈值,判断所述大内存块中是否存在空闲小内存块;
如果所述大内存块中存在空闲小内存块,为所述请求分配所述空闲小内存块;
其中,在所述大内存块中建立小内存块包括在所述大内存块中建立小内存块的链表,所述小内存块为所述链表的节点,其中建立小内存块的链表包括建立多个小内存块的链表,所述多个小内存块链表中的每个小内存块链表的所有节点大小相等,所述多个小内存块链表中至少部分链表的节点大小彼此不同,其中所述多个小内存块的链表由多个节点分配器管理,每一个节点分配器具有一个索引值i,i为整数,每个小内存块链表的节点的大小等于该链表对应的节点分配器索引值加1再乘以粒度差值,粒度差值为预定的整数,根据所述预定大小计算节点分配器索引值,其中所述判断步骤包括判断与所计算的索引值相对应的节点分配器所管理的小内存块链表中是否存在空闲节点,如果有空闲节点,返回小内存块链表中第一空闲节点的地址给程序或用户,由此完成内存分配。
2.如权利要求1所述的方法,如果所述大内存块中不存在空闲小内存块,建立新的大内存块。
3.如权利要求2所述的方法,其中建立新的大内存块通过调用C运行库的分配函数实现。
4.如权利要求2所述的方法,还包括在新建立的大内存块中建立小内存块链表。
5.如权利要求1所述的方法,其中当为所述请求分配所述空闲小内存块后,将所述小内存块对应的节点从所述链表中去除。
6.如权利要求1所述的方法,所述阈值指所述多个小内存块链表中最大节点的大小。
7.如权利要求1所述的方法,其中如果所述预定大小大于所述阈值,调用C运行库的分配函数。
8.如权利要求1所述的方法,其中建立大内存块包括建立大内存块的链表。
9.一种内存管理方法,包括:
接收内存释放请求,所述请求包括要释放的内存块的地址和大小;
将所述内存块大小与阈值进行比较;
如果所述内存块大小不大于所述阈值;
根据所述内存块大小计算节点分配器索引值;
由与所述索引值对应的节点分配器根据所述地址释放所述内存块;其中,每一个节点分配器具有一个索引值i,i为整数,每个小内存块链表的节点的大小等于该链表对应的节点分配器索引值加1再乘以粒度差值,粒度差值为预定的整数,根据所述预定大小计算节点分配器索引值。
10.如权利要求9所述的方法,其中存在多个节点分配器,每个节点分配器管理预定大小节点的链表。
11.如权利要求9所述的方法,其中如果所述内存块大小大于所述阈值,调用C运行库的分配函数。
12.如权利要求9所述的方法,还包括建立大内存块,由所述节点分配器在所述大内存块中建立小内存块的链表。
13.如权利要求12所述的方法,其中释放的所述内存块成为所述小内存块的链表中的第一空闲节点。
14.一种内存管理系统,包括:
用于管理大内存块的块分配器;
用于管理小内存块的节点分配器;和
用于管理节点分配器的节点分配管理器;
其中,所述内存管理系统包括多个所述节点分配器,所述节点分配管理器为所述多个节点分配器中的每一个节点分配器分配一个索引值,其中,每一个节点分配器具有一个索引值i,i为整数,每个小内存块链表的节点的大小等于该链表对应的节点分配器索引值加1再乘以粒度差值,粒度差值为预定的整数,根据所述预定大小计算节点分配器索引值。
15.根据权利要求14所述的内存管理系统,其中,所述块分配器以链表的形式管理大内存块,链表的每个节点是一个大内存块。
16.根据权利要求14所述的内存管理系统,其中,所述节点分配器以链表的形式管理小内存块,链表的每个节点是一个小内存块。
17.根据权利要求16所述的内存管理系统,其中,所述小内存块的链表位于所述大内存块中。
18.根据权利要求14所述的内存管理系统,其中每个节点分配器管理的链表中的节点大小都是相同的。
19.根据权利要求14所述的内存管理系统,其中索引值不同的节点分配器所管理的链表节点大小不同。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410351834.7A CN105302734B (zh) | 2014-07-22 | 2014-07-22 | 内存管理系统和方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410351834.7A CN105302734B (zh) | 2014-07-22 | 2014-07-22 | 内存管理系统和方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105302734A CN105302734A (zh) | 2016-02-03 |
CN105302734B true CN105302734B (zh) | 2018-04-06 |
Family
ID=55200023
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410351834.7A Active CN105302734B (zh) | 2014-07-22 | 2014-07-22 | 内存管理系统和方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105302734B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111177017B (zh) * | 2018-11-09 | 2022-05-27 | 炬芯科技股份有限公司 | 一种内存分配方法及装置 |
CN111367461B (zh) * | 2018-12-25 | 2024-02-20 | 兆易创新科技集团股份有限公司 | 一种存储空间管理方法及装置 |
CN110287127A (zh) * | 2019-05-14 | 2019-09-27 | 江苏大学 | 一种多粒度多核可扩展的非易失性内存管理方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1963788A (zh) * | 2005-11-08 | 2007-05-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
CN102915276A (zh) * | 2012-09-25 | 2013-02-06 | 武汉邮电科学研究院 | 一种用于嵌入式系统的内存控制方法 |
CN103077126A (zh) * | 2012-12-24 | 2013-05-01 | 中兴通讯股份有限公司 | 一种内存管理方法和装置 |
CN103123604A (zh) * | 2011-11-18 | 2013-05-29 | 苹果公司 | 跟踪数据处理系统的内存使用的方法 |
-
2014
- 2014-07-22 CN CN201410351834.7A patent/CN105302734B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1963788A (zh) * | 2005-11-08 | 2007-05-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
CN103123604A (zh) * | 2011-11-18 | 2013-05-29 | 苹果公司 | 跟踪数据处理系统的内存使用的方法 |
CN102915276A (zh) * | 2012-09-25 | 2013-02-06 | 武汉邮电科学研究院 | 一种用于嵌入式系统的内存控制方法 |
CN103077126A (zh) * | 2012-12-24 | 2013-05-01 | 中兴通讯股份有限公司 | 一种内存管理方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105302734A (zh) | 2016-02-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7747834B2 (en) | Memory manager for an embedded system | |
CN105302734B (zh) | 内存管理系统和方法 | |
CN108268271A (zh) | 微服务的升级方法与升级装置 | |
CN106201661A (zh) | 用于弹性伸缩虚拟机集群的方法和装置 | |
CN106302632A (zh) | 一种基础镜像的下载方法以及管理节点 | |
KR102594657B1 (ko) | 비순차적 리소스 할당을 구현하는 방법 및 장치 | |
CN111177025B (zh) | 数据存储方法、装置及终端设备 | |
CN109857580A (zh) | 区块链跨链合约调用方法、装置及存储介质 | |
CN104965708A (zh) | 一种应用程序运行过程的内存管理方法及装置 | |
CN103338464B (zh) | 通信方法及设备 | |
CN111797173B (zh) | 联盟链共享系统、方法、装置、电子设备及存储介质 | |
CN109960575A (zh) | 一种计算能力共享方法、系统及相关设备 | |
US20230168933A1 (en) | Memory deallocation across a trust boundary | |
CN106294198B (zh) | 一种Linux操作系统的内存分配方法及释放方法 | |
CN107357630A (zh) | 一种实现虚拟机同步的方法、装置和存储介质 | |
CN106227597A (zh) | 任务优先级处理方法和装置 | |
US9141409B2 (en) | Multiple configurable customization layer system, method and computer program product | |
CN110134655A (zh) | 一种资源管理方法、装置和设备 | |
CN105898399A (zh) | 一种视频资源加载方法及装置及智能电视 | |
CN106528173A (zh) | 一种开机图片显示方法及终端 | |
CN103729172A (zh) | 避免触控事件被拦截以触发给多元件执行的系统及其方法 | |
CN109710278A (zh) | 一种卸载应用程序的方法、装置及终端设备 | |
CN109862069A (zh) | 消息处理方法和装置 | |
US10367879B2 (en) | Download prioritization | |
CN105550042B (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 |