在运行时对堆数据进行池分配的方法技术

技术编号:4271944 阅读:235 留言:0更新日期:2012-04-11 18:40
本发明专利技术提供一种在运行时对堆数据进行池分配的方法,包括接收堆数据的内存池分配请求;考察调用点上下文,将包含在包装函数中的所述调用点的地址和调用最上层包装函数的调用点的地址加入变长调用链;为从所述变长调用链所分配的堆数据对象选择内存池;从所述内存池中为所述堆数据分配空间。本发明专利技术能够解决关系不紧密的堆数据对象因为在同一个调用点分配而从同一个内存池分配的问题以及关系紧密的堆数据对象因为在不同的调用点分配而从不同的内存池分配的问题,提高了池分配的效果。

【技术实现步骤摘要】

本专利技术涉及内存分配领域,特别涉及。
技术介绍
随着处理器技术的快速发展,处理器速度和存储系统之间的速度差已经越来越大。存储系统的速度正成为计算机整体运行速度进一步提高的瓶颈。为了提高存储系统的速度,现有技术中提出了多种方法,其中的提高数据的局部性的方法可以在不增加带宽需求的情况下提高存储系统的性能,因而得到了广泛的应用。 堆(heap)是程序内存空间中的一块区域,程序运行时动态需要的内存是从堆中进行分配的。例如C程序通过malloc和calloc等系统函数从堆中申请内存,用free函数将申请的内存释放回堆中;C++程序通过new操作申请,通过delete操作释放;Java程序也通过new操作申请,但是通过垃圾收集器(Garbage Collector,GC)来自动释放不再使用的内存。在很多程序中,堆数据占据了总数据的很大一部分,因此对堆数据进行数据布局,对于提高数据的局部性,进而提高存储系统的性能具有很重要的意义。 以参考文献1“X.Huang,S.M.Blackburn,K.S.McKinley,J.E.B.Moss,Z.Wang,and P.Cheng.The garbage collection advantage,improving programlocality.In Conference on Object Oriented Programming Systems Languagesand Applications,pages 69-80,2004”为代表的很多现有的堆数据布局方法的实现依赖于垃圾收集器(Garbage Collector,GC),由于GC可以在运行时移动对象并更新它的相关引用,因此它可以根据需要动态进行数据布局的工作。然而很多程序在运行时得不到GC的支持,此时由于别名的存在将不能保证更新被移动数据的所有相关引用,所以在这种情况下移动一个数据对象可能会引起程序错误。因此,为了避免程序出错,在分配数据时就应当考虑数据的局部性,并把它们从合适的位置分配。池分配(PoolAllocation)是数据分配的一种方法,池分配是把所有堆数据对象分成不同的组,分配堆数据对象时从所在组的“内存池”(Memory Pool,一段连续的内存空间)里分配,以提高组内的数据对象的局部性。参考文献2“C.Lattner and V.Adve.Automatic pool allocationImproving performance bycontrolling data structure layout in the heap.In Conference on ProgrammingLanguage Design and Implementation,pages 129-142,2005”所公开的一种现有的池分配方法是在编译器中使用启发式方法识别属于同一个数据结构(如链表的所有节点,树的所有节点等)的堆数据对象,然后把它们从同一个内存池里分配。这种方法依赖于程序源代码和特定的编译器。 参考文献3“S.Rubin,R.Bodik,and T.M.Chilimbi.An efficient profileanalysis framework for data-layout optimizations.In Annual Symposium onPrinciples of Programming Languages,pages 140-153,2002”所公开的另外一种事先训练的方法可以获得频繁的访存模式等信息,为各种优化(包括池分配)提供依据。这种方法需要一次或多次专门的运行来进行训练,而且训练也需要寻找有代表性的输入集。 参考文献4“Q.Zhao,R.Rabbah,andW.Wong.Dynamic memoryoptimization using pool allocation and prefetching.ACM SIGARCH ComputerArchitecture News,33(5)27-32,2005”所公开的现有动态池分配方法在运行时把从同一个调用内存分配函数(如malloc)的调用点(以下简称调用点)分配的对象分在同一组,从同一个内存池中分配。这种方法没有对运行时环境、源代码或训练的依赖,对用户透明。但是内存分配点和内存池是一一对应的关系,不够灵活,不能适应以下一些常见的情况。 一种情况是一些关系不紧密的堆数据对象可能会从同一个调用点分配。例如,程序员经常在分配内存时使用包装函数来增强程序的健壮性。包装函数调用系统的分配函数,并检查返回的指针是否是合法值,图1给出了包装函数的一个示例。当使用包装函数时,它包含的调用点分配的堆数据对象是由包装函数的调用者决定的,因此这些对象可能完全无关,但是按照文献4的方法它们会从同一个池里分配。例如在SPEC2000的175.vpr,176.gcc,253.perlbmk,300.twolf等例子中,几乎所有的内存分配都是通过调用两个包装函数(一个包装malloc,一个包装calloc)来实现的,因此这几个例子分配的大部分内存都集中在两个池里。这种分配结果和使用默认的分配函数相比并没有太大改进,不能发挥池分配的优势。 另一种情况是一些关系紧密的堆数据对象可能会从不同的调用点分配。这种情况可能是程序员的意图(例如程序员在程序的多个位置分配节点的内存,并把节点插入同一个链表),也可能是由编译器优化产生(例如编译器对包含内存分配的循环进行循环展开)。按照文献4的方法,这些对象会根据调用点不同而分散到多个池里。但是实际上,更好的分配方案是把这些关系紧密的堆数据对象从同一个池里分配。
技术实现思路
本专利技术的目的是克服现有技术不能解决关系不紧密的堆数据对象因为在同一个调用点分配而从同一个内存池分配的问题以及关系紧密的堆数据对象因为在不同的调用点分配而从不同的内存池分配的问题,从而提供一种。 为了实现上述目的,本专利技术提供了一种,包括 步骤1)、接收堆数据的内存池分配请求; 步骤2)、考察调用点上下文,将包含在包装函数中的所述调用点的地址和调用最上层包装函数的调用点的地址加入变长调用链; 步骤3)、为从所述变长调用链所分配的堆数据对象选择内存池; 步骤4)、从所述内存池中为所述堆数据分配空间。 上述技术方案中,所述的步骤3)包括分析变长调用链所分配的堆数据对象,为具有紧密关系的堆数据对象分配同一个内存池,为不具有紧密关系的堆数据对象分配不同的内存池。 上述技术方案中,所述的步骤3)包括 步骤3-1-1)、分析从所述变长调用链所分配的堆数据对象的指针信息; 步骤3-1-2)、从该变长调用链所分配的堆数据对象A和从另一变长调用链所分配的堆数据对象B具有相同的类型,并且所述A的指针保存在所述B的某个域中,所述A和B具有紧密关系,共用一个内存池。 上述技术方案中,所述的步骤3)包括 步骤3-2-1)、分析从所述变长调用链所分配的堆数据对象的指针信息; 步骤3-2-2)、从该变长调用链所分配的堆数据对象A的指针记录在一组对象C的某个域里,而从另一变长调用链所分配的堆数据对象B的指针也保存在这组对象C的同一个域里,本文档来自技高网
...

【技术保护点】
一种在运行时对堆数据进行池分配的方法,包括:步骤1)、接收堆数据的内存池分配请求;步骤2)、考察调用点上下文,将包含在包装函数中的所述调用点的地址和调用最上层包装函数的调用点的地址加入变长调用链;步骤3)、为从所述变长调用链所分配的堆数据对象选择内存池;步骤4)、从所述内存池中为所述堆数据分配空间。

【技术特征摘要】
1.一种在运行时对堆数据进行池分配的方法,包括步骤1)、接收堆数据的内存池分配请求;步骤2)、考察调用点上下文,将包含在包装函数中的所述调用点的地址和调用最上层包装函数的调用点的地址加入变长调用链;步骤3)、为从所述变长调用链所分配的堆数据对象选择内存池;步骤4)、从所述内存池中为所述堆数据分配空间。2.根据权利要求1所述的在运行时对堆数据进行池分配的方法,其特征在于,所述的步骤3)包括分析变长调用链所分配的堆数据对象,为具有紧密关系的堆数据对象分配同一个内存池,为不具有紧密关系的堆数据对象分配不同的内存池。3.根据权利要求2所述的在运行时对堆数据进行池分配的方法,其特征在于,所述的步骤3)包括步骤3-1-1)、分析从所述变长调用链所分配的堆数据对象的指针信息;步骤3-1-2)、从该变长调用链所分配的堆数据对象A和从另一变长调用链所分配的堆数据对象B具有相同的类型,并且所述A的指针保存在所述B的某个域中,所述A和B具有紧密关系,共用一个内存池。4.根据权利要求2所述的在运行时对堆数据进行池分配的方法,其特征在于,所述的步骤3)包括步骤3-2-1)、分析从所述变长调用链所分配的堆数据对象的指针信息;步骤3-2-2)、从该变长调用链所分配的堆数据对象A的指针记录在一组对象C的某个域里,而从另一变长调用链所分配的堆数据对象B的指针也保存在这组对象C的同一个域里,并且所述A和B的类型相同,所述A和B具有紧密关系,共用一个内存池。5.根据权利要求2所述的在运行时对堆数据进行池分配的方法,其特征在于,所述的步骤3)包括步骤3-3-1)、分析从所述变长调用链所分配的堆数据对象的指针信息;步骤3-3-2)、从该变长调用链所分配的堆数据对象不和从任何其它变长调用链所分配的堆数据对象共用一个内存池,新建一个内存池。6.根据权利要求3或4或5所述的在运行时对堆数据进行池分配的方法,其特征在于,所述的步骤2)包括步骤2-1)、用当前的调用点的地址查找包装函数表,构造变长调用链;所述包装函数表记录了已知的包装函数的信息;步骤2-2)、用所述变长调用链查找映射表,在无法从所述映射表中找到与该变长调用链所对应的内存池的信息时,执...

【专利技术属性】
技术研发人员:王振江武成岗
申请(专利权)人:中国科学院计算技术研究所
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1