CN106445835A - 内存分配方法与装置 - Google Patents

内存分配方法与装置 Download PDF

Info

Publication number
CN106445835A
CN106445835A CN201510514337.9A CN201510514337A CN106445835A CN 106445835 A CN106445835 A CN 106445835A CN 201510514337 A CN201510514337 A CN 201510514337A CN 106445835 A CN106445835 A CN 106445835A
Authority
CN
China
Prior art keywords
memory
memory block
allocation
block
internal
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.)
Granted
Application number
CN201510514337.9A
Other languages
English (en)
Other versions
CN106445835B (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.)
Beijing Memblaze Technology Co Ltd
Original Assignee
Beijing Memblaze Technology 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 Beijing Memblaze Technology Co Ltd filed Critical Beijing Memblaze Technology Co Ltd
Priority to CN202011112502.5A priority Critical patent/CN112162938A/zh
Publication of CN106445835A publication Critical patent/CN106445835A/zh
Application granted granted Critical
Publication of CN106445835B publication Critical patent/CN106445835B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明提供一种内存分配方法和装置,涉及计算机领域。为解决现有技术易发生TLB未命中和缺页中断,进而引起性能颠覆,以及内存的使用效率较低的问题而发明。本发明实施例提供的技术方案包括:接收内存分配请求;访问活动内存块;根据所述内存分配请求从所述活动内存块中分配第一内存;当所述第一内存分配成功时,返回指示所分配内存的第一内存地址。该方案可以用于大数据流场景下的内存分配。

Description

内存分配方法与装置
技术领域
本发明涉及计算机领域,更具体地,本发明涉及一种内存分配方法和装置。
背景技术
在应用程序运行过程中,会不断进行内存的分配和释放。现有技术中,一般采用内存分配器(如malloc内存分配器)进行内存分配;具体过程如下:内存分配器实行分页管理,将进程的虚拟地址空间分成若干具有预定尺寸的页,并加以编号(可基于逻辑地址空间的地址得到编号);相应的,计算机的物理内存也分成同样尺寸的块,并加以编号(可基于物理地址空间的地址得到编号);分页的大小一般为4KB。为了保证应用程序的进程能在内存中找到虚拟页对应的实际物理块,需要为每个进程维护一个映像表,即页表;页表记录了每一个虚拟页在内存中对应的物理页号;当应用程序的进程需要访问某个虚拟地址中的数据时,通过查找页表,即可找到每个虚拟页在内存中的物理页号。页表一般存放在内存中,因而CPU每存取一个数据时,需要至少两次访问内存;第一次时访问内存中的页表,从中找到指定页的物理页号,再将物理页号与页内偏移拼接,以形成物理地址;第二次时才是从第一次访问内存所得物理地址中获得所需数据。
为了提高计算机的处理速度,现代CPU架构引入了TLB,用于缓存一部分经常访问的页表内容。由于成本关系,TLB较小,通常只能存放16~512个页表项。
然而,现有的计算机系统,物理内存非常大,以支持非常大的虚拟地址空间,进而导致页表非常庞大,即页表项远超过TLB的存储极限;当超出TLB的存储极限时,就会发生TLB未命中和缺页中断,进而引起性能颠簸。而且,传统内存分配方法还会产生大量的内存碎片,导致内存的使用效率较低。
发明内容
本发明的目的在于减少TLB未命中和缺页中断,进而避免性能颠簸;还在于减少内存分配产生的碎片,提高内存的使用效率。
根据本发明的第一方面,提供了第一内存分配方法,包括:接收内存分配请求;访问活动内存块;根据所述内存分配请求从所述活动内存块中分配第一内存;当所述第一内存分配成功时,返回指示所分配内存的第一内存地址。
根据本发明的第一方面的第一内存分配方法,提供了根据本发明第一方面的第二内存分配方法,还包括:当所述第一内存分配失败时,将所述活动内存块放入回收内存块列表,并向内存块池申请空闲内存块;当空闲内存块申请成功时,将申请得到的空闲内存块作为活动内存块,并根据所述内存分配请求从该活动内存块中分配第二内存;返回指示所分配内存的第二内存地址。
根据本发明的第一方面的第二内存分配方法,提供了根据本发明第一方面的第三内存分配方法,还包括:当空闲内存块申请失败时,根据所述内存分配请求遍历所述回收内存块列表,从所述回收内存块列表中的回收内存块中进行第三内存分配;当所述第三内存分配成功时,返回指示所分配内存的第三内存地址。
根据本发明的第一方面的第二或第三内存分配方法,提供了根据本发明第一方面的第四内存分配方法,其中,所述内存块池包括从至少一个内存大页分割得到的多个内存块;所述至少一个内存大页为采用大页机制从物理内存中预留出来的。
根据本发明的第一方面的前述内存分配方法,提供了根据本发明第一方面的第五内存分配方法,还包括:响应于内存释放请求,确定对应的内存块;判断所述内存块的内存是否已经全部释放;如果是,将所述内存块释放回所述内存块池。
根据本发明的第一方面的前述内存分配方法,提供了根据本发明第一方面的第六内存分配方法,其中,所述根据所述内存分配请求从所述活动内存块中分配第一内存,包括:根据指针确定所述活动内存块的待分配内存区的起始位置;以及从所述待分配内存区的起始位置分配第一内存;其中所述活动内存块中预设有至少一个节点,每个节点对应已释放内存区、已分配内存区和待分配内存区中的一种;所述活动内存块中还预设有指针,用于标记所述活动内存块的待分配内存区的起始位置。
根据本发明的第一方面的第三内存分配方法,提供了根据本发明第一方面的第七内存分配方法,其中,所述当空闲内存块申请失败时,根据所述内存分配请求遍历所述回收内存块列表包括:当空闲内存块申请失败时,尝试从其他活动内存块中分配第四内存;当所述第四内存分配成功时,返回指示所分配内存的第四内存地址;当所述第四内存分配失败时,根据所述内存分配请求遍历所述回收内存块列表,从所述回收内存块列表中的回收内存块中进行第五内存分配。
根据本发明的第二方面,提供根据本发明第二方面的第一内存分配方法,包括:指示采用大页机制从物理内存中分割第一数目个第一大小的内存大页,所述内存大页用于对程序的内存分配;配置每个内存大页的页表项;根据预设第二大小将每个内存大页分割为内存块,并将所有内存大页分割得到的内存块组织为内存块池;对所述内存块池进行管理,管理内存块池中的空闲内存块。
根据本发明的第三方面,提供了根据本发明第三方面的第一内存分配方法,其中采用大页机制在电子系统的内存中预留一个或多个大页,每个内存大页包括一个或多个内存块,将每个内存大页的内存块组织为内存块池,所述内存分配方法包括:响应于内存分配请求,访问活动内存块,从活动内存块中分配空闲内存;若从活动内存块中分配空闲内存失败,从所述内存块池中获得空闲内存块,将所述活动内存块放入第一内存块列表,从所述空闲内存块中分配空闲内存。
根据本发明第三方面的第一内存分配方法,提供了根据本发明第三方面的第二内存分配方法,还包括将所述空闲内存块作为活动内存块。
根据本发明第三方面的第一或第二内存分配方法,提供了根据本发明第三方面的第三内存分配方法,其中从活动内存块中分配空闲内存后,标记空闲内存块中的已使用内存区和/或空闲内存区。
根据本发明第三方面的前述内存分配方法,提供了根据本发明第三方面的第四内存分配方法,其中若从所述内存块池中获得空闲内存块失败,遍历第一内存块列表,从第一内存块列表的内存块中分配内存。
根据本发明第三方面的第四内存分配方法,提供了根据本发明第三方面的第五内存分配方法,其中从第一内存块列表的内存块中分配内存,包括,从第一内存块列表中寻找可满足所述内存分配请求的第一内存块,从第一内存块中分配内存,标记所述第一内存块中的已使用内存区和/或空闲内存区。
根据本发明第三方面的第一至第四内存分配方法之一,提供了根据本发明第三方面的第六存分配方法,还包括:响应于内存释放请求,根据内存释放请求对应的内存地址,在活动内存块或第一内存块列表中找到对应于所述内存地址的内存块,将所述内存块释放回内存块池。
根据本发明第三方面的第六内存分配方法,提供了根据本发明第三方面的第七内存分配方法,还包括将释放回内存块池的所述内存块标记为空闲内存块。
根据本发明第三方面的第六内存分配方法,提供了根据本发明第三方面的第八内存分配方法,其中响应于找到对应于所述内存地址的内存块,将所述内存块中对应于所述内存释放请求的内存区标记为空闲。
根据本发明第三方面的第八内存分配方法,提供了根据本发明第三方面的第九内存分配方法,其中响应于将所述内存块中对应与所述内存释放请求的内存区标记为空闲,若所述内存块的内存区已全部标记为空闲,则将所述内存块释放回内存块池。
根据本发明第三方面的前述内存分配方法之一,提供了根据本发明第三方面的第十内存分配方法,其中所述响应于内存分配请求访问活动内存块,从活动内存块中分配空闲内存,包括:访问与发出所述内存分配请求的进程相对应的第一活动内存块,以及从所述第一活动内存块中分配空闲内存。
根据本发明第三方面的第十内存分配方法,提供了根据本发明第三方面的第十一内存分配方法,其中响应于从所述第一活动内存块中分配空闲内存失败,遍历与其他进程相对应的其他一个或多个活动内存块,从其他活动内存块之一中分配空闲内存。
根据本发明第三方面的第十内存分配方法,提供了根据本发明第三方面的第十二内存分配方法,若从其他活动内存块的每一个中分配内存均失败,则遍历第一内存块列表,从第一内存块列表的内存块中分配内存。
根据本发明第三方面的第十内存分配方法,提供了根据本发明第三方面的第十三内存分配方法,若从其他活动内存块的每一个中分配内存均失败,则遍历多个第一内存块列表,从多个第一内存块列表的内存块中分配内存,其中每个第一内存块列表同进程中的一个相对应。
根据本发明第三方面的前述内存分配方法,提供了根据本发明第三方面的第十四内存分配方法,其中响应于多个进程的每个发出的内存分配请求,并行地访问与每个进程相对应的活动内存块,以及并行地从与每个进程相对应的活动内存块中分配空闲内存。
根据本发明第三方面的第十四内存分配方法,提供了根据本发明第三方面的第十五内存分配方法,其中响应于所述从与每个进程相对应的活动内存块中分配空闲内存中的一个或多个分配空闲内存失败,并行地从所述内存池中获得空闲内存块,并从所述空闲内存块中分配空闲内存。
根据本发明的第四方面,提供一种内存分配装置,包括:用于接收内存分配请求的第一模块;用于访问活动内存块的第二模块;用于根据所述内存分配请求从所述活动内存块中分配第一内存的第三模块;用于当所述第一内存分配成功时,返回指示所分配内存的第一内存地址的第四模块。
根据本发明的第五方面,提供一种内存分配装置,包括:用于指示采用大页机制从物理内存中分割第一数目个第一大小的内存大页的第五模块,所述内存大页用于对程序的内存分配;用于配置每个内存大页的页表项的第六模块;用于根据预设第二大小将每个内存大页分割为内存块,并将所有内存大页分割得到的内存块组织为内存块池的第七模块;用于对所述内存块池进行管理,管理内存块池中的空闲内存块的第八模块。
根据本发明第六方面,提供了一种计算机,包括:用于存储程序指令的机器可读存储器;用于执行存储在所述存储器中的程序指令的一个或多个处理器;所述程序指令用于使所述一个或多个处理器执行根据本发明第一到第三方面提供的多种方法之一。
根据本发明的第七方面,提供了一种程序,其使得计算机执行根据本发明的第一到第三方面提供的多种方法之一。
根据本发明的第八方面,提供了一种在其上具有所记录的程序的计算机可读存储介质,其中所述程序使得计算机执行根据本发明的第一到第三方面而提供的多种方法之一。
通过本发明的技术方案,能够减少TLB未命中和缺页中断,进而避免性能颠簸;还能够减少内存分配产生的碎片,提高内存的使用效率。
附图说明
图1为本发明实施例1提供的内存分配方法的流程图;
图2为根据本发明实施例的内存块的示意图;
图3为根据本发明实施例的内存组织的示意图;
图4为本发明实施例2提供的内存分配方法的流程图;
图5为本发明实施例3提供的内存分配方法的流程图;
图6为本发明实施例4提供的内存分配方法的流程图;
图7为本发明实施例5提供的内存释放方法的流程图;
图8为根据本发明实施例提供的又一内存组织的示意图;
图9为本发明实施例6提供的内存分配方法的流程图;
图10为本发明实施例7提供的内存分配方法的流程图;
图11为本发明实施例8提供的内存分配装置的结构示意图;以及
图12为本发明实施例9提供的又一内存分配装置的结构示意图。
具体实施方式
下面结合附图对本发明的具体实施方式进行描述。
实施例1
如图1所示,本发明实施例提供一种内存分配方法,包括:
操作101,指示采用大页机制从物理内存中分割第一数目个第一大小的内存大页。
在根据本发明的实施例中,在进行内存分配之前,首先进行初始化,采用大页机制预留内存,从而减少TLB未命中和缺页中断,进而避免性能颠簸,方便内存管理。预留内存的方式为通过操作101指示采用大页机制从物理内存中分割内存大页,该预留的内存大页用于对程序的内存分配。在一个例子中,Linux操作系统基于hugetlbfs文件系统来实现例如2MB的大页,在此情况下,操作系统采用2MB作为大页的预定大小,因而分配一个页面能够得到2MB内存,并且索引该2MB的内存只需1个页表项。其他多种CPU架构也支持具有多种页面大小的大页机制。基于大页机制分配的一个页面的大小可以是2MB,也可以为其他大小。内存大页的个数可与每个大页的大小以根据程序处理的数据流的大小和物理内存的容量确定。提出内存分配请求的程序可以是应用程序、驱动程序和/或操作系统内核等任何需要使用内存的程序。
由于使用大页机制,所分割的内存大页对应的页表的条目较少,从而完整的页表可被装载到TLB中,减少TLB未命中和缺页中断,进而避免性能颠簸。
操作102,配置每个内存大页的页表项。
在根据本发明的实施例中,物理内存中未分割部分,可以采用传统方式分页,即分割成4KB等大小的块。现有技术中采用多级页表的方式来索引内存页。最末级页表的每个页表项用来索引一个4KB大小的内存页,而倒数第二级页表的每个页表项用来索引512个最末级页表项,因而倒数第二级页表的每个页表项可索引的内存空间为2MB。对于内存大页,在分配内存时,可忽略现有技术中的最末级页表,而采用倒数第二级页表的页表项来索引一个内存大页。作为另一个例子,在页表项中提供附加标记来指示该页表项所索引的是内存大页。依然作为另一个例子,为内存大页提供独立的索引,而不必利用传统的页表或多级页表。
操作103,根据预设第二大小将每个内存大页分割为内存块,并将所有内存大页分割得到的内存块组织为内存块池。
在根据本发明的实施例中,将内存大页分割为内存块,每个内存大页包括多个内存块,每个内存块的大小可以为4KB,也可以为其他大小,在此不做限制。在一个例子中,通过提供索引来组织内存块池。在一个例子中,为内存块池中的每个内存块提供索引条目。在又一个例子中,为内存块池中的未使用的内存块提供索引条目。在依然又一个例子中,为内存块池中已使用的内存块提供索引条目。
操作104,对内存块池进行管理,管理内存块池中的空闲内存块。
为管理空闲内存块,在一个例子中,为内存块池中的未使用的内存块提供索引条目,在从内存块池中分配内存块时,通过索引获取尚未被分配的空闲内存块,将所分配的内存块对应的索引条目从索引中移除,而在将内存块释放回内存块池时,向索引中插入对该内存块的索引条目。类似地,在另一个例子中,通过提供索引来组织内存块池,并在索引条目中标记对应的内存块的使用情况,以及在分配与释放内存块时,在索引条目中修改相应的标记。
在进一步的实施例中,在并发环境下对内存块池进行管理,管理所使用的机制可以为有锁或无锁机制。例如,可以使用CAS(比较与交换,Compare and Swap)无锁list机制对内存块池进行管理,使内存的申请和释放无需锁操作,从而提高在并发环境下对内存块的申请和释放效率。
所管理的空闲内存块,为完整的,其内存尚未被分配的内存块。
进一步的,本实施例提供的内存块中,设有至少一个节点,每个节点对应已释放内存区、已分配内存区和待分配内存区中的一种。内存块中还设有指针,用于标记内存块的待分配内存区的起始位置。当基于内存块而分配内存时,调整指针的位置。该指针仅用来指示待分配内存区,而并不随内存的释放而发生改变。
对于从内存块池中新申请的空闲内存块,仅具有一个节点,对应待分配内存区,也即该内存块所能被分配的内存。在内存块中提供指针,指向待分配内存区的起始位置。
当从该内存块中分配内存时,从该指针指向的位置开始,分配所请求长度的内存,并移动指针,使之依然指向待分配内存区的起始位置。创建另一个节点,用来对应已分配的内存。若该内存块的待分配内存区的大小无法满足内存分配请求,则指示内存分配失败。
当向该内存块释放内存时,将对应所释放内存的节点标记为已释放。在一个例子中,待释放的内存是由一个对应已分配内存区的节点所指示完整内存区,则将该节点标记为已释放。在另一个例子中,待释放的内存是由一个对应已分配内存区的节点所指示完整内存区的部分,在此情况下,创建一个或多个新的节点,分别指示地址空间连续的已释放内存区和/或已分配内存区。在依然另一个例子中,待释放的内存是由多个对应已分配内存区的节点所指示完整内存区,则将该多个节点合并为一个节点,并使该节点对应已释放内存区。
参看图2,图2为根据本发明实施例的内存分配方法中内存块的示意图。在图2的例子中,内存块包括块信息以及由四个节点所对应的内存区。四个节点中,前两个节点是已释放内存区,第三个节点为已分配内存区,最后一个节点为待分配内存区。还提供指针,用来标记当前分配位置。在当前分配位置之后的内存区为待分配内存区,在当前分配位置之前的内存区为已分配内存区和/或已释放内存区。
如果从内存块中分配指定大小的内存,可以将从当前分配位置开始的指定大小的内存作为被分配的内存区;分配后,这段内存区成为已分配内存区,指针则指向余下的待分配内存区。在根据本发明的实施例的内存分配过程中,指针仅向后移动。参看图2,在图2中,指针向后移动,含义是向右方移动指针,或者是向地址增加的方向移动指针。当从指针指向的当前分配位置开始分配内存后,指针指向余下的待分配内存区。即使从内存块中释放内存,使得指针指向的当前分配位置之前(图2中,当前分配位置之前,含义是指针位置的左侧;或者,当前分配位置之前,指相对当前位置地址减小的方向)出现已释放内存区,也不调整指针所指向的位置。
如果从内存块中释放指定的内存时,在内存块中标记对应的内存区为已释放内存区。
内存块中还可以设有块信息,用于记录指针、节点等信息。
内存块使用上述结构时,直接从指针标记的当前分配位置进行内存分配,无需从头开始查找合适的内存,从而减少内存分配产生的碎片,大大提高内存的分配效率。
如图3所示,本发明实施例提供的内存分配方法和装置,将内存分成三层进行组织和管理,最底层为大页管理层,第二层为内存块池,最上层为内存分配层。
在大页管理层,利用大页机制从物理内存中分割第一数目个第一大小的内存大页,该内存大页用于对程序的内存分配;由于使用大页机制,分割出的内存的页表条目较少,能够被TLB所容纳,从而减少TLB未命中和缺页中断,进而避免性能颠簸。
将内存大页分割为内存块。内存块池组织和管理来自一个或多个内存大页的内存块。在内存块池可以使用有锁或无锁机制对内存块进行管理。内存块池中维护的是空闲内存块,该空闲内存块指的是完整的,其内存尚未被分配给应用程序或其他申请内存的内存块。
内存分配层负责为上层程序提供申请内存以及释放内存的接口,从而响应上层程序的申请内存或释放内存的请求。在内存分配层提供一个活动内存块和多个回收内存块,一个或多个回收内存块构成回收内存块列表。在图3的例子中,在内存分配层提供内存分配模块,用于响应内存分配请求。通过内存分配模块还可访问活动内存块以及回收内存块列表。
在接收到内存分配请求时,通过活动内存块进行内存分配;分配成功时,返回分配的内存地址;分配失败时,将活动内存块放入回收内存块列表,并向内存块池申请空闲内存块;申请成功时,将申请得到的空闲内存块作为活动内存块,并根据内存分配请求在该活动内存块进行内存分配,返回分配地址;将从活动内存块中分配内存的方式称为“快速内存分配”。少数情况下,内存块池无法提供空闲内存块,可以通过“慢速内存分配”来分配内存。“慢速内存分配”为空闲内存块申请失败时,遍历回收内存块列表,从回收内存块列表中的回收内存块中进行内存分配。在下文中将详细描述“快速内存分配”与“慢速内存分配”的实施方式。
实施例2
如图4所示,公开了根据本发明实施例的内存分配方法,包括:
操作401,接收内存分配请求。
在根据本发明的实施例中,内存分配请求,可以来自应用程序、驱动程序和/或操作系统内核等任何需要使用内存的程序。可以为一个进程发起的,也可以为多个进程发起的并发请求。对于来自多个进程的并发的内存分配请求,可以串行处理,也可以并发地响应多个请求。
操作402,访问活动内存块。
在根据本发明的实施例中,提供一个活动内存块,用于进行快速内存分配。可通过提供指针或其他索引方式使得活动内存块可被访问。在一个例子中,在初始化阶段,从内存块池分配一个内存块作为活动内存块。随着内存分配的进行,旧的活动内存块可能被回收,并从内存块池中分配内存块作为新的活动内存块。在根据本发明的实施例中,努力保证任意时刻,总是存在一个活动内存块,用于响应快速内存分配。
操作403,根据该内存分配请求从活动内存块中分配第一内存。
活动内存块中包括待分配内存区,还提供对活动内存块的待分配内存区的索引。通过索引获得待分配内存区,并从待分配内存区中分配第一内存。在进一步的例子中,活动内存块中还包括已分配内存区,对应于活动内存块中已被分配使用的内存部分。在依然进一步的例子中,活动内存块中还包括已释放内存区,对应于活动内存块中已被释放的内存部分。通过节点索引待分配内存区、已分配内存区和/或已释放内存区。在一个例子中节点信息存储在内存块中;在另一个例子中,通过内存块之外的存储空间中存储一个或多个内存块的节点信息。
在根据本发明的一个实施例中,提供指针索引活动内存块的待分配内存区的起始位置。从指针所指向的待分配内存区的起始位置分配第一内存。在进一步的例子中,在从待分配内存区中分配了内存后,还调整指针的位置使之指向分配了内存后的待分配内存区的起始位置。还可以创建第一节点来标记所分配的第一内存,该第一节点对应于已分配内存区。
操作404,判断第一内存分配是否成功。
当通过操作404确定第一内存分配成功时,执行操作405。在活动内存块的待分配内存区足够大能满足内存分配请求时,第一内存可成功分配。在由于活动内存块已经响应其他内存分配请求,活动内存块的待分配内存区不足以满足内存分配请求时,第一内存的分配失败。
操作405,返回指示所分配内存的第一内存地址。
在根据本发明的实施例中,从待分配内存区中分配了第一内存,返回第一内存地址作为对内存分配请求的响应。发出内存分配请求的程序或进程可通过第一内存地址使用所分配的内存。
通过图4的实施例,描述了“快速内存分配”过程。在“快速内存分配”中,通过直接从当前分配位置分配内存,而不用从头开始查找合适的内存,因此减少内存分配的碎片,大大提高内存分配效率。
实施例3
如图5所示,提供了根据本发明又一实施例的内存分配方法。
操作501至操作505,根据内存分配请求从活动内存块中分配第一内存,并在分配成功时返回分配的第一内存地址。该过程与图4所示的操作401至操作405相似,在此不再一一赘述。
在根据图5的实施例中,当在操作504确定第一内存分配失败时,执行操作506。
操作506,将活动内存块放入回收内存块列表,并向内存块池申请空闲内存块。
在根据本发明的实施例中,当活动内存块的空闲内存(待分配内存区)不足时,则无法通过活动内存块完成第一内存分配。此时通过操作506向内存块池申请空闲内存块,作为新的活动内存块,而旧的内存块被放入回收内存块列表。内存块池,包括从至少一个内存大页分割得到的多个内存块;至少一个内存大页为采用大页机制从物理内存中预留出来的。
需要指出的是,回收内存块列表中包括一个或多个回收内存块。活动内存块被放入回收内存块列表中,此后该活动内存块被称为回收内存块。回收内存块的结构同活动内存块相同。例如回收内存块中包括至少一个节点,每个节点对应已释放内存区、已分配内存区和待分配内存区的至少一种。
在“快速内存分配”中,通过活动内存块分配内存,而不尝试通过回收内存块分配内存。虽然在回收内存块列表中的回收内存块中可能存在满足内存分配请求的待分配内存区或已释放内存区,但查找该内存区是不容易的。为了加快内存分配过程,在“快速内存分配”中仅从活动内存块分配内存。
操作507,判断空闲内存块是否申请成功。当通过操作507确定空闲内存块申请成功时,执行操作508。在根据本发明的实施例中,若内存块池中存在空闲内存块,则空闲内存块的申请将成功。若内存块池中已不存在空闲内存块,则空闲内存块的申请失败。操作508,将申请得到的空闲内存块作为活动内存块,并根据内存分配请求从该活动内存块中分配第二内存。
在根据本发明的实施例中,操作508中,将申请得到的空闲内存块作为活动内存块。此时活动内存块为新申请的空闲内存块,其中有足够的待分配内存区用于内存分配。通过移动指针,创建对应已分配内存区的节点其中第二节点索引所分配的第二内存。
操作509,返回指示所分配内存的第二内存地址。
在根据图5所示出的实施例中,从活动内存块中分配内存,而无需搜索空间内存空间,从而加快了内存分配过程。将从活动内存块中分配内存的方式称为“快速内存分配”。
少数情况下,内存块池无法提供空闲内存块,可以通过“慢速内存分配”来分配内存。在图6中描述了根据本发明实施例的“慢速内存分配”的过程。
实施例4
如图6所示,提供了根据本发明又一实施例的内存分配方法。
操作601至操作609,根据内存分配请求从活动内存块中分配第一内存,并在分配失败时,从内存块池中申请空闲内存块,申请成功时进行第二内存分配。该过程与图5所示的操作501至操作509相似,在此不再一一赘述。
在根据本发明的实施例中,通过操作607确定空闲内存块申请失败时,执行操作610。
操作610,根据内存分配请求遍历回收内存块列表,从回收内存块列表中的回收内存块中进行第三内存分配。
在回收内存块列表中包括一个或多个回收内存块。对于一个回收内存块,若其中的已释放内存区和/或待分配内存中具有可满足内存分配请求的连续的内存空间,则将以该连续的内存空间响应内存分配请求。若回收内存块列表中的任何一个回收内存块中都不具有可满足内存分配请求的连续的可分配内存空间,则该回收内存块列表中不存在可满足内存分配请求的第三内存。
操作611,判断第三内存是否分配成功。
在根据本发明的实施例中,当通过操作611确定第三内存分配成功时,执行操作612;当通过操作611确定第三内存分配失败时,执行操作613。
如果在回收内存块列表中的一个或多个回收内存块的任何一个回收内存块中找到可满足内存分配请求的连续的内存空间,则第三内存分配成功。而如果遍历了回收内存块列表中的所有回收内存块,依然未能找到满足内存分配请求的连续的内存空间,则第三内存分配失败。此时系统中已无法找到可满足内存分配请求的空闲内存。在此情况下,返回指示内存分配失败的信息,例如空值。
操作612,返回指示所分配内存的第三内存地址。
操作613,提示第三内存分配失败。
根据本发明的实施例提供的技术方案,利用数据流场景下接近先分配先释放的内存使用特点,采用快速分配与慢速分配相结合的内存分配策略进行内存管理。在根据图6的本发明实施例中,在“快速内存失败”的情况下,通过遍历回收内存块列表,寻找可分配的内存,提高了内存利用率。
实施例5
如图7所示,提供了根据本发明又一实施例的内存释放方法。程序或进程申请内存,使用内存后,会将内存释放。在根据本发明的实施例中,提供了内存释放方法。
操作706,响应于内存释放请求,确定对应的内存块。
在内存释放请求中提供内存地址,通过内存地址可确定待释放的内存对应的内存块。待释放的内存既可能位于活动内容块中,也可能位于回收内存块列表中。
当向内存块释放内存时,将对应所释放内存的节点标记为已释放。在一个例子中,待释放的内存是由一个对应已分配内存区的节点所指示完整内存区,则将该节点标记为已释放。在另一个例子中,待释放的内存是由一个对应已分配内存区的节点所指示完整内存区的部分,在此情况下,创建一个或多个新的节点,分别指示地址空间连续的已释放内存区和/或已分配内存区。在依然另一个例子中,待释放的内存是由多个对应已分配内存区的节点所指示完整内存区,则将该多个节点合并为一个节点,并使该节点对应已释放内存区。
操作707,判断该内存块的内存是否已经全部释放。
在根据本发明的实施例中,通过操作707确定该内存块的内存已全部释放时,执行操作708。通过操作707确定该内存块的内存未全部释放时,无需执行进一步的操作。当内存块中的内存区都是已释放内存区,或者内存块中仅有已释放内存区和待分配内存区,而不存在已分配内存区时,认为该内存块的内存已全部释放。
操作708,将内存块释放回内存块池。
在一个例子中,为内存块池中的未使用的内存块提供索引条目,在将内存块释放回内存块池时,向索引中插入对该内存块的索引条目。类似地,在另一个例子中,通过提供索引来组织内存块池,并在索引条目中标记对应的内存块的使用情况,以及在内存块时,在索引条目中修改相应的标记。在进一步的例子中,若待释放的内存块是活动内存块,则无需将该活动内存块释放回内存池。该活动内存块的内存区均为待分配内存区,并可响应内存分配请求。若待释放的内存块是回收内存块,则从回收内存块列表中取出该回收内存块,并放回内存块池。
在根据本发明的实施例中,内存的分配与释放过程分别执行。对于某一次内存分配请求,可能由于内存块池中已不存在空闲内存块,而回收内存块列表中也找不到满足内存分配请求的内存块,该内存分配请求无法被满足。随后出现内存释放请求,向内存块池中释放了内存块,或者向回收内存块中释放了内存区,使得在快速内存分配过程中可从内存块池中申请内存块作为活动内存块,或者在慢速内存分配过程中可从回收内存块列表中找到满足内存分配请求的回收内存块,从而可响应后续的内存分配请求。
在根据图4-图6的实施例中,提供一个活动内存块来响应内存分配请求。当有多个程序或进程并发请求分配内存时,活动内存块成为临界资源,对活动内存块的访问需要串行执行并影响内存分配的整体性能。
在根据本发明的又一个实施例中,针对多个程序或进程并发请求分配内存的情形进行优化。图8展示了根据本发明实施例的内存分配方法和装置的内存组织。将内存分成三层结构进行组织和管理,最底层为大页管理层,第二层为内存块池,最上层为内存分配层。图8中的大页管理层与内存块池与图3中的大页管理层与内存块池彼此一致,在此不再赘述。
内存分配层负责为上层程序提供申请内存以及释放内存的接口,从而响应上层程序的申请内存或释放内存的请求。特别的,内存分配层可以支持并发请求。在根据本发明的实施例中,在内存分配层提供哈希表,哈希表的表项对应的并发访问内存分配层的各个进程。通过对各个进程的ID进行哈希,找到哈希表中对应于该ID的表项。在图8中,展示了多个哈希表项(801、802、……、808)。在哈希表的每个表项下,提供一个活动内存块以及多个回收内存块。一个或多个回收内存块构成回收内存块列表。以此方式,将来自多个进程的并发的内存分配请求分发到多个活动内存块和/或回收内存块列表,从而活动内存块和/或回收内存块列表不再是临界资源。
内存分配层还可以使用其他有锁或无锁机制支持并发或非并发的内存分配请求,在此不作限制。
在收到内存分配请求时,通过发起内存分配请求的进程的ID找到对应的哈希表项,进而找到与该哈希表项对应的活动内存块和回收内存块列表。在分配内存时,首先在该活动内存块中分配,该过程即为“快速内存分配”。如果活动内存块的空闲内存不足,无法完成内存分配时,将活动内存块放入回收内存块列表,并从内存块池中获取空闲内存块,作为与该哈希表项对应的活动内存块。少数情况下,内存块池无法提供空闲内存块,则通过“慢速内存分配”方式来分配内存。通过对进程的ID进行哈希,能够减少内存并发操作冲突的粒度,提高并发操作效率;而且利用数据流应用场景下接近先分配先释放的内存使用特点,采用快速分配与慢速分配相结合的内存分配策略。
实施例6
参看图9,提供了根据本发明又一实施例的内存分配方法。
操作901,接收内存分配请求。在根据本发明的实施例中,内存分配请求,可以来自应用程序、驱动程序和/或操作系统内核等任何需要使用内存的程序。可以为一个进程发起的,也可以为多个进程发起的并发请求。对于来自多个进程的并发的内存分配请求,并发地响应多个内存分配请求。操作902,对于内存分配请求,访问该内存分配请求对应的活动内存块。在一个实施例中,为每一个进程提供一个活动内存块,从而将不同进程的内存分配请求分发到不同的活动内存块,降低了内存访问冲突。在一个例子中,基于进程的ID访问与该进程相对应的活动内存块。参看图8,对进程ID执行哈希操作,得到与该进程ID相对应的哈希条目。通过该哈希条目,可访问与该进程相对应的活动内存块。在另一个例子中,通过链表或线性表索引与进程相对应的活动内存块。
操作903,根据该内存分配请求从活动内存块中分配第一内存。参看图8,在活动内存块中包括待分配内存区,还通过指针索引活动内存块的待分配内存区。通过指针获得待分配内存区,并从待分配内存区中分配第一内存。指针指向待分配内存区的起始位置。从指针所指向的待分配内存区的起始位置分配第一内存。
在进一步的例子中,活动内存块中还包括已分配内存区,对应于活动内存块中已被分配使用的内存部分。在依然进一步的例子中,活动内存块中还包括已释放内存区,对应于活动内存块中已被释放的内存部分。通过节点索引待分配内存区、已分配内存区和/或已释放内存区。在一个例子中节点信息存储在内存块中;在另一个例子中,通过内存块之外的存储空间中存储一个或多个内存块的节点信息。
在进一步的例子中,在从待分配内存区中分配了内存后,还调整指针的位置使之指向分配了内存后的待分配内存区的起始位置。还可以创建第一节点来标记所分配的第一内存,该第一节点对应于已分配内存区。
操作904,判断第一内存是否分配成功。
当通过操作904确定第一内存分配成功时,执行操作905;否则,执行操作906。在活动内存块的待分配内存区足够大能满足内存分配请求时,第一内存可成功分配。在由于活动内存块已经响应其他内存分配请求,活动内存块的待分配内存区不足以满足内存分配请求时,第一内存的分配失败。
操作905,返回指示所分配内存的第一内存地址。
在根据本发明的进一步的实施例中,通过每个哈希表项,还可索引回收内存块列表。以此方式,为发出内存分配请求的进程提供回收内存列表。
若在操作904,判断第一内存分配失败,则将与发出该内存分配请求的进程对应的活动内存块放入与发出该内存分配请求的进程对应的回收内存块列表。向内存块池申请空闲内存块。若从内存块池中成功申请到空闲内存块,则将申请到的空闲内存块作为与发出该内存分配请求的进程对应的活动内存块,并根据内存分配请求在该活动内存块中进行第二内存分配。并将指示所分配内存的第二内存地址返回给发出分配请求的进程。
由于来自多个进程的内存分配请求都可能访问内存块池来申请空闲内存块,内存块池成为临界资源。在内存块池可以使用有锁或无锁机制对内存块进行管理,该管理可以在单一进程或并发进程的环境下进行。特别的,内存块池可以采用CAS无锁list机制对内存块进行管理,从而提高在并发环境下对内存块的申请和释放效率。
在图9所展示的实施例中,在收到内存分配请求时,通过发起内存分配请求的进程的ID找到对应的哈希表项,进而找到与该哈希表项对应的活动内存块和回收内存块列表。在分配内存时,在活动内存块中分配,这一过程也被称为为“快速内存分配”。通过对进程的ID进行哈希,能够减少内存并发操作冲突的粒度,提高并发操作效率。
实施例7
参看图10,提供了根据本发明的依然又一实施例的内存分配方法。
操作1001至操作1005,根据内存分配请求,访问与内存分配请求相对应的活动内存块,从活动内存块中分配第一内存。该过程与图9所示的操作901至操作905相似,在此不再赘述。
在操作1004分配失败时,在操作1006,将与发出该内存分配请求的进程对应的活动内存块放入与发出该内存分配请求的进程对应的回收内存块列表,并向内存块池申请空闲内存块。在操作1007,若从内存块池中成功申请到空闲内存块,在操作1008,将申请到的空闲内存块作为与发出该内存分配请求的进程对应的活动内存块,并根据内存分配请求在该活动内存块中进行第二内存分配。在操作1009将指示所分配内存的第二内存地址返回给发出分配请求的进程。
在根据本发明的实施例中,在操作1007确定空闲内存块申请失败时,转向操作1010。
在操作1010,访问其他活动内存块,尝试从其他活动内存块中分配第三内存。其他活动内存块是同发出该内存分配请求的进程不同的其他进程相对应的活动内存块。在一个例子中(参看图8),发出该内存分配请求的进程对应于哈希表项801。在操作1010,遍历不同于哈希表项801的其他哈希表项(802、803、……、808),访问与其他哈希表项的一个所对应的活动内存块,若从这些其他活动内存块之一中分配第三内存成功,则返回指示所分配的内存的第三内存地址,以响应内存分配请求。在另一个例子中,通过链表或线性表来索引与不同进程所对应的活动内存块。
在操作1010,若从其他活动内存块中分配第三内存失败,则转向操作1011。在操作1011,遍历回收内存块列表,从回收内存块列表中的回收内存块中进行第四内存分配。
在图8示出的例子中,在一个回收内存块列表中包括一个或多个回收内存块。对于一个回收内存块,若其中的已释放内存区和/或待分配内存中具有可满足内存分配请求的连续的内存空间,则将以该连续的内存空间响应内存分配请求。若回收内存块列表中的任何一个回收内存块中都不具有可满足内存分配请求的连续的可分配内存空间,则该回收内存块列表中不存在可满足内存分配请求的第三内存。
依然参看图8,在一个例子中,多个哈希条目(801、802、……、808)的每个都具有对应的回收内存块列表。回到图10,在操作1011,遍历各个回收内存块列表,以寻找可用来分配第四内存的回收内存块。在另一个例子中,多个哈希条目(801、802、……、808)索引同一个回收内存块列表。在操作1011,遍历该回收内存块列表,以寻找可用来分配第四内存的回收内存块。在依然另一个例子中,通过链表或线性来作为哈希表的可选替代方式。
在操作1012,判断从回收内存块列表中分配第四内存是否成功。若第四内存分配成功,在操作1013,返回所分配的第四内存的地址,用以响应内存分配请求。若在操作1012判断第四内存分配失败,返回指示内存分配失败的信息,例如空值。
操作1010-操作1013所进行的内存分配,也称为“慢速内存分配”。在应用本发明的实施例时,绝大多数情况下,通过“快速内存分配”过程可成功响应内存分配请求。
少数情况下,内存块池无法提供空闲内存块,则通过“慢速内存分配”方式来分配内存。通过对进程的ID进行哈希,能够减少内存并发操作冲突的粒度,提高并发操作效率;而且利用数据流应用场景下接近先分配先释放的内存使用特点,采用快速分配与慢速分配相结合的内存分配策略。
实施例8
如图11所示,本发明实施例提供的内存分配装置,包括:
用于接收内存分配请求的第一模块1101。
在根据本发明的实施例中,内存分配请求,可以来自应用程序、驱动程序和/或操作系统内核等任何需要使用内存的程序。可以为一个进程发起的,也可以为多个进程发起的并发请求。对于来自多个进程的并发的内存分配请求,可以串行处理,也可以并发地响应多个请求。
用于访问活动内存块的第二模块1102。
在根据本发明的实施例中,提供一个活动内存块,用于进行快速内存分配。可通过提供指针或其他索引方式使得活动内存块可被访问。在一个例子中,在初始化阶段,从内存块池分配一个内存块作为活动内存块。随着内存分配的进行,旧的活动内存块可能被回收,并从内存块池中分配内存块作为新的活动内存块。在根据本发明的实施例中,努力保证任意时刻,总是存在一个活动内存块,用于响应快速内存分配。
用于根据内存分配请求从活动内存块中分配第一内存的第三模块1103。
活动内存块中包括待分配内存区,还提供对活动内存块的待分配内存区的索引。通过索引获得待分配内存区,并从待分配内存区中分配第一内存。在进一步的例子中,活动内存块中还包括已分配内存区,对应于活动内存块中已被分配使用的内存部分。在依然进一步的例子中,活动内存块中还包括已释放内存区,对应于活动内存块中已被释放的内存部分。通过节点索引待分配内存区、已分配内存区和/或已释放内存区。在一个例子中节点信息存储在内存块中;在另一个例子中,通过内存块之外的存储空间中存储一个或多个内存块的节点信息。
在根据本发明的一个实施例中,提供指针索引活动内存块的待分配内存区的起始位置。从指针所指向的待分配内存区的起始位置分配第一内存。在进一步的例子中,在从待分配内存区中分配了内存后,还调整指针的位置使之指向分配了内存后的待分配内存区的起始位置。还可以创建第一节点来标记所分配的第一内存,该第一节点对应于已分配内存区。
用于当第一内存分配成功时,返回指示所分配内存的第一内存地址的第四模块1104。
在活动内存块的待分配内存区足够大能满足内存分配请求时,第一内存可成功分配。在由于活动内存块已经响应其他内存分配请求,活动内存块的待分配内存区不足以满足内存分配请求时,第一内存的分配失败。在根据本发明的实施例中,从待分配内存区中分配了第一内存,返回第一内存地址作为对内存分配请求的响应。发出内存分配请求的程序或进程可通过第一内存地址使用所分配的内存。通过上述模块实现内存管理的过程,与本发明实施例2提供的相似,在此不再一一赘述。
进一步的,本实施例提供的内存分配装置,还可以包括:
当第一内存分配失败时,用于将活动内存块放入回收内存块列表,并向内存块池申请空闲内存块的模块;
如果申请成功,用于将申请得到的空闲内存块作为活动内存块,并根据内存分配请求从该活动内存块中分配第二内存的模块;
用于返回指示所分配内存的第二内存地址的模块。
进一步的,本实施例提供的内存分配装置,还可以包括:
当空闲内存块申请失败时,用于根据内存分配请求遍历回收内存块列表,从回收内存块列表中的回收内存块中进行第三内存分配的模块;
当第三内存分配成功时,用于返回指示所分配内存的第三内存地址的模块。
进一步的,本实施例提供的内存分配装置,还可以包括:
用于响应于内存释放请求,确定对应的内存块的模块;
用于判断内存块的内存是否已经全部释放的模块;
如果是,用于将内存块释放回内存块池的模块。
具体的,用于根据内存分配请求从活动内存块中分配第一内存的模块,可以包括:用于根据指针确定活动内存块的待分配内存区的起始位置的子模块;用于从待分配内存区的起始位置分配第一内存的子模块;其中活动内存块中预设有至少一个节点,每个节点对应已释放内存区、已分配内存区和待分配内存区中的一种;活动内存块中还预设有指针,用于标记活动内存块的待分配内存区的起始位置。
内存分配请求为并发请求时,用于根据预设页表确定内存分配请求对应的活动内存块的模块,包括:用于分别获取发起每个分配请求的进程的ID的子模块;用于分别获取与每个ID一一对应的表项的子模块;用于分别确定每个表项对应的活动内存块子模块。
当空闲内存块申请失败时,用于根据内存分配请求遍历回收内存块列表的模块,包括:当空闲内存块申请失败时,用于尝试从其他活动内存块中分配第四内存的子模块;当第四内存分配成功时,用于返回指示所分配内存的第四内存地址的子模块;当第四内存分配失败时,用于根据内存分配请求遍历所述回收内存块列表的子模块。
在本实施例中,通过上述模块实现内存分配的过程,与本发明实施例3至7提供的相似,在此不再一一赘述。
实施例9
如图12所示,提供了根据本发明的依然又一实施例的内存分配装置,包括:
用于指示采用大页机制从物理内存中分割第一数目个第一大小的内存大页的第五模块1201。
在根据本发明的实施例中,在进行内存分配之前,首先进行初始化,采用大页机制预留内存,从而减少TLB未命中和缺页中断,进而避免性能颠簸,方便内存管理。预留内存的方式为通过操作101指示采用大页机制从物理内存中分割内存大页,该预留的内存大页用于对程序的内存分配。由于使用大页机制,所分割的内存大页对应的页表的条目较少,从而完整的页表可被装载到TLB中,减少TLB未命中和缺页中断,进而避免性能颠簸。
用于配置每个内存大页的页表项的第六模块1202。
在根据本发明的实施例中,物理内存中未分割部分,可以采用传统方式分页,即分割成4KB等大小的块。现有技术中采用多级页表的方式来索引内存页。最末级页表的每个页表项用来索引一个4KB大小的内存页,而倒数第二级页表的每个页表项用来索引512个最末级页表项,因而倒数第二级页表的每个页表项可索引的内存空间为2MB。对于内存大页,在分配内存时,可忽略现有技术中的最末级页表,而采用倒数第二级页表的页表项来索引一个内存大页。作为另一个例子,在页表项中提供附加标记来指示该页表项所索引的是内存大页。依然作为另一个例子,为内存大页提供独立的索引,而不必利用传统的页表或多级页表。
用于根据预设第二大小将每个内存大页分割为内存块,并将所有内存大页分割得到的内存块组织为内存块池的第七模块1203。
在根据本发明的实施例中,将内存大页分割为内存块,每个内存大页包括多个内存块,每个内存块的大小可以为4KB,也可以为其他大小,在此不做限制。在一个例子中,通过提供索引来组织内存块池。在一个例子中,为内存块池中的每个内存块提供索引条目。在又一个例子中,为内存块池中的未使用的内存块提供索引条目。在依然又一个例子中,为内存块池中已使用的内存块提供索引条目。
用于对内存块池进行管理,管理内存块池中的空闲内存块的第八模块1204。
为管理空闲内存块,在一个例子中,为内存块池中的未使用的内存块提供索引条目,在从内存块池中分配内存块时,通过索引获取尚未被分配的空闲内存块,将所分配的内存块对应的索引条目从索引中移除,而在将内存块释放回内存块池时,向索引中插入对该内存块的索引条目。类似地,在另一个例子中,通过提供索引来组织内存块池,并在索引条目中标记对应的内存块的使用情况,以及在分配与释放内存块时,在索引条目中修改相应的标记。
在本实施例中,通过上述模块实现内存分配的过程与本发明实施例1提供的相似,在此不再一一赘述。
在本实施例中,为减少内存分配的碎片,内存块中设有至少一个节点,每个节点对应已释放内存区、已分配内存区和待分配内存区中的一种;内存块中还设有指针,用于标记内存块的当前分配位置;此时,该内存分配装置,还包括:当内存块池中的内存块被分配或释放时,用于调整指针的位置的模块。
本发明实施例还提供一种包含计算机程序代码的计算机程序,当被载入计算机系统并在计算机系统上执行时,所述计算机程序代码使所述计算机系统执行上面所述的方法。
本发明实施例还提供一种包括程序代码的程序,当被载入存储设备并在存储设备上执行时,所述计程序代码使所述存储设备执行上面所述的方法。
应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以分别由包括计算机程序指令的各种装置来实施。这些计算机程序指令可以加载到通用计算机、专用计算机或其他可编程数据控制设备上以产生机器,从而在计算机或其他可编程数据控制设备上执行的指令创建了用于实现一个或多个流程图框中指定的功能的装置。
这些计算机程序指令还可以存储在可以引导计算机或其他可编程数据控制设备的计算机可读存储器中从而以特定方式起作用,从而能够利用存储在计算机可读存储器中的指令来制造包括用于实现一个或多个流程图框中所指定功能的计算机可读指令的制品。计算机程序指令还可以加载到计算机或其他可编程数据控制设备上以使得在计算机或其他可编程数据控制设备上执行一系列的操作操作,从而产生计算机实现的过程,进而在计算机或其他可编程数据控制设备上执行的指令提供了用于实现一个或多个流程图框中所指定功能的操作。
因而,框图和流程图的框支持用于执行指定功能的装置的组合、用于执行指定功能的操作的组合和用于执行指定功能的程序指令装置的组合。还应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以由执行指定功能或操作的、基于硬件的专用计算机系统实现,或由专用硬件和计算机指令的组合实现。
上述的不同块、操作以及技术的至少一部分可以被执行,通过使用硬件,控制设备执行固件指令,控制设备执行软件指令,或者及其任意组合。当采用执行固件以及软件指令的控制设备执行时,软件或固件指令可以被存储在任意计算机可读存储介质中,例如磁盘,光盘或者其他存储介质,在RAM或者ROM或者flash存储器,控制设备,硬盘,光盘,磁盘等等。同样地,软件和固件指令可以被传输到用户或者系统,通过任意已知的或者期望的传输方式包括,例如,在计算机可读盘或者其他便携式计算机存储机制或者通过通信媒介。通信媒介典型地具体化计算机可读指令,数据结构,序模块或者在已调制数据信号中的其它数据例如载波或者其他传输机制。通过示例,并非限制,通信介质包括有线介质例如有线网络或者单线连接,以及无线媒介,例如声、无线频率,红外以及其它无线介质。从而,软件和固件指令可以被传输给用户或者系统,通过通信信道,例如电话线,DSL线,电缆电视线,光纤线缆,无线信道,因特网,等等(通过便携式存储介质提供这样的软件,其被看作是相同的或者可互换的)。软件或者固件指令可以包括机器可读指令,这些可读指令在由控制设备执行时,导致控制设备执行不同动作。
当在硬件中执行时,硬件可以包括一个或多个离散组件,集成电路,应用的集成电路(ASIC),等等。
需要理解的是,本发明可以以纯软件、纯硬件、固件以及上述的各种组合来实现。硬件例如可以是控制设备、专用集成电路、大规模集成电路等等。
虽然当前发明参考的示例被描述,其只是为了解释的目的而不是对本发明的限制,对实施方式的改变,增加和/或删除可以被做出而不脱离本发明的范围。
这些实施方式所涉及的、从上面描述和相关联的附图中呈现的教导获益的领域中的技术人员将认识到这里记载的本发明的很多修改和其他实施方式。因此,应该理解,本发明不限于公开的具体实施方式,旨在将修改和其他实施方式包括在所附权利要求书的范围内。尽管在这里采用了特定的术语,但是仅在一般意义和描述意义上使用它们并且不是为了限制的目的而使用。

Claims (10)

1.一种内存分配方法,包括:
接收内存分配请求;
访问活动内存块;
根据所述内存分配请求从所述活动内存块中分配第一内存;
当所述第一内存分配成功时,返回指示所分配内存的第一内存地址。
2.根据权利要求1所述的内存分配方法,还包括:
当所述第一内存分配失败时,将所述活动内存块放入回收内存块列表,并向内存块池申请空闲内存块;
当空闲内存块申请成功时,将申请得到的空闲内存块作为活动内存块,并根据所述内存分配请求从该活动内存块中分配第二内存;
返回指示所分配内存的第二内存地址。
3.根据权利要求2所述的内存分配方法,还包括:
当空闲内存块申请失败时,根据所述内存分配请求遍历所述回收内存块列表,从所述回收内存块列表中的回收内存块中进行第三内存分配;
当所述第三内存分配成功时,返回指示所分配内存的第三内存地址。
4.根据权利要求2或3所述的内存分配方法,其中
所述内存块池包括从至少一个内存大页分割得到的多个内存块;所述至少一个内存大页为采用大页机制从物理内存中预留的。
5.根据权利要求1至4中任意一项所述的内存分配方法,还包括:
响应于内存释放请求,确定对应的内存块;
判断所述内存块的内存是否已经全部释放;
如果是,将所述内存块释放回所述内存块池。
6.根据权利要求1至5中任意一项所述的内存分配方法,其中,所述根据所述内存分配请求从所述活动内存块中分配第一内存,包括:
根据指针确定所述活动内存块的待分配内存区的起始位置;以及
从所述待分配内存区的起始位置分配第一内存;
其中所述活动内存块中预设有至少一个节点,每个节点对应已释放内存区、已分配内存区和待分配内存区中的一种;所述活动内存块中还预设有指针,用于标记所述活动内存块的待分配内存区的起始位置。
7.根据权利要求3所述的内存分配方法,其中,所述当空闲内存块申请失败时,根据所述内存分配请求遍历所述回收内存块列表包括:
当空闲内存块申请失败时,尝试从其他活动内存块中分配第四内存;
当所述第四内存分配成功时,返回指示所分配内存的第四内存地址;
当所述第四内存分配失败时,根据所述内存分配请求遍历所述回收内存块列表,从所述回收内存块列表中的回收内存块中进行第五内存分配。
8.一种内存分配方法,包括:
指示采用大页机制从物理内存中分割第一数目个第一大小的内存大页,所述内存大页用于对程序的内存分配;
配置每个内存大页的页表项;
根据预设第二大小将每个内存大页分割为内存块,并将所有内存大页分割得到的内存块组织为内存块池;
对所述内存块池进行管理,管理内存块池中的空闲内存块。
9.一种内存分配装置,包括:
用于接收内存分配请求的第一模块;
用于访问活动内存块的第二模块;
用于根据所述内存分配请求从所述活动内存块中分配第一内存的第三模块;
用于当所述第一内存分配成功时,返回指示所分配内存的第一内存地址的第四模块。
10.一种内存分配装置,包括:
用于指示采用大页机制从物理内存中分割第一数目个第一大小的内存大页的第五模块,所述内存大页用于对程序的内存分配;
用于配置每个内存大页的页表项的第六模块;
用于根据预设第二大小将每个内存大页分割为内存块,并将所有内存大页分割得到的内存块组织为内存块池的第七模块;
用于对所述内存块池进行管理,管理内存块池中的空闲内存块的第八模块。
CN201510514337.9A 2015-08-10 2015-08-20 内存分配方法与装置 Active CN106445835B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011112502.5A CN112162938A (zh) 2015-08-10 2015-08-20 大页内存分配方法及其计算机

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN201510487738 2015-08-10
CN201510487738X 2015-08-10

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN202011112502.5A Division CN112162938A (zh) 2015-08-10 2015-08-20 大页内存分配方法及其计算机

Publications (2)

Publication Number Publication Date
CN106445835A true CN106445835A (zh) 2017-02-22
CN106445835B CN106445835B (zh) 2020-11-17

Family

ID=58093923

Family Applications (2)

Application Number Title Priority Date Filing Date
CN201510514337.9A Active CN106445835B (zh) 2015-08-10 2015-08-20 内存分配方法与装置
CN202011112502.5A Pending CN112162938A (zh) 2015-08-10 2015-08-20 大页内存分配方法及其计算机

Family Applications After (1)

Application Number Title Priority Date Filing Date
CN202011112502.5A Pending CN112162938A (zh) 2015-08-10 2015-08-20 大页内存分配方法及其计算机

Country Status (1)

Country Link
CN (2) CN106445835B (zh)

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108228339A (zh) * 2017-07-28 2018-06-29 珠海市魅族科技有限公司 一种内存回收方法及装置、终端设备及计算机可读存储介质
CN109508235A (zh) * 2018-09-28 2019-03-22 深圳市紫光同创电子有限公司 一种内存池管理方法、装置及计算机可读存储介质
CN110888822A (zh) * 2019-12-03 2020-03-17 北京小米智能科技有限公司 内存处理方法、装置及存储介质
CN111984374A (zh) * 2020-08-20 2020-11-24 海光信息技术有限公司 用于管理安全内存的方法及其系统、装置和存储介质
CN112783648A (zh) * 2021-01-18 2021-05-11 上海壁仞智能科技有限公司 基于内存区域的内存分配方法和设备以及访问方法和设备
CN113076266A (zh) * 2021-06-04 2021-07-06 深圳华云信息系统有限公司 一种内存管理方法、装置、电子设备及存储介质
CN116361012A (zh) * 2023-06-01 2023-06-30 荣耀终端有限公司 一种内存页分配方法及电子设备
CN116450055A (zh) * 2023-06-15 2023-07-18 支付宝(杭州)信息技术有限公司 一种多处理卡间的存储区域分配方法和系统
WO2023160397A1 (zh) * 2022-02-25 2023-08-31 阿里巴巴(中国)有限公司 内存管理方法以及装置
CN117573378A (zh) * 2024-01-15 2024-02-20 摩尔线程智能科技(北京)有限责任公司 内存管理方法、装置、设备及存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101149703A (zh) * 2007-10-10 2008-03-26 中兴通讯股份有限公司 一种固定内存的管理方法
CN101673246A (zh) * 2009-08-06 2010-03-17 深圳市融创天下科技发展有限公司 一种高效的先进先出数据池读写方法
CN103176911A (zh) * 2011-12-20 2013-06-26 陕西银河网电科技有限公司 一种嵌入式软件安全内存管理方法
CN103907099A (zh) * 2011-11-02 2014-07-02 华为技术有限公司 高速缓存一致性计算机系统中未缓存的短地址转换表
US9009565B1 (en) * 2013-03-15 2015-04-14 Pmc-Sierra, Inc. Systems and methods for mapping for solid-state memory

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101122883A (zh) * 2006-08-09 2008-02-13 中兴通讯股份有限公司 一种避免内存碎片化的内存分配方法
CN102446136B (zh) * 2010-10-14 2014-09-03 无锡江南计算技术研究所 自适应的大页分配方法及装置
CN102486751A (zh) * 2010-12-01 2012-06-06 安凯(广州)微电子技术有限公司 一种在微内存系统上实现小页nandflash虚拟大页的方法
CN102339302A (zh) * 2011-07-07 2012-02-01 曙光信息产业股份有限公司 一种基于hugetlbfs技术的龙芯刀片文件系统的实现方法
CN104166624B (zh) * 2013-05-15 2017-07-07 上海贝尔股份有限公司 在虚拟环境下基于物理内存的内存优化方法和装置

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101149703A (zh) * 2007-10-10 2008-03-26 中兴通讯股份有限公司 一种固定内存的管理方法
CN101673246A (zh) * 2009-08-06 2010-03-17 深圳市融创天下科技发展有限公司 一种高效的先进先出数据池读写方法
CN103907099A (zh) * 2011-11-02 2014-07-02 华为技术有限公司 高速缓存一致性计算机系统中未缓存的短地址转换表
CN103176911A (zh) * 2011-12-20 2013-06-26 陕西银河网电科技有限公司 一种嵌入式软件安全内存管理方法
US9009565B1 (en) * 2013-03-15 2015-04-14 Pmc-Sierra, Inc. Systems and methods for mapping for solid-state memory

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
XI-MIN WANG 等: "Design and Implementation of Memory Pools for Embedded DSP", 《2008 INTERNATIONAL CONFERENCE ON COMPUTER SCIENCE AND SOFTWARE ENGINEERING》 *
张晓辉等: "龙芯处理器上的TLB性能优化技术", 《计算机研究与发展》 *

Cited By (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108228339A (zh) * 2017-07-28 2018-06-29 珠海市魅族科技有限公司 一种内存回收方法及装置、终端设备及计算机可读存储介质
CN109508235A (zh) * 2018-09-28 2019-03-22 深圳市紫光同创电子有限公司 一种内存池管理方法、装置及计算机可读存储介质
CN110888822A (zh) * 2019-12-03 2020-03-17 北京小米智能科技有限公司 内存处理方法、装置及存储介质
CN111984374B (zh) * 2020-08-20 2021-07-23 海光信息技术股份有限公司 用于管理安全内存的方法及其系统、装置和存储介质
CN111984374A (zh) * 2020-08-20 2020-11-24 海光信息技术有限公司 用于管理安全内存的方法及其系统、装置和存储介质
CN112783648A (zh) * 2021-01-18 2021-05-11 上海壁仞智能科技有限公司 基于内存区域的内存分配方法和设备以及访问方法和设备
CN113076266A (zh) * 2021-06-04 2021-07-06 深圳华云信息系统有限公司 一种内存管理方法、装置、电子设备及存储介质
WO2023160397A1 (zh) * 2022-02-25 2023-08-31 阿里巴巴(中国)有限公司 内存管理方法以及装置
CN116361012A (zh) * 2023-06-01 2023-06-30 荣耀终端有限公司 一种内存页分配方法及电子设备
CN116361012B (zh) * 2023-06-01 2023-10-24 荣耀终端有限公司 一种内存页分配方法及电子设备
CN116450055A (zh) * 2023-06-15 2023-07-18 支付宝(杭州)信息技术有限公司 一种多处理卡间的存储区域分配方法和系统
CN116450055B (zh) * 2023-06-15 2023-10-27 支付宝(杭州)信息技术有限公司 一种多处理卡间的存储区域分配方法和系统
CN117573378A (zh) * 2024-01-15 2024-02-20 摩尔线程智能科技(北京)有限责任公司 内存管理方法、装置、设备及存储介质

Also Published As

Publication number Publication date
CN112162938A (zh) 2021-01-01
CN106445835B (zh) 2020-11-17

Similar Documents

Publication Publication Date Title
CN106445835A (zh) 内存分配方法与装置
US20160004468A1 (en) Data-storage device and flash memory control method
CN102968378B (zh) 一种内存分配和释放的方法、装置及系统
US20110246742A1 (en) Memory pooling in segmented memory architecture
US10705951B2 (en) Shared fabric attached memory allocator
CN104679669A (zh) 高速缓存cache存储器系统及访问缓存行cache line的方法
CN105117417A (zh) 一种读优化的内存数据库Trie树索引方法
GB2446071A (en) Method of dynamic memory management in an object oriented system
CN108279943B (zh) 索引加载方法和装置
CN104731799A (zh) 内存数据库管理装置
CN114546296B (zh) 一种基于zns固态硬盘的全闪存系统和地址映射方法
CN105718319B (zh) 一种内存池版图解析方法和内存池装置
CN105404691A (zh) 一种文件存储的方法及装置
CN104965793B (zh) 一种云存储数据节点装置
CN114327917A (zh) 内存管理方法、计算设备及可读存储介质
CN104967807A (zh) 一种缓存方法和装置
CN105389266A (zh) 一种数据管理方法及装置
CN104951370B (zh) 一种内存管理方法及装置
CN110955488A (zh) 一种持久性内存的虚拟化方法及系统
CN103514098B (zh) 用于回收存储空间的方法和系统
WO2023124423A1 (zh) 一种存储空间分配方法、装置、终端设备及存储介质
US11256630B2 (en) Cache address mapping method and related device
US10606822B2 (en) Dynamically updating metadata
CN116541132B (zh) 一种间接访问变量栈的管理方法和装置
CN103139604B (zh) 一种基于缓存模型的ipqam频点分配与回收方法

Legal Events

Date Code Title Description
C06 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
CP01 Change in the name or title of a patent holder

Address after: 100192 room A302, building B-2, Dongsheng Science Park, Zhongguancun, 66 xixiaokou Road, Haidian District, Beijing

Patentee after: Beijing yihengchuangyuan Technology Co.,Ltd.

Address before: 100192 room A302, building B-2, Dongsheng Science Park, Zhongguancun, 66 xixiaokou Road, Haidian District, Beijing

Patentee before: MEMBLAZE TECHNOLOGY (BEIJING) Co.,Ltd.

CP01 Change in the name or title of a patent holder