CN109690498B - 内存管理方法和设备 - Google Patents
内存管理方法和设备 Download PDFInfo
- Publication number
- CN109690498B CN109690498B CN201680086965.4A CN201680086965A CN109690498B CN 109690498 B CN109690498 B CN 109690498B CN 201680086965 A CN201680086965 A CN 201680086965A CN 109690498 B CN109690498 B CN 109690498B
- Authority
- CN
- China
- Prior art keywords
- memory
- memory block
- state
- idle
- allocation
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1041—Resource optimization
- G06F2212/1044—Space efficiency improvement
Abstract
本发明提供一种内存管理方法和内存管理设备,用于使用多个独立的空闲链表来执行内存分配和/或内存解分配,所述多个独立的空闲链表提供多个内存块的信息,其中,所述内存分配和/或内存解分配根据内存块的状态执行,并且所述内存块的状态包括:使用状态,指示处于使用状态的内存块正在被使用并且不可用于分配;链接状态,指示处于链接状态的内存块未被使用,且在多个独立的空闲链表的一个空闲链表中被链接,并且可用于分配;空闲状态,指示处于空闲状态的内存块未被使用,并且在所述多个独立的空闲链表的任何一个空闲链表内都未被链接,并且不可用于分配。
Description
技术领域
本发明提供一种内存管理方法和设备,用于使用多个独立的空闲链表来执行内存分配和/或内存解分配。此外,本发明涉及对应排列的计算机程序产品和对应排列的计算机可读介质。
背景技术
内存管理在所有计算系统和设备中都必不可少。在计算系统或设备上执行计算以及在计算系统或设备中处理数据时都需要内存资源。内存资源管理通常由内存分配器实现。典型的内存分配器是一个单独的内存记帐工具,其具有高效的接口来分配和解分配大小符合要求的内存块。在计算系统或设备中,请求内存分配器提供一定大小的块,从而执行一个或多个进程和/或将数据存储在计算系统或设备中。内存分配器评估该请求,检查是否有足够的内存来满足请求,准备已经定位好的块并返回块地址来响应该请求。稍后,通知内存分配器不再使用某一内存块。为响应此信息,内存分配器回收该块并可选地执行其他操作,例如合并。所有内存分配器的共同问题是内存细分(例如,参见Wilson,P.R.、Johnstone,M.S.、Neely,M.、Boles,D.(1995)“动态存储分配:调查和关键回顾”。内存管理:国际研讨会,Iwmm'95,英国金洛斯,1995年9月27至29日:会议录),也即,有多个小块可用时,但显然无法满足提供单个更大块的内存请求。为了避免细分,内存分配器执行相邻块的归并,也称为合并。一般认为合并是低效的,而且有相当大的开销。许多内存分配器的合并方案显著不同,这些合并模式都明确地旨在更高效地执行合并(例如,参见US2003/0084263A1、US7,610,468B2、US5,742,793A)。
人们对于不同的内存分配器已经有了数十年的了解。尽管它们的特性不同,但其中很多都具有一些共同的特性,例如,都有块边界标记,以支持合并;同时有链接字段,以组成空闲块的链表。一些内存分配器也使用查找表,区别地对待小目标,从不进行拆分或合并,甚至使用特殊的数据结构和算法,如快速列表和延迟合并以实现更好的性能(例如,参见Wilson,P.R.、Johnstone,M.S.、Neely,M.、Boles,D.(1995)“动态存储分配:调查和关键回顾”。内存管理:国际研讨会,Iwmm'95,英国金洛斯,1995年9月27至29日:会议录)。
这类中的最简单的内存分配器使用空闲链表的数组,每个链表只保留特定大小的空闲块。空闲块变得逻辑独立,但并非因其大小的物理上独立,因而显著降低查找成本。此方案的更高级变形方案中,使用边界标记和双链表以支持一般拆分和合并。简单的设计选择是对于尝试与其相邻块合并的块进行回收,并且一进行解分配就立即合并,但也可以使用延迟机制。
已知要实现立即合并,会造成每个小块一进行解分配时就重复执行合并,并且一进行由此产生的分配就很快重复地拆分合并的块。延迟合并解决了这个问题,仅在某些情况下进行合并,并一次运行多个块。这种方法仍然遇到了一些困难,因为块必须先定位并且合并也意味着从块的空闲链表中抽取块,这导致链接块的内存更新。在最坏的情况下,这些都是非本地内存更新。作为替代解决方案,称为快速列表的缓存数据结构可用于新回收的块。将最近释放的块放入其中,各个块之间不建立链接,因此造就相当宽松的合并机会。然而,这必然会增加最终设计和实现内存分配器的复杂性。
针对上面提到的概念,有两种已知的示例性实现方式,在下文中更详细地进行介绍。
第一种实现方式由Doug Lea在2000年提出,其描述可见以下网址:http://g.oswego.edu/dl/html/malloc.html。由Doug Lea提出的第一种实现方式随着时间演变,但该算法的两个核心尤其是边界标记和分箱自最早的版本以来一直保持稳定不变。
在第一种实现方式中,每个块既有开始位置的报头,也有结束位置的报尾。这些辅助字段称为边界标记。报头包含块大小和用以表明内存是可用还是已在使用的状态,而报尾通常仅包含块大小。边界标记的主要目的是实现有效合并。边界标记的另一个功能是遍历内存。遍历内存可以从任意块开始向前或向后进行。
在第一种实现方式中,空闲内存块按大小进行分箱。每个空闲块包括两个额外字段,这两个额外字段指向同一个箱的下一个块和前一个块。由于每个空闲块必须同时包含边界标记和箱链接,因此对于32位系统,最小可分配块包含16字节,且对于64位系统,最小可分配块包含24字节。一个箱内的块形成双链表,并按大小进行排序。有128个固定宽度的近似对数间隔的箱。针对小于512字节的块的所有箱都只保持一种大小,并且间隔8个字节。
此外,在第一种实现方式中,按照最小优先顺序来查找大小符合要求的块,从而实现精确的最佳拟合策略。将块分配到程序后,将块的提示标记为空闲并将其添加到对应的箱列表。一经释放,回收的块立即与其相邻块合并。上文已经讨论了一些可能的优化方式。然而,针对该算法所使用的延迟合并,探试法会降低性能。因此,当前针对Lea的分配器并没有很好的已知延迟合并机制。
该内存分配器的一般分类依据是独立的最佳拟合双链表,并且立即合并。
US2006/0190697A1中描述了第二种实现方式。在第二种实现方式中,内存块只有报头,箱称为空闲链表表格,双链表更新为有地址排序的单链表,引入所谓的延迟合并从而有效替代立即合并。
在第二种实现方式中,使用了两种延迟合并方法。第一种方法实施时遍历整个内存堆并合并相邻的空闲块。另一种方法实施时使用额外分配的数组,该数组有特定表格箱的空闲块地址。从块大小最小的表格箱开始合并。合并过程中对数组进行排序,检查块是否相邻。合并两个相邻的块并推送到下一个箱的空闲链表。剩余的块重新引入当前箱的新空闲链表。然后,该过程继续到下一个块大小的箱。第二种实现方式的两种方法按需执行或由预定义的触发器执行。
如上所述,在第一种实现方式中,会造成每个甚至很小的块一进行解分配就重复执行合并,并且一进行由此产生的分配就很快重复地拆分合并的块。这对于非动态随机存取存储器(non-dynamic random access memory,简称non-DRAM)级例如存储级存储(storage class memory,简称SCM)而言尤其浪费,因为与边界标记或空闲链表结构有关的每个内存更新必须可靠地从中央处理器(central processing unit,简称CPU)缓存刷新到实际硬件存储单元。例如,从空闲双链表中抽取块耗费2次内存更新:一次用于上一个链接的块,另一次用于下一个链接的块。因此,提取靠近相邻块的两个块已经耗费4次内存更新。空闲链表中的块按大小排序,因此实际上可以保持物理上的距离。在这种情况下,内存访问和由此产生的更新都是非本地进行的。
在第二种实现方式中,使用空闲单链表和延迟合并。已定的设计确定了第一种实现方式的一些注意事项,但也反馈出了其他问题。实际上,只有单次内存更新需要从空闲链表中提取块。另外,因为在遍历整个空闲链表时在一段时间内只能进行一次延迟合并,在这种情况下不需要更新链接字段。因此,第二种实现方式中,不会同样重复地合并和拆分块。然而,还需要一个额外的数组,其中包含空闲块地址,并且在稍后检查相邻块时,必须对此数组进行排序和扫描。由于延迟合并分别针对每个表格箱的空闲链表执行,因此数组分配、排序、内存访问和更新的总操作数量是巨大的。
因此,鉴于已知内存管理方法的以上概述,需要其他内存管理方法和设备,以能够进行高效内存分配和/或解分配。此外,尽管内存分配和/或解分配是持续或永久执行的,但期望提供内存管理方法和设备,从而提升内存回收机制。
发明内容
因此,本发明的目的是提供一种内存管理方法和设备,从而实现内存管理的提升,特别是内存分配和/或内存解分配的提升。
本发明的目标通过所附独立权利要求中提供的解决方案实现。本发明的有利实现方式在相应的从属权利要求、在本说明书和/或在附图中进一步定义。
本发明提出了一种机制,用以克服至少上述缺点。本发明建议使用多个独立的空闲链表来处理内存分配和/或解分配,因为所述多个独立的空闲链表的结构在处理时高效且容易。因此,本发明使用所述多个独立的空闲链表是基于所述多个独立的空闲链表所固有的效率。此外,通过实现内存块的三种状态的来提高内存分配和/或解分配的效率。这简化了对内存块的管理并且当根据这三种状态处理内存分配和/或解分配时,还有助于提高内存分配和/或解分配的总效率。另外,通过实现内存块的三种状态并根据所述三种状态处理内存分配和/或解分配,即使持续或永久执行内存分配和/或解分配,内存回收机制也会得到提升。
第一方面,提供了一种内存管理方法,用于使用多个独立的空闲链表来执行内存分配和/或内存解分配,所述多个独立的空闲链表提供多个内存块的信息,其中,所述设备用于根据内存块的状态执行内存分配和/或内存解分配,并且所述内存块的状态包括:使用状态,指示处于使用状态的内存块正在被使用并且不可用于分配;链接状态,指示处于链接状态的内存块未被使用,且在多个独立的空闲链表的一个空闲链表中被链接,并且可用于分配;空闲状态,指示处于空闲状态的内存块未被使用,并且在所述多个独立的空闲链表的任何一个空闲链表内都未被链接,并且不可用于分配;其中,所述内存管理方法用于通过以下操作来执行所述内存分配:在所述多个独立的空闲链表的一个空闲链表内查找内存块,将发现的内存块从所述多个独立的空闲链表的一个空闲链表中解除链接,并将发现的内存块的状态设置为使用状态;验证内存中发现的内存块的右侧相邻内存块是否处于空闲状态;如果右侧相邻内存块处于空闲状态,则将右侧相邻内存块链接到所述多个独立的空闲链表的一个对应的空闲链表中,并将右侧相邻内存块的状态设置为链接状态;其中,所述内存管理方法用于通过以下操作来执行所述内存解分配:验证内存中执行内存解分配的所述内存块的左侧相邻内存块的状态;如果所述左侧相邻内存块处于使用状态,则将所述内存块的状态设置为链接状态,并将所述内存块链接到所述多个独立的空闲链表的一个对应的空闲链表中;如果左侧相邻内存块处于链接状态,则将内存块的状态设置为空闲状态;如果左侧相邻内存块处于空闲状态,则将内存块和左侧相邻内存块合并为新内存块,并将新内存块的状态设置为空闲状态。
结合第一方面,在第一种可能的实现方式中,所述多个独立的空闲链表都是单链接的。这样,增加了所述多个独立的空闲链表结构的效率,存储所述多个独立的空闲链表需要更少的内存。因此,可以更高效地执行内存分配和/或解分配。
结合第一方面或第一方面的第一种实现方式,在第二种可能的实现方式中,所述内存管理方法用于:如果内存中发现的内存块的右侧相邻内存块不处于空闲状态,则通过终止内存分配动作来执行内存分配。
结合第一方面或第一方面的上述实现方式中的任一种实现方式,在第三种可能的实现方式中,所述多个内存块的每个内存块都包括报头和报尾,并且所述报头和/或报尾指示相应内存块的状态。
结合第一方面的第三种实现方式,在第四种可能的实现方式中,所述内存管理方法用于通过将所述左侧相邻内存块的报尾和所述内存块的报头合并到一个区域以存储数据,来执行所述内存块和所述左侧相邻内存块的合并。
第二方面,提供了一种内存管理设备,用于使用多个独立的空闲链表来执行内存分配和/或内存解分配,所述多个独立的空闲链表提供多个内存块的信息,并且根据所述内存块的状态,并且所述内存块的状态包括:使用状态,指示处于使用状态的内存块正在被使用并且不可用于分配;链接状态,指示处于链接状态的内存块未被使用,且在多个独立的空闲链表的一个空闲链表中被链接,并且可用于分配;空闲状态,指示处于空闲状态的内存块未被使用,并且在所述多个独立的空闲链表的任何一个空闲链表内都未被链接,并且不可用于分配;其中,所述内存管理设备用于通过以下操作来执行所述内存分配:在所述多个独立的空闲链表的一个空闲链表内查找内存块,将发现的内存块从所述多个独立的空闲链表的一个空闲链表中解除链接,并将发现的内存块的状态设置为使用状态;验证内存中发现的内存块的右侧相邻内存块是否处于空闲状态;如果右侧相邻内存块处于空闲状态,则将右侧相邻内存块链接到所述多个独立的空闲链表的一个对应的空闲链表中,并将右侧相邻内存块的状态设置为链接状态;其中,所述内存管理设备用于通过以下操作来执行所述内存解分配:验证内存中执行内存解分配的所述内存块的左侧相邻内存块的状态;如果所述左侧相邻内存块处于使用状态,则将所述内存块的状态设置为链接状态,并将所述内存块链接到所述多个独立的空闲链表的一个对应的空闲链表中;如果左侧相邻内存块处于链接状态,则将内存块的状态设置为空闲状态;如果左侧相邻内存块处于空闲状态,则将内存块和左侧相邻内存块合并为新内存块,并将新内存块的状态设置为空闲状态。特别地,内存管理设备用于执行本文描述的内存管理方法的步骤。
第三方面,本发明涉及一种计算机程序产品,其中,所述计算机程序产品包括计算机可读程序代码,所述计算机可读程序代码用于使计算设备执行上文介绍的并且在下文详细解释的内存管理方法的步骤。
第四方面,本发明涉及一种计算机可读记录介质,用于在其中存储计算机程序产品。
附图说明
结合所附附图,下面具体实施例的描述将阐述上述本发明的各方面及其实施形式,其中:
图1示出了根据本发明实施例的多个独立的空闲链表的示例性排列;
图2示出了根据本发明实施例的内存块的示例性排列;
图3示出了根据本发明实施例的内存块的报尾或报头的示例性排列;
图4示出了根据本发明实施例的处于链接状态的内存块的示例性排列;
图5示出了根据本发明实施例的内存管理设备的排列;
图6示出了根据本发明实施例的内存分配的流程图;
图7a和7b示出了根据本发明实施例的内存分配的另一流程图;
图8示出了根据本发明实施例的内存解分配的流程图;
图9示出了根据本发明实施例的两个内存块的合并。
具体实施方式
通常需要注意的是本申请中描述的所有设置、设备、模块、组件、模型、元件、单元、实体以及方法等都可以由软件或硬件元件或其任意组合实现。由本申请中描述的各种实体执行的所有步骤以及描述的由各种实体执行的功能旨在表示相应实体用于或被配置为执行相应的步骤和功能。虽然在以下具体实施例的描述中,由通用实体执行的特定功能或步骤没有在执行特定步骤或功能的实体的具体元件的描述中反映,但是技术人员应该清楚的是这些方法和功能可以在各自的硬件或软件元件或其任意组合中实现。此外,本发明的方法及其各个步骤在各个描述的装置元件的功能中体现。
此外,除非有明确排除的组合,本文所描述的任意实施例以及任意实施例的特征都可以互相组合。
图1示出了根据本发明实施例的多个独立的空闲链表的示例性排列。通常,术语“独立的空闲链表”在内存分配和/或解分配领域具有固定含义。独立化是一种简单而高效的机制,其使用和管理一组空闲链表。术语“空闲链表”表示在链表中分别包含或链接的内存段或内存块是空闲的并且可以被分配。此外,每个空闲链表分别包含特定大小的内存段或内存块。因此,对用于内存块分配和/或解分配的空闲链表的选择取决于内存段或内存块各自的大小。例如,如果需要大小为X的内存块,则将包含有大小至少为X的内存块的相应空闲链表用于分配对应的内存块。如果另一请求需要大小为Y的内存块,则将包含有大小至少为Y的内存块的相应空闲链表用于分配对应的内存块。通过这种方式,有可能针对两个请求使用不同的空闲链表。即,响应于需要大小为X的内存块的请求而将使用其中的内存块的链表可以不同于响应于需要大小为Y的内存块的请求而将使用其中的内存块的链表。一个链表将是包含大小至少为X的内存块的链表,另一个链表将是包含大小至少为Y的内存块的链表。本发明利用了并受益于独立的空闲链表结构的简单性和高效性。
图1示出了根据本发明实施例的多个独立的空闲链表的示例性排列。如图1所示,将内存或内存段102拆分成较小的不同大小的内存段或块。在图1中,所述内存块在内存段102中示出为大小不同的矩形,其中矩形的不同大小象征或反映内存块的不同大小。
多个独立的空闲链表通过空闲链表表格或数组101管理。本实施例中,空闲链表表格或数组101具有固定大小。空闲链表表格或数组101中的每一项在图1中示出为一个圆圈,并称为箱,其包含指向空闲链表的指针。在图1中,这通过从各个箱(在空闲链表表格或数组101中示出为圆圈)引出至相应空闲链表的第一条目的箭头示出,其中多个空闲链表中的每一个空闲链表包括或包含特定(例如,预定)大小的内存块,并且该多个空闲链表中的每一个空闲链表包含的内存块的大小不同于另一空闲链表中的内存块的大小。该多个空闲链表中的每一个空闲链表在图1中由大小相同的一系列内存块(在内存或内存段102中示出为矩形)表示,其中,提供了从内存块到下一个内存块的指针(参见图1中从一个内存块到另一个内存块的箭头)。空闲链表的最后一个条目,即空闲链表的最后一个内存块没有指向下一个内存块的指针,因为其是相应链表的最后一个条目或内存块。尽管图1示出了仅具有三个项或箱的空闲链表表格或数组101,但是数量3仅仅是示例性的,并且通过空闲链表表格或数组101可以管理任何适当数量的空闲链表。
如图1中所示的内存块的不同表示,本实施例中,如上所述,内存块具有三种不同的状态:使用状态、链接状态和空闲状态。在图1中,处于使用状态的内存或内存段102的内存块示出为阴影矩形。处于使用状态的内存块是正在使用的内存块(即用于数据存储)并且不可用于分配。此外,在图1中,处于链接状态的内存或内存段102的内存块示出为具有细边框的白色矩形。处于链接状态的内存块是未被使用的、在多个独立的空闲链表的一个对应空闲链表中被链接的而且可用于分配的内存块。此外,图1中,处于空闲状态的内存或内存段102的内存块示出为粗边框的白色矩形。处于空闲状态的内存块是未被使用的、在多个独立的空闲链表的一个对应空闲链表中未链接的(这在图1中示出,处于空闲状态的内存块没有指向其他内存块的指针(在图1中,没有导向其他内存块的箭头),而且也没有指向或导向对应内存块的指针(图1中的箭头))而且不可以用于分配的内存块。
因此,如图1所示,所述内存或内存段102拆分成多个内存块,其中一些包含在所述多个独立的空闲链表的各个空闲链表中,另一些则没有包含在所述多个独立的空闲链表的各个空闲链表中。短语“在空闲链表内被链接”意思是在所述多个独立的空闲链表的一个空闲链表中被链接的对应的内存块包含在该空闲链表中,也即,是该空闲链表的一个条目。因为从空闲链表中移除了在使用的内存块,在空闲链表内被链接的内存块通常可以用于分配。短语“从空闲链表中解除链接”意思是从所述多个独立的空闲链表的一个空闲链表中解除链接的相应内存块被从相应的空闲链表中移除掉,也即,该内存块不再是空闲链表的条目而且不包含在空闲链表中。因为只有在所述多个独立的空闲链表的一个空闲链表中被链接的内存块才能用于分配,所以解除链接的内存块在从空闲链表中解除链接后不可用于分配。通常,如果内存块被选择用于分配并且将被或已经用于数据存储,即,处于使用状态,则将该内存块从空闲链表中解除链接。
图2示出了根据本发明实施例的内存块200的示例性排列。因此,例如,图1所示的内存块如图2所示进行排列。本实施例中,内存块200包括报头或报头标记201和报尾或报尾标记203。此外,内存块200包括数据字段202,在使用内存块200时将数据存入数据字段202中。所述数据字段202也称为有效负荷。内存块200的报头或报头标记201位于内存块200的开始处,并且内存块的报尾或报尾标记203位于内存块200的末端。
特别地,这些字段(即报头201和报尾203)仅供内存分配和/或解分配时内部使用。在这种情况下,报头201和报尾203仅可由内存分配器或内存管理设备访问,并且不能由使用内存块200的数据字段或有效负荷202来进行数据存储的设备或应用访问。
在一个实施例中,报头201和报尾203的大小有8字节。
图3示出了根据本发明实施例的内存块的报尾或报头300的示例性排列。例如,按照图2所示排列内存块。因此,图3中的报尾或报头300是图2中的内存块200的报头201或报尾203。本实施例中,报尾或报头300(例如报头201和/或报尾203)包括指示块200的状态(即,使用状态、链接状态或空闲状态)的状态字段302。另外,本实施例中,报尾或报头300(例如报头201和/或报尾203)包括指示块200的大小的大小字段301。例如,大小字段301指示内存块200的有效负荷或数据字段203的大小。
一个实施例中,内存或内存缓冲102大小以8个字节为准。因此,本实施例中,内存块200的大小是8的倍数。此外,内存块200的报头201、报头300、报尾203和报尾300中的每一个也具有8字节的大小。这意味着在报头201、报头300和/或报尾203、报尾300中,除了大小字段301以外,至少三个比特未被使用并且用于指示内存块200的状态302。例如,这允许状态字段302中的状态信息的以下示例性编码,包括所述最后三个比特:指示空闲状态的“0x00”、指示链接状态的“0x01”和指示使用状态的“0x02”。
图4示出了处于链接状态的内存块的示例性排列。例如,内存块是图2中的内存块。报头201、报头300和/或报尾203、报尾300的状态字段302指示内存块200的状态是使用状态或链接状态。除了报头201、数据字段或有效负荷202、以及报尾201以外,内存块200还包括指针字段400,因为内存块200包含在所述多个独立的空闲链表的一个空闲链表中,也即,链接在所述多个独立的空闲链表的一个空闲链表中。指针字段400与内存块200的报头201相邻并且排列在有效负荷或数据字段202的开始处。
因此,本发明的一个实施例中,如果内存块200添加到或链接到多个独立的空闲链表的相应空闲链表内,则内存块200的排列改变。在这种情况下,内存块200的数据字段或有效负载字段202的前部用作指针字段400。如果将内存块200从相应的空闲链表中移除,则指针字段400中的指针被移除或删除,并且有效负荷或数据字段202不包括任何指针字段400,即,内存块200按图2所示进行排列。一般而言,处于空闲或使用状态的内存块200按图2所示进行排列,并且不包括指针字段400。
指针字段400包括指向所述多个独立的空闲链表的一个空闲链表的下一个内存块200的指针,该空闲链表包含内存块200和/或内存块200被链接到其中。一个实施例中,指针字段400包括下一个内存块200的偏移量,其中,该偏移量是下一个内存块200相对于内存或内存段102的特定或预定的基本内存地址的偏移量。在可选实施例中,指针字段400包括指向下一个内存块200的普通指针,其指向内存或内存段102中的下一个内存块200的内存地址。
一个实施例中,指针字段400的大小有8个字节。尤其是在内存或内存缓冲102以8个字节为准和/或报头201和报尾203的大小有8个字节的情况下,指针字段400的这种排列是有用的。将指针字段400的大小设置为8字节的优点是容易处理相应的内存块200尤其是其有效负荷或数据字段202。
如上所述,处于链接状态的每个内存块200属于所述多个独立的空闲链表的哪个空闲链表取决于内存块200的大小。一个实施例中,独立的空闲链表的结构分别包括28个箱或空闲链表。本实施例中,前六个箱通过8个字节线性地间隔开,覆盖有效负荷大小从16个字节到最多64个字节(即,所述前六个箱的相应内存块200具有有效负荷或数据字段202,所述有效负荷或数据字段202的大小从16到最多64字节),后面的箱是二次的并且箱有效负荷大小计算为2的箱号次方,其中编号开始于包含最小的内存块200的空闲链表或箱,并且以包含最大内存块200的空闲链表或箱结束。大于128兆字节的内存块200全部被放置到最后的箱空闲链表。
图5示出了根据本发明实施例的内存管理设备500的排列。例如,内存管理设备500表示本文已经提到的分配器。本实施例中,如本文所述,内存管理设备500用于使用多个独立的空闲链表来执行内存分配和/或内存解分配,所述多个独立的空闲链表提供多个内存块200的信息,并且所述内存块200的状态包括:如本文所述的使用状态、链接状态和空闲状态。上面已经介绍了由本实施例中的内存管理设备或分配器500执行的内存分配和/或解分配,具体内容将在下面讨论。内存管理设备500包括至少一个处理单元501,例如处理器,中央处理器(central processing unit,简称CPU),微处理器,多核处理器等。因此,内存管理设备500执行的内存分配和/或解分配由一个或多个处理单元501执行。
图6示出了根据本发明实施例的内存分配的流程图。如上所述,例如,内存分配的步骤由内存管理设备500执行。特别地,所述步骤由内存管理设备500的一个或多个处理单元501执行。
在步骤601中,接收到的内存分配请求是请求特定大小的内存段或内存块200。内存分配请求可以由用于处理数据的另一个设备或者由应用发出。此外,内存分配请求针对特定大小的内存段或块200的分配。特定大小由用于处理数据的另一设备或由应用来定义,因为另一设备或应用能够根据另一设备或应用执行的数据处理过程来估计数据存储所需的内存空间。响应于内存分配请求(例如,由分配器或内存管理设备500发出)的存在(例如,接收),执行如图6所示的示例性内存分配。
因此,在步骤601中,在所述多个空闲链表的一个空闲链表中搜索包含处于链接状态(即,未被使用并且可用于分配)的合适的内存块200。这里,特别地,在包含大小等于或大于所请求的内存段大小的一个或多个内存块200的空闲链表中进行搜索。
在步骤602中,发现的内存块200从其被发现的空闲链表中解除链接。即,发现的内存块200从相应的空闲链表中移除。使用状态记录在发现的内存块200的报尾201、300和/或报头203、300的状态字段302中。
在步骤603中,验证内存或内存段102中发现的内存块200的右侧相邻内存块。因此,验证603的不是在其中发现了601内存块200的空闲链表中的右侧相邻内存块200,而是位于内存或内存段102中发现的内存块200右侧的右侧相邻内存块200。特别地,验证603右侧相邻内存块200的报尾201、报尾300和/或报头203、报头300的状态字段302。
如果右侧相邻内存块200的报尾201、报尾300和/或报头203、报头300的状态字段302指示空闲状态(即,如果内存或内存段102中的发现的存储器块200的右侧相邻内存块200未被使用,没有链接到或包含在所述多个空闲链表的任何一个空闲链表中,并且不可用于分配),将右侧相邻内存块200链接到所述多个空闲链表的对应空闲链表中。根据右侧相邻内存块200的大小来识别相应的空闲链表。即,搜索空闲链表,该空闲链表包括与右侧相邻内存块200大小相同的内存块200。在该多个独立的空闲链表的这个空闲链表中,在步骤605中插入右侧相邻内存块200。即,将右侧相邻内存块200链接到相应的空闲链表中。另外,在步骤606中,将右侧相邻内存块200的状态设置为链接状态。即,在右侧相邻内存块200的状态字段302中记录链接状态。这种方式下,使得作为发现的内存块200的右侧相邻内存块200的另一内存块200可用于内存分配。
如果右侧相邻内存块200的报尾201、报尾300和/或报头203、报头300的状态字段302不指示空闲状态而是指示使用状态或链接状态,则结束604根据本实施例的处理。针对右侧相邻内存块200不执行另外的步骤。
图7a和7b示出了根据本发明实施例的内存分配的另一流程图。例如,由内存管理设备500执行根据图7a和7b的内存分配的步骤。特别地,由内存管理设备500的一个或多个处理单元501执行所述步骤。图7a和7b的实施例基于图6的实施例,并且特别地,通过另外的步骤补充了图6的实施例。
根据本实施例,提供了图7a和7b的步骤701至705,用作步骤601的子步骤。如上所述,在步骤601中,搜索合适的内存块。
在步骤701中,分别针对内存分配请求,计算箱号或所述多个独立的空闲链表的一个空闲链表的编号。如上所述,可以枚举空闲链表表格或数组101的箱的所述多个独立的空闲链表的各个空闲链表,所述多个独立的空闲链表通过空闲链表表格或数组101管理。其中,包含最小的内存块200的空闲链表和指向该空闲链表的箱的编号是最小或最低的,包含最大的内存块200的空闲链表和指向该空闲链表的箱的编号是最大或最高的。空闲链表或箱分别按升序枚举。因此,空闲链表或者箱的编号反映了相应空闲链表所包含的内存块200的大小。在步骤701中,对空闲链表表格或数组101的所述多个独立的空闲链表的各个空闲链表进行考量,并且每次考量一个空闲链表时,将所请求的内存段或块200的大小与相应的空闲链表包含的各个内存块200的大小作对比。对空闲链表表格或数组101的所述多个独立的空闲链表的各个空闲链表进行考量时,可以通过例如遍历空闲链表表格或数组101的各个项,针对各项考量该项的箱以及考量该箱指向的空闲链表来完成。如果所请求的内存段或块200的大小等于或小于由空闲链表包含的内存块200的大小,则停止搜索,且空闲链表代表所搜索的空闲链表。
如上所述,例如,使用空闲链表表格或数组101来搜索合适的空闲链表,例如,通过遍历空闲链表表格或数组101的各个项。这里,可以使用几种已知的搜索技术。通常已知如何在空闲链表表格或数组101中分别搜索包含适当大小即大于或等于所请求的内存块200大小的内存块200的空闲链表或者箱,并且多种不同的搜索方法都已知和存在。
步骤701的输出分别是在执行步骤701的搜索时已经发现的空闲链表或箱的编号。
在步骤702中,分别搜索非空的箱或空闲链表。在步骤701中,发现箱或空闲链表的编号,该箱或空闲链表的内存块200的大小大于或等于所请求内存块200的大小。然而,不能保证具有发现701的编号的相应的箱或空闲链表分别包括可用于分配的内存块200。可能出现当执行步骤702时,在步骤701中其编号被发现的相应的箱或空闲链表中所包含/曾包含的所有内存块200正在被使用,并且在所述空闲链表中没有可用的处于链接状态的内存块200。因此,在步骤702中验证在步骤701中其编号被发现的相应箱或空闲链表是否分别包括或包含处于链接状态并因而可用于分配的至少一个内存块200。为此,首先考量具有在步骤701中确定的编号的相应箱或空闲链表。如果相应的箱或空闲链表包括或包含至少一个内存块200,则将相应的箱或空闲链表确定为非空的箱或空闲链表,所述非空的箱或空闲链表的内存块200可以用于分配。否则,继续验证步骤702,验证在空闲链表表格或数组101中具有另一编号的另一箱或空闲链表,即包含另一大小的内存块200的箱或空闲链表。这种方式下,反复执行验证步骤702,直到分别发现非空的箱或空闲链表。术语“非空”指的是分别包含或具有至少一个内存块200的空闲链表的箱。当分别已经发现合适的非空的箱或空闲链表时或者分别考量空闲链表表格或数组101中的所有箱或空闲链表之后,终止执行步骤702,其中,所有箱或空闲链表的编号大于在步骤701中发现的编号和/或所有箱或空闲链表的内存块200的大小大于或等于所请求的内存块的大小。
在步骤703中,验证是否分别发现了非空的箱或空闲链表。如果在步骤702中没有分别发现非空的箱或空闲链表,则结束执行步骤601和分配流程。由于针对内存块或内存段的内存分配请求仍然存在,因此稍后将再次启动该流程。
如果在步骤702中分别已经发现非空的箱或空闲链表,则在执行步骤705时,于步骤702中发现的箱或空闲链表中搜索可用内存块200。这里,术语“可用内存块”是指自身状态是链接状态的内存块200。由于所发现的箱或空闲链表分别是非空的,因此至少一个内存块200将分别存在于发现的箱或空闲链表中。例如,要完成对可用内存块200的选择,可以通过在步骤702中发现的箱或空闲链表中选择第一内存块200,或者可以通过执行用于分别从箱或空闲链表中选择可用内存块200的任何其他已知方法。
在发现705可用内存块200之后,将发现的内存块200的状态设置为使用状态,即执行如上所述的步骤602。因此,将发现的内存块200从其被发现的空闲链表中解除链接。即,将发现的内存块200从相应的空闲链表中移除。所述使用状态记录在发现的内存块200的报尾201、报尾300和/或报头203、报头300的状态字段302中。
随后,还执行上述验证步骤603,且如果需要的话也执行步骤604。
如果在步骤603中执行验证的结果是有自身状态为空闲状态的右侧相邻内存块200,则在步骤605中将右侧相邻内存块200链接到所述多个独立的空闲链表的一个相应空闲链表中。特别地,根据本实施例执行步骤706和707,其中所述步骤706和707对应于根据本实施例的步骤605的子步骤。在步骤706中,针对右侧相邻内存块200分别确定箱或空闲链表。出于此目的,确定右侧相邻内存块200的大小。然后,在空闲链表表格或数组101中进行搜索过程,其中,分别搜索包含与右侧相邻内存块200具有相同大小的内存块200的箱或空闲链表。随后,在步骤707中,将右侧相邻内存块200分别链接到在步骤706中发现的箱或空闲链表中。
最后,如上所述,在步骤606中将右侧相邻内存块200的状态设置为链接状态。
图8示出了根据本发明实施例的内存解分配的流程图。如上所述,例如,内存解分配的步骤由内存管理设备500执行。特别地,所述步骤由内存管理设备500的一个或多个处理单元501执行。
在步骤801中,接收到的内存解分配请求是请求对内存解分配请求指示的特定的段或内存块200进行解分配。内存解分配请求可以由用于处理数据的另一个设备或者由应用发出。例如,该另一设备或所述应用代表请求分配特定段或内存块200的另一设备或应用。响应于内存解分配请求(例如,由分配器或内存管理设备500发出)的存在(例如,接收),执行如图8所示的示例性内存解分配。
在步骤801中,验证执行内存解分配的内存块200的左侧相邻内存块200的状态。左侧相邻内存块200是表示内存或内存段102中的左侧相邻内存块200的内存块200。为此,考量左侧相邻内存块200的报头201、报头300和/或报尾203、报尾300的状态字段302。左侧相邻内存块200的状态从左侧相邻内存块200的报头201、报头300和/或报尾203、报尾300的状态字段302中读出。
在步骤802中,如果左侧相邻内存块处于使用状态,则将执行内存解分配的内存块200的状态设置为链接状态。并且将所述内存块200链接到所述多个独立空闲链表中的一个相应空闲链表中。通过将内存块200的报头201、报头300和/或报尾203、报尾300的状态字段302设置为链接状态,实现将内存块200的状态设置为链接状态。对内存块200的链接是通过如下方式执行:在所述多个独立的空闲链表中分别搜索空闲链表或箱,其中,所述空闲链表或箱包括或包含具有与待链接的所述内存块200相同大小的内存块200,并且将所述内存块200链接到发现的空闲链表。例如,通过遍历空闲链表表格或数组101来分别搜索空闲链表或箱。为此,例如,考量空闲链表表格或数组101相应的项或箱,其中,分别针对每个考量的项或箱,将箱所指向的空闲链表的内存块200的大小与执行内存解分配的内存块200的大小进行比较。当分别发现相应的空闲链表或箱时,将执行内存解分配的内存块200链接到发现的空闲链表中。
在步骤803中,如果左侧相邻内存块200处于链接状态,则将执行内存解分配的内存块200的状态设置为空闲状态。为此,将执行内存解分配的内存块200的报头201、报头300和/或报尾203、报尾300的状态字段302设置为空闲状态。
在步骤804中,如果左侧相邻内存块200处于空闲状态,则将执行内存解分配的内存块200与左侧相邻内存块200合并为新的内存块200并且将新内存块200的状态设置为空闲状态。图9示出了根据本发明实施例的两个内存块200_1和200_2的合并900。内存块200_1和200_2的排列如上所述。
在图9的上部示出了初始情况,其中,在内存或内存段102中相邻的两个单独的内存块200_1和200_2存在于初始情况中。针对如上所述的内存解分配,内存块200_1表示示例性的左侧相邻内存块200,并且内存块200_2表示执行内存解分配的示例性内存块200。
通过执行两个内存块200_1和200_2的合并900,两个内存块200_1和200_2中左侧内存块200_1的报尾203_1和两个内存块200_1和200_2中右侧内存块200_2的报头201_2合并或结合成一个字段。特别地,两个内存块200_1和200_2的相应有效负荷或数据字段202_1和202_2也进行合并或结合。因此,合并900导致两个内存块200_1和200_2中左侧内存块200_1的报头201_1和两个内存块200_1和200_2中右侧内存块200_2的报尾203_2之间存在一个(合并或连接的)有效负荷或数据字段202_3。两个内存块200_1和200_2中左侧内存块200_1的报尾203_1及有效负荷或数据字段202_1与两个内存块200_1和200_2中右侧内存块200_2的报头201_2及有效负荷或数据字段202_2合并或结合成一个有效负荷或数据字段202_3。
在合并900(参见图9的下半部分)之后获得的新内存块200_3包括:报头201_3,其中,报头201_3包括两个内存块200_1和200_2中左侧内存块200_1的报头201_1;有效负荷或数据字段202_3,其中,有效负荷或数据字段202_3包括两个内存块200_1和200_2中左侧内存块200_1的有效负荷或数据字段202_1及报尾203_1与两个内存块200_1和200_2中右侧内存块200_2的报头201_2及有效负荷或数据字段202_2;以及报尾203_3,其中,所述报尾203_3包含两个内存块200_1和200_2中右侧内存块200_2的报尾203_2。
因此,两个内存块200_1和200_2中左侧内存块200_1的报头201_1与两个内存块200_1和200_2中右侧内存块200_2的报尾203_2之间的任何字段都会合并或结合900成新内存块200_3的一个有效负荷或数据字段202_3。
当执行合并900时,将报头201_3和报尾203_3的数据更新,使得其表征新内存块200_3。例如,新内存块200_3的报头201_3和/或报尾203_3的大小字段301指示新内存块200_3的大小。例如,新内存块200_3的报头201_3和/或报尾203_3的状态字段302指示新内存块200_3的状态。
当回到在解分配流程期间执行的合并时,且当假定新内存块200_3是通过在解分配流程期间执行合并900而获得的新内存块时,在合并900之后,新内存块200_3的状态设置为空闲状态。因此,在合并900之后,新内存块200_3的报头201_3和/或报尾203_3的状态字段302设置为空闲状态。
因此,本发明提供一种内存管理方法和内存管理设备,用于使用多个独立的空闲链表来执行内存分配和/或内存解分配,所述多个独立的空闲链表提供多个内存块的信息,其中,所述内存分配和/或内存解分配根据内存块的状态执行,并且所述内存块的状态包括:使用状态,指示处于使用状态的内存块正在被使用并且不可用于分配;链接状态,指示处于链接状态的内存块未被使用,且在多个独立的空闲链表的一个空闲链表中被链接,并且可用于分配;空闲状态,指示处于空闲状态的内存块未被使用,并且在所述多个独立的空闲链表的任何一个空闲链表内都未被链接,并且不可用于分配。
通过所述内存管理方法和内存管理设备,实现了内存管理的提升,尤其是内存分配和/或内存解分配的提升。特别是,实现了高效的内存分配和/或解分配。此外,即使持续或永久执行内存分配和/或解分配,内存回收机制也会得到提升。
在此结合各种实施例描述了本发明。本发明的各实施例可以相互组合。即,本文描述的、在至少一个附图中示出的和/或在所附权利要求中描述的各个实施例中的任何实施例可与所述各个实施例中的另一实施例相结合。因此,实现了本发明的灵活实现方式。此外,本发明的实现方式可以适应于几种环境或使用情况。
另外,本领域技术人员通过实践本发明,研究附图、本发明以及所附的权利要求,能够理解并获得公开实施例的其它变体。在权利要求书中,词语“包括”不排除其它元素或步骤,数量词“一”不排除多个。在仅凭某些措施被记载在相互不同的从属权利要求书中这个单纯的事实并不意味着这些措施的结合不能被有效地使用。
Claims (9)
1.一种内存管理方法,其特征在于,用于使用多个独立的空闲链表来执行内存分配和/或内存解分配,所述多个独立的空闲链表提供多个内存块的信息,其中,所述方法用于根据内存块的状态执行内存分配和/或内存解分配,并且所述内存块的状态包括:
使用状态,指示处于使用状态的内存块正在被使用并且不可用于分配;
链接状态,指示处于链接状态的内存块未被使用,且在多个独立的空闲链表的一个空闲链表中被链接,并且可用于分配;
空闲状态,指示处于空闲状态的内存块未被使用,并且在所述多个独立的空闲链表的任何一个空闲链表内都未被链接,并且不可用于分配;
其中,所述内存管理方法用于通过以下操作来执行所述内存分配:
在所述多个独立的空闲链表的一个空闲链表内查找内存块,将发现的内存块从所述多个独立的空闲链表的一个空闲链表中解除链接,并将发现的内存块的状态设置为使用状态;
验证内存中发现的内存块的右侧相邻内存块是否处于空闲状态;
如果右侧相邻内存块处于空闲状态,则将右侧相邻内存块链接到所述多个独立的空闲链表的一个对应的空闲链表中,并将右侧相邻内存块的状态设置为链接状态;
其中,所述内存管理方法用于通过以下操作来执行所述内存解分配:
验证内存中执行内存解分配的所述内存块的左侧相邻内存块的状态;
如果所述左侧相邻内存块处于使用状态,则将所述内存块的状态设置为链接状态,并将所述内存块链接到所述多个独立的空闲链表的一个对应的空闲链表中;
如果左侧相邻内存块处于链接状态,则将内存块的状态设置为空闲状态;
如果左侧相邻内存块处于空闲状态,则将内存块和左侧相邻内存块合并为新内存块,并将新内存块的状态设置为空闲状态。
2.根据权利要求1所述的内存管理方法,其特征在于,所述多个独立的空闲链表都是单链接的。
3.根据权利要求1所述的内存管理方法,其特征在于,所述内存管理方法用于:如果内存中发现的内存块的右侧相邻内存块不处于空闲状态,则通过终止内存分配动作来执行内存分配。
4.根据权利要求2所述的内存管理方法,其特征在于,所述内存管理方法用于:如果内存中发现的内存块的右侧相邻内存块不处于空闲状态,则通过终止内存分配动作来执行内存分配。
5.根据权利要求1至4中任一项所述的内存管理方法,其特征在于,所述多个内存块的每个内存块都包括报头和报尾,并且所述报头和/或报尾指示相应内存块的状态。
6.根据权利要求5所述的内存管理方法,其特征在于,所述内存管理方法用于通过将所述左侧相邻内存块的报尾和所述内存块的报头合并到一个区域以存储数据,来执行所述内存块和所述左侧相邻内存块的合并。
7.一种内存管理设备,其特征在于,用于使用多个独立的空闲链表来执行内存分配和/或内存解分配,所述多个独立的空闲链表提供多个内存块的信息,并且根据所述内存块的状态,并且所述内存块的状态包括:
使用状态,指示处于使用状态的内存块正在被使用并且不可用于分配;
链接状态,指示处于链接状态的内存块未被使用,且在多个独立的空闲链表的一个空闲链表中被链接,并且可用于分配;
空闲状态,指示处于空闲状态的内存块未被使用,并且在所述多个独立的空闲链表的任何一个空闲链表内都未被链接,并且不可用于分配;
其中,所述内存管理设备用于通过以下操作来执行所述内存分配:
在所述多个独立的空闲链表的一个空闲链表内查找内存块,将发现的内存块从所述多个独立的空闲链表的一个空闲链表中解除链接,并将发现的内存块的状态设置为使用状态;
验证内存中发现的内存块的右侧相邻内存块是否处于空闲状态;
如果右侧相邻内存块处于空闲状态,则将右侧相邻内存块链接到所述多个独立的空闲链表的一个对应的空闲链表中,并将右侧相邻内存块的状态设置为链接状态;
其中,所述内存管理设备用于通过以下操作来执行所述内存解分配:
验证内存中执行内存解分配的所述内存块的左侧相邻内存块的状态;
如果所述左侧相邻内存块处于使用状态,则将所述内存块的状态设置为链接状态,并将所述内存块链接到所述多个独立的空闲链表的一个对应的空闲链表中;
如果左侧相邻内存块处于链接状态,则将内存块的状态设置为空闲状态;
如果左侧相邻内存块处于空闲状态,则将内存块和左侧相邻内存块合并为新内存块,并将新内存块的状态设置为空闲状态。
8.一种内存管理设备,其特征在于,包括处理器,所述处理器用于执行权利要求1至6中任一项所述的方法的步骤。
9.一种计算机可读记录介质,其特征在于,用于在其中存储计算机程序产品,其中所述计算机程序产品包括计算机可读程序代码,所述计算机可读程序代码用于使计算设备执行权利要求1至6中任一项所述的方法的步骤。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/RU2016/000646 WO2018063020A1 (en) | 2016-09-28 | 2016-09-28 | Memory management method and device |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109690498A CN109690498A (zh) | 2019-04-26 |
CN109690498B true CN109690498B (zh) | 2020-12-25 |
Family
ID=57589116
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201680086965.4A Active CN109690498B (zh) | 2016-09-28 | 2016-09-28 | 内存管理方法和设备 |
Country Status (4)
Country | Link |
---|---|
US (1) | US11042477B2 (zh) |
EP (1) | EP3504628B1 (zh) |
CN (1) | CN109690498B (zh) |
WO (1) | WO2018063020A1 (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109375985B (zh) * | 2018-09-06 | 2021-04-06 | 新华三技术有限公司成都分公司 | 内存动态管理方法及装置 |
US11164650B2 (en) * | 2019-08-30 | 2021-11-02 | International Business Machines Corporation | Scrub management in storage class memory |
US10997084B2 (en) | 2019-08-30 | 2021-05-04 | International Business Machines Corporation | Virtual to physical translation and media repair in storage class memory |
CN111162937B (zh) * | 2019-12-20 | 2023-05-16 | 北京格林威尔科技发展有限公司 | 一种在传输设备中实现内存池的方法及装置 |
CN113377522A (zh) * | 2020-03-09 | 2021-09-10 | 大唐移动通信设备有限公司 | 内存池中内存块的处理方法、装置、电子设备和存储介质 |
CN111352863B (zh) * | 2020-03-10 | 2023-09-01 | 腾讯科技(深圳)有限公司 | 内存管理方法、装置、设备及存储介质 |
CN111444016B (zh) * | 2020-03-25 | 2023-10-13 | 瑞芯微电子股份有限公司 | 一种内存分配方法和装置 |
CN111984652B (zh) | 2020-08-28 | 2022-08-12 | 苏州浪潮智能科技有限公司 | 一种位图数据中空闲块的查找方法及相关组件 |
CN114443277A (zh) * | 2020-10-31 | 2022-05-06 | 华为终端有限公司 | 内存管理方法、装置、电子设备以及计算机可读存储介质 |
CN117033002B (zh) * | 2023-10-09 | 2024-02-09 | 苏州元脑智能科技有限公司 | 一种内存管理方法、装置、设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0706130A1 (en) * | 1994-10-07 | 1996-04-10 | International Business Machines Corporation | Contiguous memory allocation process |
CN102103541A (zh) * | 2011-02-28 | 2011-06-22 | 中国人民解放军国防科学技术大学 | 防止内存泄露和内存多次释放的内核模块内存管理方法 |
CN102455976A (zh) * | 2010-11-02 | 2012-05-16 | 上海宝信软件股份有限公司 | 一种中间件内存管理方案 |
CN103984639A (zh) * | 2014-04-29 | 2014-08-13 | 宁波三星电气股份有限公司 | 一种动态内存分配方法 |
CN106874220A (zh) * | 2017-02-15 | 2017-06-20 | 济南浪潮高新科技投资发展有限公司 | 一种nand flash阵列二级地址映射表的实现方法 |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5742793A (en) | 1991-12-18 | 1998-04-21 | Intel Corporation | Method and apparatus for dynamic memory management by association of free memory blocks using a binary tree organized in an address and size dependent manner |
US6757802B2 (en) * | 2001-04-03 | 2004-06-29 | P-Cube Ltd. | Method for memory heap and buddy system management for service aware networks |
US6839822B2 (en) | 2001-10-29 | 2005-01-04 | Sun Microsystems, Inc. | Memory-block coalescing based on run-time demand monitoring |
US6907508B2 (en) * | 2003-02-26 | 2005-06-14 | Emulex Design & Manufacturing Corporation | Structure and method for managing available memory resources |
US7827375B2 (en) * | 2003-04-30 | 2010-11-02 | International Business Machines Corporation | Defensive heap memory management |
US20050154851A1 (en) * | 2004-01-14 | 2005-07-14 | Charles Andrew A. | Fast, high reliability dynamic memory manager |
US8368686B2 (en) * | 2004-05-26 | 2013-02-05 | Sony Online Entertainment Llc | Resource management for rule-based procedural terrain generation |
US20060190697A1 (en) | 2005-02-10 | 2006-08-24 | Grant Calum A | A lock-free memory allocator with delayed coalescing |
FR2899353B1 (fr) * | 2006-03-31 | 2008-06-27 | Infovista Sa Sa | Systeme de gestion memoire pour la reduction de la fragmentation memoire |
US7610468B2 (en) | 2006-10-26 | 2009-10-27 | Hewlett-Packard Development Company, L.P. | Modified buddy system memory allocation |
KR20100091853A (ko) * | 2009-02-11 | 2010-08-19 | 삼성전자주식회사 | 동적 메모리 관리를 수행하는 임베디드 시스템 및 그의 메모리 관리방법 |
US20140351530A1 (en) * | 2013-05-22 | 2014-11-27 | International Business Machines Corporation | Linked list for lock-free memory allocation |
-
2016
- 2016-09-28 EP EP16815994.5A patent/EP3504628B1/en active Active
- 2016-09-28 CN CN201680086965.4A patent/CN109690498B/zh active Active
- 2016-09-28 WO PCT/RU2016/000646 patent/WO2018063020A1/en unknown
-
2019
- 2019-03-27 US US16/366,725 patent/US11042477B2/en active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0706130A1 (en) * | 1994-10-07 | 1996-04-10 | International Business Machines Corporation | Contiguous memory allocation process |
CN102455976A (zh) * | 2010-11-02 | 2012-05-16 | 上海宝信软件股份有限公司 | 一种中间件内存管理方案 |
CN102103541A (zh) * | 2011-02-28 | 2011-06-22 | 中国人民解放军国防科学技术大学 | 防止内存泄露和内存多次释放的内核模块内存管理方法 |
CN103984639A (zh) * | 2014-04-29 | 2014-08-13 | 宁波三星电气股份有限公司 | 一种动态内存分配方法 |
CN106874220A (zh) * | 2017-02-15 | 2017-06-20 | 济南浪潮高新科技投资发展有限公司 | 一种nand flash阵列二级地址映射表的实现方法 |
Non-Patent Citations (1)
Title |
---|
CML指针类型编译程序的设计与实现;韩冬莹;《中国优秀硕士学位论文全文数据库》;20071102;第40-48页 * |
Also Published As
Publication number | Publication date |
---|---|
WO2018063020A1 (en) | 2018-04-05 |
US11042477B2 (en) | 2021-06-22 |
EP3504628B1 (en) | 2020-09-09 |
US20190220391A1 (en) | 2019-07-18 |
EP3504628A1 (en) | 2019-07-03 |
CN109690498A (zh) | 2019-04-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109690498B (zh) | 内存管理方法和设备 | |
US10318434B2 (en) | Optimized hopscotch multiple hash tables for efficient memory in-line deduplication application | |
CN108038002B (zh) | 一种嵌入式软件内存管理方法 | |
CN108132842B (zh) | 一种嵌入式软件内存管理系统 | |
CN106294190B (zh) | 一种存储空间管理方法及装置 | |
US10152501B2 (en) | Rollover strategies in a n-bit dictionary compressed column store | |
US7085911B2 (en) | Resizable cache sensitive hash table | |
JP3611305B2 (ja) | 永続的且つロバストな記憶割当てシステム及び方法 | |
CN107066498B (zh) | 键值kv存储方法和装置 | |
US20170286004A1 (en) | Dedupe dram system algorithm architecture | |
US10496543B2 (en) | Virtual bucket multiple hash tables for efficient memory in-line deduplication application | |
US10824555B2 (en) | Method and system for flash-aware heap memory management wherein responsive to a page fault, mapping a physical page (of a logical segment) that was previously reserved in response to another page fault for another page in the first logical segment | |
US11074179B2 (en) | Managing objects stored in memory | |
US11314689B2 (en) | Method, apparatus, and computer program product for indexing a file | |
CN110096221B (zh) | 存储器系统及其控制方法 | |
EP3979083A1 (en) | Method and system for garbage collection in a storage system based on longevity of stored data | |
US20100030994A1 (en) | Methods, systems, and computer readable media for memory allocation and deallocation | |
US7861056B2 (en) | Methods, systems, and computer program products for providing memory management with constant defragmentation time | |
CN114327917A (zh) | 内存管理方法、计算设备及可读存储介质 | |
US20050154851A1 (en) | Fast, high reliability dynamic memory manager | |
US10528284B2 (en) | Method and apparatus for enabling larger memory capacity than physical memory size | |
US20100241808A1 (en) | Cache-line aware collection for runtime environments | |
CN115964002B (zh) | 一种电能表终端档案管理方法、装置、设备及介质 | |
WO2017095367A1 (en) | Managing objects stored in memory | |
US9361040B1 (en) | Systems and methods for data storage management |
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 |