管理动态存储器的嵌入式系统和动态存储器管理方法

文档序号:6586354阅读:157来源:国知局
专利名称:管理动态存储器的嵌入式系统和动态存储器管理方法
技术领域
各种实施例涉及一种包括存储器管理单元的嵌入式系统,更具体地讲,涉及一种 包括动态分配存储器的存储器管理单元的嵌入式系统。
背景技术
存储器管理可以直接影响包括微处理器的嵌入式系统的性能。通常为了在微处理器中执行各种应用程序,存储器管理针对每个应用程序分配(allocate)嵌入式系统的一 部分存储器和释放(free)所述分配的一部分存储器。存储器分配操作被分为静态存储器 分配操作和动态存储器分配操作。静态存储器分配操作使用固定量的存储器。然而,在一些示例中,相对大的固定量的存储器在嵌入式系统中造成对存储器的不需要的消耗。因此,具有有限量的存储器的嵌 入式系统需要针对各种应用程序的动态存储器分配。动态存储器分配可以从未使用的存储器块的堆(heap)分配存储器。已经使用了各种算法来更有效地执行动态存储器分配。为了实现算法,自由块(free block)(响应于 存储器请求而被分配的块)搜索的速度和执行动态存储器分配的效率会是重要的。例如, 可以通过使用单个自由列表(single free list)来管理多个自由块,可以使用诸如首次适 应(first-fit)、下次适应(next-fit)、最佳适应(best-fit)等的各种存储器分配策略来 搜索单个自由列表。此外,可以通过使用分离的自由列表(segregated free list)来管理 多个自由块。在这样的情况下,可以根据关于请求存储器分配的对象的大小的信息来选择 多个自由列表中的一个自由列表,并且搜索所选择的自由列表,从而将具有适合大小的存 储块分配给对象。用于动态地分配存储器的各种分配算法没有完全满足各种应用程序的需要。更 详细地讲,各种应用程序需要不同的存储器大小和请求模式(requestpattern),并优选地 使用不同的分配算法。具体地讲,虽然有效的存储器管理要求减少存储器碎片(memory fragmentation)并改善局部属性(localproperty),但是各种分配算法有时并不满足这样 的要求。

发明内容
根据本发明构思的一方面,提供了一种管理动态存储器的方法,所述方法包括如下步骤通过使用与请求存储器分配的对象的大小相关的索引信息来预测对象是长期的第 一类型对象还是短期的第二类型对象;通过使用分为多个层次等级的多个自由列表来确定 堆存储器是否包括将被分配给对象的自由块;如果确定堆存储器包括自由块,则将自由块 分配给对象,其中,如果预测对象是第一类型对象,则在堆存储器中沿第一方向将自由块分配给对象,如果预测对象是第二类型对象,则在堆存储器中沿第二方向将自由块分配给对 象。所述多个自由列表可以被分为多个自由列表级,每个自由列表级被分为多个自由 列表组,所述多个自由列表级的大小大于所述多个自由列表组的大小,每个自由列表组被 进一步分为用于将自由块分配给第一类型对象或第二类型对象的多个自由列表类。可以通过使用包括关于每个自由列表级的对象类型的位信息的预测掩码来执行 预测对象的类型的步骤,其中,通过使用包括指示每个自由列表级是否包括可用的自由块 的位信息的第一级掩码、包括指示每个自由列表组是否包括可用的自由块的位信息的第二 级掩码、包括指示每个自由列表类是否包括可用的自由块的位信息的第三级掩码来执行确 定堆存储器是否包括自由块的步骤。所述方法还可以包括如果确定自由列表级或自由列表组不包括自由块,则通过 以下步骤来执行存储器分配,即,确定高于与对象对应的自由列表级或自由列表组的自由 列表级或自由列表组是否包括自由块,和/或确定堆存储器的分配给类型与对象的预测的 类型不同的对象的区域中是否包括自由块。所述方法还可以包括,响应于针对对象的存储器解除分配请求来针对对象解除分 配,其中,解除分配存储器的步骤包括基于关于请求解除分配的块的大小和类型的信息来 更新第一级掩码至第三级掩码的位信息;检测在存储器分配和解除分配之间执行存储器分 配的其他块的数量以确定块的寿命,并基于检测的结果来更新预测掩码。所述方法还可以包括当请求存储器分配的对象的大小超过自由块的大小时,将 所述自由块划分为多个自由块。所述方法还可以包括将用于大小小于预定大小的存储器的存储器分配请求与其 他的存储器分配请求分开。根据本发明构思的另一方面,提供了一种管理动态存储器的方法,所述方法包括 确定堆存储器是否包括自由块,堆存储器被虚拟地分为多个区域,自由块通过使用多个自 由列表被分配给对象,所述多个自由列表基于多个自由块的大小而被分为多个层次等级; 与堆存储器的所述多个区域的数量对应地将所述多个层次等级中的低层次等级分为多个 自由列表类,并通过使用包括关于堆存储器的所述多个区域中的最近分配的区域的信息的 至少一个状态掩码来选择一个自由列表类;如果选择的自由列表类包括可用的自由块,则 将堆存储器的对应的区域分配给对象。根据本发明构思的另一方面,提供了一种嵌入式系统,所述嵌入式系统响应于存 储器分配请求动态地分配存储器,所述嵌入式系统包括嵌入式处理器,控制所述嵌入式系 统的操作,并包括响应于应用程序的存储器分配请求而控制动态存储器分配的存储器管理 单元;存储器单元,在嵌入式处理器的控制下将存储器分配给请求存储器分配的对象,其 中,存储器管理单元确定存储器单元是否包括自由块,通过使用多个自由列表将自由块分 配给对象,基于多个自由块的大小将所述多个自由列表分为多个层次等级。


通过下面结合附图的详细描述,将更清楚地理解本发明构思的各种实施例,附图 中
图1是根据本发明实施例的嵌入式系统的框图;图2示出根据本发明实施例的图1中示出的存储器单元; 图3示出根据本发明实施例的用于管理存储器的各种位(bit)掩码;图4A和图4B示出根据本发明实施例的查找表和预测掩码;图5示出根据本发明实施例的堆存储器中针对第一类型对象和第二类型对象而 执行的存储器分配操作;图6是示出根据本发明实施例的由图5中示出的嵌入式系统执行的存储器分配操 作的流程图;图7是示出根据本发明实施例的存储器解除分配(de-allocation)操作的流程 图;图8A示出根据本发明另一实施例的嵌入式系统中位掩码和自由列表组织 (organization);图8B示出根据本发明另一实施例的堆存储器组织;图9是示出根据本发明实施例的由图8A和图8B中示出的嵌入式系统执行的存储 器分配操作的流程图。
具体实施例方式现在,将参照示出了一些示例实施例的附图来更充分地描述各种示例实施例。然 而,本发明可以以许多不同的形式来实施,并不应该被解释为限于这里阐述的示例实施例。 相反,提供这些示例实施例使得本公开是彻底和完整的,并将把本发明的范围充分地传达 给本领域技术人员。附图中相同的标号始终表示相同的元件,因此将省略对它们的描述。应该理解的是,虽然术语第一、第二、第三等可以在这里用来描述不同的元件、组 件、区域、层和/或部分,但是这些元件、组件、区域、层和/或部分不应该受这些术语限制。 这些术语仅是用来将一个元件、组件、区域、层或部分与另一区域、层或部分区分开。因此, 在不脱离本发明的教导的情况下,下面讨论的第一元件、组件、区域、层或部分可以被称为 第二元件、组件、区域、层或部分。这里使用的术语只是出于描述具体示例实施例的目的,而不意在限制本发明。除 非上下文另外清楚地指出,否则这里所使用的单数形式也意在包括复数形式。还应该理解 的是,当术语“包括”和/或“包含”在本说明书中使用时,表明存在所述特征、整体、步骤、 操作、元件和/或组件,但不排除存在或添加一个或多个其他特征、整体、步骤、操作、元件、 组件和/或它们的组。除非另有定义,否则这里使用的所有术语(包括技术术语和科学术语)具有与本 发明所属领域的普通技术人员所通常理解的意思相同的意思。将进一步理解,除非这里明 确定义,否则术语(如在通用的字典中定义的术语)应该被解释为具有与相关领域的上下 文中它们的意思相一致的意思,而不是理想地或者过于正式地解释它们的意思。对于根据本发明实施例的由嵌入式系统执行的动态存储器分配策略,包括在嵌入 式系统中的存储器管理单元接收应用程序的针对对象的存储器分配请求,并预测对象是短 期的还是长期的。在下面描述的实施例中,短期对象和长期对象被分别定义为第一类型对 象和第二类型对象。
根据对象寿命的预测结果,存储器管理单元针对第一类型对象和第二类型对象执 行不同的存储器分配操作。例如,如果应用程序请求用于第一类型对象的存储器分配,则存 储器管理单元可以从堆存储器的底部至堆存储器的顶部将存储器分配给第一类型对象,如 果应用程序请求用于第二类型对象的存储器分配,则存储器管理单元可以从堆存储器的顶 部至堆存储器的底部将存储器分配给第二类型对象。通常,各种应用程序请求用于大小小的对象和大小大的对象的存储器分配。大小 小的对象最有可能是第一类型对象。具体地讲,如果将单个堆存储器用于所有的请求对象 而没有确定对象是第一类型对象还是第二类型对象,则存储器碎片会因第一类型对象而增 多。因此,根据本发明的实施例,沿不同方向针对第一类型对象和第二类型对象执行存储器 分配,从而减少存储器碎片。各种应用程序请求大小不同的存储器的分配。请求存储器分 配的对象具有不同的寿命。如果已知对象的存储器需求和平均寿命,则使用用于短期对象 的特定区块(chunk)的存储器将解决这样的问题。然而,诸如多媒体流和无线应用程序的 当前应用程序的存储器需求不是可预测的,而且,平均存储器需求从一个配置到另一个配 置变化很大。因此,利用特定的存储器区块(chunk)的最差的情况在于,存储器需求会导致 存储器空间的高开销(overhead)。因此,在本发明中,预测请求的对象是第一类型对象还是 第二类型对象,并在预定的时间段内执行存储器分配(或解除分配)。存储器分配操作减少 存储器碎片并保持空间局部性。图1是根据本发明实施例的嵌入式系统100的框图。参照图1,嵌入式系统100可 以包括嵌入式处理器110,控制嵌入式系统100的总体操作,并包括操作系统(OS);存储 器单元120,受嵌入式处理器110控制并存储用于操作嵌入式系统100的各条数据和各种命 令。嵌入式处理器110还可以包括存储器管理单元111,存储器管理单元111控制由存储器 单元120执行的存储器分配和释放(free)操作。存储器单元120可以包括用于响应于应 用程序的存储器请求而动态分配存储器的堆存储器。图2示出根据本发明实施例的图1中示出的存储器单元120。参照图2,存储器单 元120可以包括将根据应用程序的请求而被分配的自由块和已经分配给预定的应用程序 的使用块(used block)。自由块和使用块可以分别包括作为关于自由块和使用块的各条 信息(使用状态、块类型、块大小)的头部信息。例如,头部信息可以包括标志信息,诸如 AV和BlkType。标志信息AV指示对应的块是自由块还是使用块。标志信息BlkType指示 自由块或使用块的类型。头部信息可以包括指示自由块或使用块的Blksize的至少一个字 (word)。因为存储器单元大小为4字节(byte)的倍数,所以Blksize信息的低两位将总是 为零。因此,在头部中,高30位用于Blksize信息,低2位用于标志信息。除了头部信息之外,自由块和使用块分别具有各条指针信息。例如,自由块可以包括指针信息Prev_Physical_Blk_Ptr、Next_Physical_Blk_Ptr,指示物理相邻的块是 自由块还是使用块;另一条指针信息Prev_FreeListPtr、Next_FreeListPtr,指示自由列 表中前面的和后面的自由块的位置。同时,使用块可以包括指针信息PreV_PhysiCal_ Blk_Ptr、Next_Physical_Blk_Ptr,指示物理相邻的块的状态。然而,因为使用块被从自 由列表删除,所以使用块不需要包括指示前面的和后面的自由块的位置的指针信息Prev_ FreeListPtr、Next_FreeListPtr。需要指针信息以合并(coalesce)物理相邻的块或通过 使用自由列表来管理自由块。
在本实施例中,使用多个自由列表来执行存储器管理(存储器分配或存储器释放 (存储器分配的解除(cancellation)))。每个自由列表具有预定范围内的类似的大小,并 管理特定(第一或第二)类型的自由块。具体地讲,在本实施例中,自由列表分为多个层次 等级(例如,三个层次等级),以分开并管理分配给第一类型对象的第一类型块和分配给第 二类型对象的第二类型块。例如,自由列表可以分为多个自由列表级(例如,32个自由列表 级)。分为自由列表级的自由列表可以用于管理大小按2的倍数增加的自由块。例如,包括 在第N自由列表级中的自由列表可以用于管理大小在2N和2n+1_1之间的自由块,包括在与 第N自由列表级相邻的第N+1自由列表级中的自由列表可以用于管理大小在2N+1和2n+2-1 之间的自由块。每个自由列表级可以被分为的不同的两个或更多个自由列表组。更具体地讲,自由列表级可以用于确定相对宽的范围的自由块,自由列表组可以被用于在对应的自由列表 级中确定相对窄的范围的自由块。然后,每个自由列表组可以被进一步分为两个或更多个 自由列表类。即,每个自由列表组可以被分为第一自由列表类和第二自由列表类,与第一自 由列表类对应的自由列表管理第一类型的自由块,与第二自由列表类对应的自由列表管理 第二类型的自由块。图3示出根据本发明实施例的用于管理存储器的各种位掩码。参照图3,位掩码用 于预测对应的自由列表级或对应的自由列表组是否包括自由块。两个第一级掩码均可以包 括32位信息。一个第一级掩码S指示第一类型的自由块的可用性。另一个第一级掩码L 指示第二类型的自由块的可用性。如参照图2描述的,包括在嵌入式系统100中的自由列 表可以被分为多个自由列表级。例如,如果自由列表被分为32个自由列表级,则包括在两 个第一级掩码中的32位中的每一位指示关于每个自由列表级是否包括可用的自由块的信 肩、ο每个自由列表级被分为多个自由列表组。存储器管理单元111包括多个第二级掩 码,以预测每个自由列表组是否包括可用的自由块。例如,如果每个自由列表级被分为8个 自由列表组,则8位的第二级掩码可以对应于这两个第一级掩码之一的每一位。如果两个 第一级掩码具有32位,则可以在存储器管理单元111中包括64个8位的第二级掩码。在这 样的情况下,被分为32个自由列表级的自由列表每个自由列表级被分为8个自由列表组。 每个第二级掩码的位指示关于每个自由列表组是否包括可用的自由块的信息。同时,每个自由列表组可以被分为与第一类型对应的第一自由列表类和与第二类 型对应的第二自由列表类。第三级掩码指示关于每个自由列表类是否包括可用的自由块的 fn息ο图4A和图4B示出根据本发明实施例的查找表TBl和TB2和预测掩码Pred_MaSk, 查找表TBl和TB2用于加速第一级索引和第二级索引计算,预测掩码PrecLMask用于通过 使用第一级索引来预测对象是第一类型对象还是第二类型对象。参照图4A,如果存储器管 理单元111接收针对对象的存储器分配请求,则存储器管理单元111通过使用关于对象的 大小的信息和查找表TBl来计算第一级索引。查找表TBl提供块大小中值为1的最高有效 位(MSB)的位置值(例如,如果对象的大小在2N*2N+1-1之间,则第一级索引为N)。查找 表TBl可以用于在不进行诸如预定的对数(log)操作的位搜索操作的情况下快速计算第一 级索引。第一级索引可以通过使用下面的算法来计算。
算法1BitShift = 24 ;Byte = BlkSize >> BitShift ;first-level-index = LTBl[Byte];While(first-level-index = = OxFF){BitShift+ = -8 ;Byte = (BlkSize >> BitShift) &&OXFF ;first-level-index = LTBl[Byte];}first-level-index+ = BitShift ;N = first-level-index ;如果存储器管理单元111计算了第一级索引,则预测掩码PrecLMask预测请求存 储器分配的对象是第一类型对象还是第二类型对象。例如,如果存储器管理单元111计算 出第一级索引的值为N,则计算预测掩码PrecLMask的第N位的值。如果预测掩码Pred_ Mask的第N位的值为1,则请求存储器分配的对象被确定为第一类型对象,如果预测掩码 PrecLMask的第N位的值为0,则请求存储器分配的对象被预测为第二类型对象。预测掩码PrecLMask初始建立为具有预定的值并预测请求存储器分配的对象是 第一类型对象还是第二类型对象。在本实施例中,每当释放某一块时,更新预测掩码Pred_ Mask。当释放块时,可以确定该块的寿命,并且可以基于确定的寿命来更新预测掩码Pred_ Mask的对应位值。可以基于在块的分配和分配的解除之间已经分配的其他块的数量来确定 块的寿命。当释放某一块时,存储器管理单元111统计地预测该块是第一类型块还是第二 类型块,并根据确定的结果将预测掩码PrecLMask更新为具有与该块对应的位值1或0。例如,预测掩码PrecLMask可以包括每个自由列表级的位信息,存储器管理单元 111根据包括请求存储器分配的对象的级来使用预测掩码PrecLMask以预测对象是第一类 型对象还是第二类型对象。因此,当自由列表被分为32个自由列表级时,预测掩码Pred_ Mask包括32位信息。如果预测掩码初始建立为具有1023的十进制值,则预测掩码Pred_ Mask的低10位具有1的二进制值。在初始存储器分配期间,如果基于请求存储器分配的对 象的大小第一级索引为4,则存储器管理单元111将对象预测为第一类型对象。如上所述,使用请求存储器分配的对象的大小和查找表TBl来预测对象的类型并 确定多个自由列表级中的一个自由列表级。如果将对象的类型预测为第一类型对象,则将 第一级掩码S用于第一类型对象。然后根据用于第一类型对象的第一级掩码S的位信息来 确定所确定的自由列表级是否包括可用的自由块。可选择地,如果将对象的类型预测为第 二类型对象,则将第一级掩码L用于第二类型对象。然后根据用于第二类型对象的第一级 掩码L的位信息来确定所确定的自由列表类是否包括可用的自由块。图5示出根据本发明实施例的堆存储器中针对第一类型对象和第二类型对象执 行的不同的存储器分配操作。参照图5,可以包括在存储器单元120中的堆存储器可以包括 用于存储第一类型对象的第一类型块和用于存储第二类型对象的第二类型块。例如,大小 为200字节的堆存储器可以包括用于第一类型对象的一个100字节部分和用于第二类型对 象的另一 100字节部分。然后,响应于针对8字节对象(假设为第一类型对象)的分配请求,可以从堆存储器的底部至堆存储器的顶部将存储块分配给8字节对象,响应于针对32 字节对象(假设为第二类型对象)的分配请求,可以从堆存储器的顶部至堆存储器的底部 将存储器块分配给32字节对象,反之亦然。如上所述,堆存储器被分为用于分配第一类型对象的部分和用于分配第二类型对 象的部分,从而易于根据对象的类型来调节堆存储器的边界(boundary)。例如,如果将被分 配给第一类型对象的大自由块存在于堆存储器的边界上,而在堆存储器的边界上将被分配 给第二类型对象的部分不足,则将大自由块分为多个(例如,两个)自由块,且分为的自由 块中的一个自由块被提供为用于第二类型对象的存储器部分。因此,可以在堆存储器中调 节分配给第一类型对象和第二类型对象的部分的大小。图6是示出根据本发明实施例的存储器分配操作的流程图。参照图6,在操作S11 中,对应于请求存储器分配的对象的大小的初始非零(例如,为1的位值)表示的位置来计
算第一级索引。在计算第一级索引之后,操作S12通过使用与第一级索引对应的预测掩码的位值 来确定请求存储器分配的对象是第一类型对象还是第二类型对象。根据预测掩码的位值, 在操作S13中初始化用于第一类型对象的第一级掩码S,或者,在操作S14中初始化用于第 二类型对象的第一级掩码L。使用第一级索引N,操作S15基于第一级掩码的第N位的值来确定第N级是否包括 可用的自由块。如果第N级包括可用的自由块,则在操作S16中从关于请求存储器分配的 对象的大小的信息计算第二级索引。第二级索引可以具有与请求存储器分配的对象的大小 对应的位的值中位于初始值为1的MSB右侧的预定量的位的值。例如,如果每个自由列表 级包括2~k个自由列表组,则第二级索引可以具有包括在请求存储器分配的对象的大小中 的k个位的值。在计算第二级索引之后,操作S17通过使用第二级索引和第二级掩码来确定对应 的组是否包括可用的自由块。自由列表组被分为两个或更多的自由列表类。例如,自由列表 组可以被分为与第一类型对象对应的第一自由列表类SWay和与第二类型对象对应的第二 自由列表类LWay。如果对应的自由列表组包括可用的自由块,则基于预测的块类型来分别 选择第一自由列表类Sway和第二自由列表类LWay中的一个自由列表类。在操作S18中, 通过使用来自第一自由列表类SWay的顶部自由块来分配请求存储器分配的对象,或通过 使用来自第二自由列表类LWay的顶部自由列表块来分配请求存储器分配的对象。在选择的自由块的大小大于请求存储器分配的对象的大小时,存储器管理单元 111基于预定的划分标志(split flag)确定是否将可用的自由块划分为两个或更多的自 由块。例如,如参照操作S13和操作S14描述的,当请求存储器分配的对象是第一类型对象 时,可以禁止划分与第一对象类型对应的自由块的操作。同时,当请求存储器分配的对象是 分配到大小相对大的自由块的第二类型对象时,可以启用所述操作。在操作S19中,当第N级不包括可用的自由块或者包括在第N级中的自由列表组 不包括可用的自由块时,可以将包括在另一级或组中的自由块分配给请求存储器分配的对 象。可以使用各种方法来执行操作S19。例如,第一级索引可以大于初始值N。在这样的示例中,第一级索引具有第一级掩 码中高于第N位并具有非零位的值(1)的位的位置值。在这样的情况下,第二级掩码可以建立为O。更具体地讲,因为第一级索引的重建导致选择更高的自由列表级,所以第二级索 引可以为O以选择包括在所述更高的自由列表级中的自由列表组。图4B中示出的查找表 TB2可以用于重建第一级索引。可以通过使用下面的算法来重建第一级索引和第二级索引。算法2
first-level-index++ ;Mask = FirstLevMask > > first—level—indexTemp = LTb2 [Mask & OxFF]while (Temp == OxFF) {Mask = Mask >> 8 ;if (Mask = = 0) {//Out of memory, get new memory block from OS.}Temp = LTb2 [Mask & OxFF];first-level-index+ = 8 ;}second-level-index = LTb2[SecondLevMask[first-level-index]];类似地,如果预定的自由列表组(例如,第M自由列表组)不包括可用的自由块, 则第二级索引可以建立为大于M。可以与第一级索引的重建类似地执行这样的重建。更具 体地讲,如果自由列表组不包括可用的自由块,则可以分配包括在更高的自由列表组中的 可用的块。在具体的情况下,如果请求存储器分配的对象为第一类型对象且第N级不包括可 用的第一类型块,可以通过使用与第二类型对象对应的第一级掩码L来确定第N级是否包 括可用的第二类型块。如果第N级包括可用的第二类型块,则第一级索引可以建立为初始 值(例如,N),可以将请求存储器分配的对象确定为第二类型对象。因此,可以有效地使用 小自由块。用于小于预定量的字节(例如,32个字节)的存储器的存储器分配请求可以与另 一存储器分配请求分开。例如,在操作S20中,可以使用与上述的自由列表分开的自由列表 来处理存储器小于32字节的存储器分配请求。可以通过简单的位移位操作来索引与上述 的自由列表分开的自由列表。如果请求存储器分配的对象的大小小于32字节,则在操作 S21中,可以使用不同的自由列表来执行存储器分配。图7是示出根据本发明实施例的存储器解除分配操作的流程图。参照图7,在操作S31中,接收存储器解除分配请求。接下来,操作S32通过使用与 各条指针信息相关的双向链接列表(doubly linked list)来确定解除分配请求是否涉及 有效对象。如果解除分配请求不涉及有效对象,则操作S33发送错误消息。在操作S34中,响应于存储器解除分配请求基于双向链接列表来确定物理相邻的 块的状态。如果确定结果为在相邻的块中存在一个自由块或两个自由块,则可以将对应的 自由块和与对应的自由块相邻的自由块合并以形成大自由块。将形成的自由块插入到通过 使用新形成的块的大小和块类型来标识的自由列表类中。同时,如果没有相邻的自由块,则 将对应的自由块(请求存储器解除分配的块)插入到通过使用解除分配的块的大小和块类型来识别的自由列表类中。为了将对应的自由块插入到特定的自由列表级和组中,在操作 S35中通过使用查找表TBl来计算与释放了分配的块(或合并的块)对应的自由列表级和 自由列表组的索引。在操作S36中,基于关于块类型的信息来确定解除分配的块(或组合 的块)的类型。作为确定的结果,在操作S37中,将对应的自由块分为第一自由列表类或第 二自由列表类。在操作S38中,根据对应的块的存储器释放,通过使用从前面的操作得到的 (关于块的大小和类型)的信息来更新第一级掩码至第三级掩码。可以通过使用下面的算 法来计算自由列表级和自由列表组的索引。算法3
BitShift = 24 ;Byte = BlkSize >> BitShift ;first-level-index = LTBl[Byte];While(first-level-index = = OxFF){BitShift+ = -8 ;Byte = (BlkSize >> BitShift)&& OXFF ;first-level-index = LTBl[Byte];}first-level-index+ = BitShift ;second-level-index = (BlkSize > > (first-level-index_3))&7 ;如果解除块的分配,则可以确定块的寿命并可以根据确定的结果来更新预测掩码 的位值。可以通过在预定块的分配和解除分配块之间分配的其他块的数量来确定块的寿 命。更具体地讲,如果在预定的块的分配和解除分配之间分配了大量的块,则所述块可以被 确定为长期块。相反,如果在预定块的分配和解除分配之间分配了少量的块,则所述块可以 被确定为短期块。可以使用下面的算法来更新预测掩码。算法4Blk_LifeTime = Global_Alloc_BlkNum_Alloc_BlkNum ;if(Blk_LifeTime < (Blk_Max_LifeTime/2)){ModeCnt [Class]++ ;}else{ModeCnt [Class]—;Max_Span_In-Blks = MAX(Max_Span_In-Blks, Blk_LifeTime) ;}if (ModeCnt [Class] > 0) {BlkPredMask = BlkPredMask/(1 << Class) ;}//Class is short-livedelse{BlkPredMask = BlkPredMask & (OxFFFFFFFF “ (1 << Class)) ;}//Class is long-lived如上面的算法4中所示,根据在预定块的分配和解除分配之间分配的其他块的量 来计算所述块的寿命。对应的块的寿命与初始建立为预定值的最大寿命值进行比较。例如, 对应的块的寿命与最大寿命值Blk_MaX_LifeTime的一半进行比较。根据比较的结果,如果 对应的块的寿命小于最大寿命值Blk_Max_LifeTime的一半,则模式计数ModeCnt可以加1,如果对应的块的寿命大于最大寿命值Blk_Max_LifeTime的一半,则模式计数ModeCnt可以 减1。如果对应的块属于第N自由列表级,则可以基于模式计数ModeCnt的值将预测掩码 Pred_Mask的第N位的值设置为1或0。同时,如果对应的块的寿命大于最大寿命值Blk_ Max_LifeTime,则可以将对应的块的寿命更新为最大寿命值Blk_Max_LifeTime。关于更新预测掩码PrecLMask的操作,在本实施例中,预测掩码Pred_MaSk基于对 象的大小以及包括在预定的自由列表级中的块的统计来预测请求存储器分配的对象的寿 命。例如,当假设在包括在第N自由列表级中的大小为a、b、c、d的块中大小为a、b、d的块 是短期块且大小为c的块是长期块时,如果与大小为c的长期块相比更频繁地分配大小为 a、b、d的短期块,并因此模式计数ModeCnt的值大于预定值,则第N自由列表级可以具有1 的位值。相反,如果与大小为a、b、d的短期块相比更频繁地分配大小为c的长期块,并因此 模式计数ModeCnt的值小于预定值,则第N自由列表级可以具有0的位值。图8A和图8B示出根据本发明另一实施例的嵌入式系统中的位掩码、自由列表、堆 组织。参照图8A和图8B,包括在嵌入式系统中的存储器管理单元使用多个自由列表。可以 将堆存储器虚拟地分为多个区域。每个自由列表具有在预定区域内的大小,并管理位于堆 存储器的一个区域中的自由块。将多个等级的掩码用于层次性地分开多个自由列表。自由列表被分为多个自由列 表级,每个自由列表级被分为多个自由列表组。每个自由列表组被进一步分为多个自由列 表类。与一个自由列表类对应的自由列表管理包括在堆存储器的一个区域中的自由块。因 此,如果堆存储器被分为N个区域,则一个自由列表组可以被分为N个自由列表类。参照图8A,可以使用三个等级的位掩码来区分包括在堆存储器的一个区域中的预 定范围大小的自由块。例如,如果自由列表被分为32个自由列表级,则可以将包括32位字 段(field)的掩码用作第一级掩码。第一级掩码的每个位指示对应的自由列表级是否包括 可用的自由块。每个自由列表级可以被分为多个组。第一级掩码的每个位可以与8位的第 二级掩码对应,从而可以将32个第二级掩码用于确定每个自由列表组是否会包括可用的 自由块。每个自由列表组可以被分为多个自由列表类。例如,如果堆存储器被分为8个区 域,则每个自由列表组可以被分为8个自由列表类。因此,与每个自由列表类对应的每个自 由列表具有预定范围内的大小,并包括关于包括在堆存储器的8个区域之一中的自由块的 信息。例如,参照图8B,假设将100字节大小的块分作预定的自由列表级和自由列表组,在 堆存储器的第1区域、第5区域、第7区域中100字节大小的三个自由块均是可用的。在这 样的情况下,第1自由列表类、第5自由列表类、第7自由列表类分别保持位于堆存储器的 第1区域、第5区域、第7区域中的自由块。图9是示出根据本发明实施例的由图8中示出的嵌入式系统执行的存储器分配操 作的流程图。在本实施例中,自由列表被分为32个自由列表级,每个自由列表级被分为8 个自由列表组,每个组包括8个自由列表类。如果接收存储器分配请求,则在操作S51中,基于请求存储器分配的对象的大小 来计算第一级索引。可以按前面实施例中描述的类似方式来计算第一级索引,从而存储器 管理单元可以包括用于计算第一级索引的查找表TBI。在操作S52中,可以根据第一级索引的计算来选择多个(例如,32个)自由列表级中的一个自由列表级。在通过第一级索引选择第N自由列表级之后,在操作S53中,使用第 一级掩码来确定第N自由列表级是否包括可用的自由块。如果确定第N自由列表级包括可 用的自由块,则将第一级索引建立为N,并在操作S54中,可以将第二级索引建立为对象的 预定量的位的值。可以按前面的实施例中描述的相同方式来执行这样的操作。如果将第二级索引计算为M,则操作S55确定第N自由列表级的第M自由列表组是否包括可用的自由块。可以通过使用第二级掩码来执行这样的操作。如果第N等级不包括 可用的自由块或者包括在第N级中的自由列表组不包括可用的自由块,则可以通过使用与 前面的实施例中使用的算法类似的算法来执行存储器分配操作。在本实施例中,存储器管理单元111在最近分配的块和大小类似的块中保持空间 局部性。为了在块之间保持局部属性。可以使用第一状态掩码GlobRegNum来追踪(track) 关于存储器中最近分配了块的区域的信息,可以通过多个第二状态掩码LocRegNum来追踪 关于存储器的已经分配了大小类似的块的区域的信息。第二状态掩码LocRegNum用于追踪 关于存储器区域的信息,其中,从所述存储器区域在每个自由列表组层面最近分配了自由 块。例如,如果堆存储器被分为8个区域,则第一状态掩码GlobRegNum和每个第二状态掩 码LocRegNum可以具有3位。第一状态掩码GlobRegNum和第二状态掩码LocRegNum可以 包括在存储器管理单元中,如图8A中所示。可以全局地使用第一状态掩码GlobRegNum,可 以局部地使用第二状态掩码LocRegNum。在本实施例中,通过使用下面的处理来分配自由块。如果计算第一级索引和第二级索引,则通过使用第二级掩码来选择对应的自由列 表组。在操作S57中,使用第一状态掩码GlobRegNum来选择预定的自由列表类(包括在选 择的自由列表组中的多个自由列表类中的一个自由列表类)。在操作S58中,通过使用第三 级掩码来确定通过第一状态掩码GlobRegNum索引的选择的自由列表类是否包括可用的自 由块。如果与预定的自由列表类对应的自由块中的顶部自由块大于请求存储器分配的对象 的大小,则在操作S61中,将顶部自由块用于被请求的块。如果通过第一状态掩码GlobRegNum索引的预定自由列表不包括可用的自由块, 则在操作S59中选择通过第二状态掩码LocRegNum索引的自由列表类,操作S60确定选择 的自由列表类是否包括可用的自由块。如果确定选择的自由列表类包括可用的自由块,并 且与选择的自由列表类对应的自由块的顶部自由块大于请求存储器分配的对象的大小,则 执行操作S61。然而,如果通过第二状态掩码LocRegNum索引的自由列表类中没有可用的自 由块,则在步骤S62中顺序搜索堆存储器的区域。将包括可用的自由块的第一自由列表类 用于请求的存储器块。根据自由块的分配,更新包括最近的存储器的分配的信息的第一状 态掩码GlobRegNum和第二状态掩码LocRegNum。按前面的实施例中描述的类似方式来执行本实施例的存储器分配解除(或存储 器释放)操作。在存储器分配解除操作期间,存储器的组合可以产生大小更大的自由块,从 而基于自由块的大小来计算与自由块对应的自由列表级和自由列表组的索引。基于自由列 表类的索引将自由块包括在一个自由列表类中。例如,如果堆存储器包括8个虚拟存储器 区域,则存储器块的地址的高三位可以指示关于这8个存储器区域的信息。基于存储器区 域的信息将自由块插入到一个自由列表类中。虽然已经参照本发明构思的示例性实施例具体示出并描述了本发明的构思,但是应该理解的是,在不脱离权利要求的精神和范围的情况下,可以在其中进行形式和细节方面的各种改变。
权利要求
一种管理动态存储器的方法,所述方法包括如下步骤通过使用与请求存储器分配的对象的大小相关的索引信息来预测对象是长期的第一类型对象还是短期的第二类型对象;通过使用分为多个层次等级的多个自由列表来确定堆存储器是否包括将被分配给对象的自由块;如果确定堆存储器包括自由块,则将自由块分配给对象,其中,如果预测对象是第一类型对象,则在堆存储器中沿第一方向将自由块分配给对象,如果预测对象是第二类型对象,则在堆存储器中沿第二方向将自由块分配给对象。
2.如权利要求1所述的方法,其中,所述多个自由列表被分为多个自由列表级,每个自 由列表级被分为多个自由列表组,所述多个自由列表级的大小大于所述多个自由列表组的 大小,每个自由列表组被进一步分为用于将自由块分配给第一类型对象或第二类型对象的 多个自由列表类。
3.如权利要求2所述的方法,其中,通过使用包括位信息的预测掩码来执行预测对象的类型的步骤,所述位信息是关于每 个自由列表级的对象类型的,通过使用包括指示每个自由列表级是否包括可用的自由块的位信息的第一级掩码、包 括指示每个自由列表组是否包括可用的自由块的位信息的第二级掩码、包括指示每个自由 列表类是否包括可用的自由块的位信息的第三级掩码来执行确定堆存储器是否包括自由 块的步骤。
4.如权利要求2所述的方法,所述方法还包括响应于确定自由列表级或自由列表组不包括自由块,通过以下步骤来执行存储器分 配,即,确定比与对象对应的自由列表级或自由列表组高的自由列表级或自由列表组是否 包括自由块,和/或确定堆存储器的被分配给类型与对象的预测的类型不同的对象的区域 中是否包括自由块。
5.如权利要求1所述的方法,所述方法还包括响应于针对对象的存储器解除分配请 求来针对对象解除分配,其中,解除分配存储器的步骤包括基于关于请求解除分配的块的大小和类型的信息来更新第一级掩码至第三级掩码的 位信息;检测在存储器分配和解除分配之间执行存储器分配的其他块的数量以确定块的寿命, 并基于检测的结果来更新预测掩码。
6.如权利要求1所述的方法,其中,响应于超过请求存储器分配的对象的大小的自由 块的大小来将所述自由块划分为多个自由块。
7.如权利要求1所述的方法,其中,将用于大小小于预定大小的存储器的存储器分配 请求与其他的存储器分配请求分开。
8.—种管理动态存储器的方法,所述方法包括通过使用多个自由列表确定被虚拟地分为多个区域的堆存储器是否包括将被分配给 对象自由块,所述多个自由列表基于多个自由块的大小而被分为多个层次等级;将所述多个层次等级中的低层次等级分为与堆存储器的所述多个区域的数量对应的 多个自由列表类,并通过使用至少一个状态掩码来选择一个自由列表类,所述至少一个状态掩码包括关于堆存储器的所述多个区域中的最近分配的区域的信息;响应于包括可用的自由块的选择的自由列表类,将堆存储器的对应的区域分配给对象。
9.如权利要求8所述的方法,其中,多个自由列表被分为多个自由列表级,每个自由 列表级被分为多个自由列表组,所述多个自由列表级的大小大于所述多个自由列表组的大 小,每个自由列表组被进一步分为所述多个自由列表类。
10.一种嵌入式系统,所述嵌入式系统响应于存储器分配请求动态地分配存储器,所述 嵌入式系统包括嵌入式处理器,控制所述嵌入式系统的操作,并包括响应于应用程序的存储器分配请 求而控制动态存储器分配的存储器管理单元;存储器单元,在嵌入式处理器的控制下将存储器分配给请求存储器分配的对象,其中,存储器管理单元确定存储器单元是否包括自由块,通过使用多个自由列表将自 由块分配给对象,基于多个自由块的大小将所述多个自由列表分为多个层次等级。
11.如权利要求10所述的嵌入式系统,其中,存储器管理单元通过使用与请求存储器 分配的对象的大小相关的索引信息来预测对象是短期的第一类型对象还是长期的第二类 型对象,并响应于被预测为第一类型对象的对象来在堆存储器中沿第一方向将自由块分配 给对象,并响应于被预测为第二类型对象的对象来在堆存储器中沿第二方向将自由块分配 给对象。
12.如权利要求10所述的嵌入式系统,其中,存储器单元包括多个区域,所述多个自由列表被分为多个第一层次等级,每个第一层次等级被分为多个第二层次 等级,所述多个第一层次等级的大小大于所述第二层次等级的大小,每个第二层次等级被 分为与存储器单元的所述多个区域的数量对应的多个第三层次等级,存储器管理单元通过使用包括关于堆存储器的所述多个区域中最近分配的区域的信 息的至少一个状态掩码来选择存储器单元的所述多个区域中的一个存储区域,并根据确定 选择的区域是否包括自由块的结果来执行存储器分配操作。
全文摘要
本发明提供一种管理动态存储器的嵌入式系统和动态存储器管理方法。一种适于各种应用程序的存储器分配请求的动态存储器管理方法可以包括如下步骤通过使用与请求存储器分配的对象的大小相关的索引信息来预测对象是长期的第一类型对象还是短期的第二类型对象;通过使用分为多个层次等级的多个自由列表来确定堆存储器是否包括将被分配给对象的自由块;如果确定堆存储器包括自由块,则将自由块分配给对象,其中,如果预测对象是第一类型对象,则在堆存储器中沿第一方向将自由块分配给对象,如果预测对象是第二类型对象,则在堆存储器中沿第二方向将自由块分配给对象。
文档编号G06F12/08GK101799786SQ20091025915
公开日2010年8月11日 申请日期2009年12月15日 优先权日2009年2月11日
发明者文卡塔·拉玛·克里施纳·米卡, 金智星 申请人:三星电子株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1