在异构多处理器系统中收集垃圾的系统和方法

文档序号:6608874阅读:243来源:国知局
专利名称:在异构多处理器系统中收集垃圾的系统和方法
技术领域
本申请通常涉及改善的数据处理系统和方法。本申请尤其关注用于在异构多处理器系统中收集垃圾的系统和方法。
背景技术
当计算机程序执行时,它们为数据缓冲器分配存储器。当计算机程序持续分配这样的存储器时,它可能最终超过物理存储器容量。在这样的情况下,操作系统必须将程序的一部分放入虚拟存储器,即盘上以便继续执行,这降低了计算机程序的执行速度。在例程不再需要存储器之后手动释放这部分存储器是编程者经常忘记做或未正确做的乏味任务。
作为手动释放存储器的替换方法,开发了垃圾收集(garbage collection)。垃圾收集是这样的软件例程用法该软件例程在存储器中搜索不活跃的数据和指令区域,以便回收这个空间用于通用的存储器池,即堆。垃圾收集器基本上通过确定在程序的将来执行中将不会访问程序中的什么数据对象、并且回收由那些对象使用的存储器来进行工作。
垃圾收集使释放存储器自动化,以使得编程者不再必须担心释放不再需要的对象。作为结果,可以避免这个相当大的程序设计工作量的来源。此外,由于减少几类运行时错误,例如在使用对已释放对象的引用时的悬挂(dangling)指针错误,垃圾收集有助于使编程语言更安全。
称为垃圾收集语言的很多计算机编程语言要求垃圾收集或者作为语言规范的一部分(例如,Java、C#和大多数脚本语言),或者实际实现高效(例如,如lambda calculus那样的形式语言)。其它计算机编程语言可以被设计为使用手动存储器管理,但是具有垃圾收集的实现(例如,C、C++)。其它计算机编程语言,如Modula-3,通过使用分离的堆用于所收集的和手动管理的对象,而允许垃圾收集和手动存储器管理共存于同一个应用中。
跟踪垃圾收集器是最通用类型的垃圾收集器。跟踪垃圾收集器关注于确定哪些对象是可达的或可能可达的,然后丢弃所有剩余的对象。可达对象可被定义为这样的对象对于该对象,在程序环境中存在某个通向该对象的名称,其中该名称直接或通过来自其它可达对象的引用而通向该对象。更精确而言,对象只能以两种方式可到达。首先,假定一组已辨别出的对象是可达的,这些对象被称为根。通常,这些对象包括从调用堆栈中的任何地方引用的所有对象,即当前正在调用的函数中的所有局部变量和参数以及任何全局变量。其次,从可达对象引用的任何对象本身是可达的。这称为传递性。
跟踪垃圾收集器使用其中它们执行垃圾收集循环的算法。当收集器决定或被通知它需要回收存储器时开始循环,这尤其是当系统低存储器时发生。所有跟踪垃圾收集器都实现了三色标记抽象的某个变体,但是诸如标记和扫描收集器之类的简单收集器通常不显式地构造这个抽象。三色标记如下所述进行操作。
首先,创建初始的白、灰和黑色集合,这些集合将用于在循环期间保持处理进程。最初,白色集合或被责难集合(condemned collection)是这样的对象的集合这些对象是使它们的存储器被循环使用的候选者。黑色集合是这样的对象的集合可以容易地证明这些对象未引用白色集合中的对象。在很多实现中,黑色集合开始是空的。灰色集合是可能引用或可能未引用白色集合中的对象的所有剩余对象。这些集合划分存储器,以便系统中的每个对象,包括根集合在内,都正好处于一个集合中。
其后,选择灰色集合中的对象。通过“灰化”该对象直接引用的所有白色对象,即通过使该对象引用的所有白色对象以及这些白色对象引用的对象变黑,来使这个对象被变黑,即移到黑色集合中。重复这个步骤,直到灰色集合变空为止。当灰色集合中没有更多对象时,那么可以证明白色集合中的所有剩余对象都是不可达的,并且可以回收由它们占用的存储器。
利用三色标记算法,没有黑色对象直接指向白色对象。这确保一旦灰色集合是空的,就可以安全地破坏白色对象。
一旦已经确定了不可达的集合,即当灰色集合空时产生的白色集合,则垃圾收集器可以简单地释放不可达的对象,并且使其它每件事保持原样。作为选择,垃圾收集器可以将一些或所有可达对象复制到新的存储器区域中,需要时更新所有到这些对象的引用。这些分别称为“不移动”和“移动”垃圾收集器。
也可以通过考虑在收集循环期间如何保持这三个对象集合(白色、灰色和黑色)来对跟踪收集器分类。最直接的方法是半空间收集器,这是其中存储器被划分为“来空间”和“去空间”的移动垃圾收集方案。最初,将对象分配到“去空间”中直到它变为满为止,并且触发垃圾收集循环。在该垃圾收集开始处,“去空间”变为“来空间”,以及反之亦然。将可从根集合达到的对象从“来空间”复制到“去空间”。依次扫描这些对象,并且将所有它们指向的对象复制到“去空间”,直到已经将所有可达对象复制到“去空间”为止。一旦程序继续执行,则再一次从“去空间”分配新的对象,直到它再一次变满为止并且重复该处理。这种方法具有概念简单的优点,这是因为在复制处理期间隐含地构造了三个对象颜色集合,但是具有这样的缺点,即每个收集循环可能需要非常大的空闲存储器的连续区域。
通常,“标记和扫描”垃圾收集器为每个对象保留一或两位来记录它是白色还是黑色的。灰色集合或者作为单独列表维护或使用另外的位标识。当在收集循环期间遍历引用树时,这些位由收集器操纵来反映当前状态,即白色、黑色或灰色。标记和扫描策略具有这样的优点,即一旦确定了不可达的集合,即在灰色集合变空之后产生的白色集合,那么可以继续移动或不移动收集策略。当可用的存储器允许时,甚至可以在运行时进行这个策略的选择。
在垃圾收集器的一些实现中,标记和扫描垃圾收集器使用显式堆栈来存储已知为可达、但是其内容还未被检查的对象(即,“灰色”对象)。堆栈中的每个项目都包含基地址和标记描述符,来指示可能的指针相对于那个起始地址的位置。标记描述符通常采用简单的长度说明、或者描述指针位置的位向量的形式。
除了上述之外,垃圾收集器也可以是与它们如何中断它们在其中进行操作的系统中的其它操作有关的各种类型。例如,“世界停止(stop the world)”垃圾收集器完全停止程序的执行以运行收集循环,因此确保在收集器运行时未分配新的对象,并且对象不会突然变为不可达。这具有明显的缺点,即当收集循环运行时,程序不能执行有用的工作。
设计了“递增”垃圾收集器来通过将它们的工作与来自主程序的动作交织而降低这种中断性。需要进行仔细的设计来确保主程序不干扰垃圾收集器且反之亦然。例如,当程序需要分配新的对象时,运行时系统可能需要将它挂起直到收集循环结束为止,或者以某种方式通知垃圾收集器存在新的可达对象。
最后,并发垃圾收集器可以在对称多处理机上与主程序实时同时运行。可能需要复杂的锁定机制来保证正确性。此外,高速缓存问题也使这个没有人们所想象的那么有帮助。但是无论如何,对具有高性能要求的SMP应用来说,并发GC可能是所希望的。
已经开发了上述垃圾收集机制用于其中存在处理器一致性、例如单一处理器或对称多处理(SMP)系统的数据处理环境。当企图将这样的垃圾收集机制应用到非一致数据处理系统,即诸如非SMP协处理器系统、软件管理的存储器系统、非一致存储器访问(NUMA)系统之类的异构系统时,可能产生许多问题。地址格式问题、地址翻译问题、何时可以执行垃圾收集以便确保到存储器位置的指针不改、非一致性存储器延迟等仅仅是由异构系统所引起的少数几个问题。

发明内容
说明性实施例提供了用于在异构系统中执行垃圾收集的系统和方法。在一些说明性实施例中,垃圾收集操作分布在异构多处理器系统中的多个处理器上。在其它说明性实施例中,垃圾收集操作可以由异构多处理器系统中的单个处理器执行。利用这个单个垃圾收集处理器实施例,垃圾收集处理器可以专用于仅仅执行垃圾收集,或者除了其它服务任务之外还可以执行垃圾收集。
以其中垃圾收集分布在多个处理器上的说明性实施例为例,每个处理器得到一块系统存储器,即用于所讨论程序的堆的一部分,以及全局标记队列的一部分,并且将它们存储在与这个处理器相关联的本地存储中。因此,每个处理器会具有全局标记队列的不同部分的拷贝,其通常是全局标记队列的开头部分,以及该处理器在其上进行操作的系统存储器的相应不同部分的拷贝。将全局标记队列的这部分中引用的存储器对象添加到本地标记堆栈中,该本地标记堆栈包含到在本地存储中存储的存储器块中出现的存储器对象的指针或地址。
基于全局标记队列的相应部分中引用的系统存储器对象,由相应的处理器在每个系统存储器块上执行“标记和扫描”操作,其中该全局标记队列提供了每个处理器中的本地标记堆栈的初始内容。如本领域中通常所知的那样,这样的“标记和扫描”操作涉及迭代遍历由其它存储器对象对存储器对象的引用,并且将所有那些存储器对象标记为可达。
当每次只在一块系统存储器块上操作时,经常这样的遍历将导致对不在正在其上进行操作的系统存储器块内的存储器对象的引用。除了对可达和不可达存储器对象的引用进行跟踪之外,还必须跟踪这样的引用。
为了跟踪各种类型的存储器对象,说明性实施例中的本地垃圾收集操作利用本地标记堆栈和非本地标记堆栈。本地标记堆栈存储指向这样的存储器对象的指针或地址,其中这些存储器对象处于加载到处理器的本地存储中的系统存储器块中。非本地标记堆栈存储到这样的存储器对象的指针或地址,其中这些存储器对象由诸如其他存储器对象之类的软件程序引用,但是不处于加载到本地存储中的当前系统存储器块中。
最初,部分全局标记队列用于用指向存在于加载到本地存储中的系统存储器块中的存储器对象的指针来填充本地标记堆栈。当在指向本地标记堆栈中的存储器对象的指针上执行“标记和扫描”操作时,可能会遇到指向未存在于加载到本地存储中的系统存储器块中的其它存储器对象的其它指针。当遇到这样的指针时,将该指针添加到非本地标记堆栈中。以用于存储器对象的标记描述符或用于系统存储器块的标记描述符,将在本地存储中的系统存储器块中、被发现可达的存储器对象标记为可达。为本地标记堆栈中的每个指针或地址继续这个处理。
在基于本地存储中的相应系统存储器块、执行了对用于填充本地标记堆栈的部分全局标记队列中的引用的标记之后,引用或指针要么在标记描述符中标记为可达或不可达,要么如果引用是对不在系统存储器块内的存储器对象的引用,则其被置于第二标记堆栈中。
例如,通过使用显式堆栈存储已知为可达但还未检查其内容的对象(即,“灰色”对象),可以执行将指向存储器对象的指针放置到本地或非本地标记堆栈中的操作。堆栈中的每项都可以包含基地址和偏移地址,其中该偏移地址指示可能的指针相对于开始地址的位置。
有关已经在标记和扫描操作期间达到的存储器对象的信息优选为存储在标记描述符中以指示存储器对象的可达性,其中该标记描述符使用与存储器对象、系统存储器,或更特别地与系统存储器的每个页面相关联的位图或其它恰当的描述符表格。在一些实施例中,例如,在用于存储器对象驻留其中的存储器页的页描述符中,可以使用与存储器对象相关联的恰当位。
在操作期间,在用于处理器的部分全局标记队列中引用的存储器对象最初置于本地标记堆栈中。然后使用标记和扫描操作来检查本地标记堆栈中的项目,以确定加载到这个处理器的本地存储中的系统存储器块内的这些存储器对象的可达性。同样地,利用已知的标记和扫描操作检查与这些存储器对象相关联的引用,以确定与可达的最初存储器对象相关联的其它存储器对象。利用该说明性实施例,重复这个处理,直到遇到没有其它相关联的存储器对象的存储器对象为止,或者直到遇到对不在加载到本地存储中的系统存储器块中存在的存储器对象(在下文中称为“非本地”存储器对象)的引用为止。在后者的情况下,将到“非本地”存储器对象的引用添加到非本地标记堆栈中,并且不在对应的标记描述符中标记为可达。
当已经由处理器检查了用于填充本地标记堆栈的部分全局标记队列中的所有系统存储器对象、并且因此以上述的方式检查了它们相关联的存储器对象时,这部分全局标记队列中未标记为可达的系统存储器对象,如果有的话,则是作为回收它们的存储器部分的候选者的系统存储器对象。但是,此时不能回收这个系统存储器,这是因为可能存在从全局标记队列的其它部分中的系统存储器对象对这些对象的引用,其中取决于特定的实施例,这些部分可以由或可以不由异构多处理器系统中的其它处理器所处理。指示为可达的存储器对象是它的系统存储器不能被回收的对象。将关于这些存储器对象的信息合并回到全局标记描述符数据结构中,其中该全局标记描述符数据结构概括了系统存储器中存储的所有存储器对象的可达性。
其引用是本地标记堆栈或非本地标记堆栈的一部分的对象是“灰色”存储器对象,即可达、但是还未分析关于它们可以达到什么对象的对象。为了完成垃圾收集,对象的“灰色”集合必须是空的,即没有地址可以保留在任何处理单元中的任何本地或非本地标记堆栈上,或者全局标记队列中。为实现这个,理想上,分析所有本地标记堆栈中的引用,直到本地标记堆栈为空为止,并且将非本地标记堆栈合并回到全局标记堆栈中。
对非本地标记堆栈中的存储器对象的引用与仍然需要跟踪的部分全局标记队列以及其它处理器的其它非本地标记堆栈合并,由此产生更新的全局标记队列的“要跟踪”部分。作为结果,可以由相同或不同的处理器用其它系统存储器块重新检查对不在系统存储器块的本地存储拷贝中的存储器对象的引用。可以重复这个过程,直到更新的全局标记队列的“要跟踪”部分不包含对系统存储器对象的引用为止。
当在全局标记队列已更新的“要跟踪”部分中不再存在对系统存储器对象的引用时,每个对系统存储器对象的引用将已经被标记为可达或不可达。那些对全局标记队列的“不可达”部分中的系统存储器对象的引用与其系统存储器可被回收的系统存储器对象相关联。与所有其它系统存储器对象相关联的系统存储器可通过软件程序达到,因此不被回收。然后,可以执行回收处理以回收与全局标记队列的“已跟踪”部分中的系统存储器对象相关联的系统存储器。这样的回收处理在技术上通常是已知的。
在一个说明性实施例中,提供了一种在多处理器数据处理系统中、用于在共享存储器上执行垃圾收集操作的方法。该方法包含在多处理器数据处理系统的处理器中加载与共享存储器的一部分相对应的全局标记队列的一部分。基于对分配给该处理器的部分全局标记队列中的存储器对象的引用,可以在该部分共享存储器上执行标记操作,以由此识别其相关联存储器不能作为垃圾收集操作的一部分被回收的可达存储器对象。该方法还包含在标记操作期间,识别对不在分配给该处理器的该部分共享存储器中的存储器对象的引用,用于作为垃圾收集操作一部分的进一步处理。该部分全局标记队列可以小于全局标记队列的整个部分。与该部分全局标记队列的相对应的部分共享存储器可以小于共享存储器的整个部分。
加载与部分共享存储器相对应的部分全局标记队列可以包含最初,基于对部分全局标记队列中的存储器对象的引用而填充本地标记堆栈。与该部分全局标记队列相对应的部分共享存储器可以加载到处理器的本地存储中。多处理器数据处理系统的多个处理器中的每个处理器可以加载全局标记队列的不同部分和共享存储器相应的不同部分,并且基于全局标记队列不同部分中的存储器对象引用,在共享存储器的不同部分上执行标记操作。
基于对存储器对象的引用、在该部分共享存储器上执行标记操作可以包含跟踪在该部分全局标记队列中的存储器对象引用以及对从属存储器对象的引用,直到标识出对不在该部分共享存储器内的存储器对象的引用为止。对在该部分共享存储器内的存储器对象的引用可以存储在本地标记堆栈中。对不在该部分共享存储器内的存储器对象的引用可以存储在非本地标记堆栈中。
该方法还可以包含合并与本地标记堆栈相关联的本地标记描述符数据结构和全局标记描述符数据结构。该方法也可以包含合并非本地标记堆栈与全局标记队列的“要跟踪”部分。全局标记队列的“要跟踪”部分可以包含要通过执行标记操作来处理的存储器对象引用。本地标记描述符数据结构可以包含对象的引用处于本地标记堆栈中的存储器对象的可达性信息。全局标记描述符数据结构可以包含在多处理器数据处理系统的处理器的本地标记堆栈中、所有对被标识为在部分共享存储器内的存储器对象的引用。
多处理器数据处理系统可以是异构多处理器数据处理系统,其包含控制处理器和至少一个协处理器。控制处理器和至少一个协处理器可以使用不同的指令集操作。全局标记队列的一部分的加载、标记操作的执行、以及对不在该部分共享存储器内的存储器对象的引用的标识可以由所述至少一个协处理器中的一个或多个执行。加载、执行和标识操作可以由所述至少一个协处理器中的一个或多个中的存储器流控制器执行。
在其它说明性实施例中,提供了包含具有计算机可读程序的计算机可用介质的计算机程序产品。当计算机可读程序在计算设备上执行时,使计算设备执行上面关于方法说明性实施例给出的各种操作及其组合。
在还有另一个说明性实施例中,提供了用于执行垃圾收集的系统。该系统可以包含多个处理器,每个处理器具有相关联的本地存储;以及耦合到所述多个处理器的共享存储器。所述多个处理器中的一个或多个处理器可以执行上面关于方法说明性实施例给出的各种操作及其组合。
这些和其它特征和优点将在下面的说明性实施例的详细描述中说明,或者考虑到下面的说明性实施例的详细描述,而对那些本领域的一般技术人员变得显然。


附加的权利要求中阐述了被认为是本发明特有的新颖特征。然而,通过参考下面结合附图阅读的说明性实施例的详细说明,将最好地理解本发明本身及其使用的优选模式、以及进一步的目的和优点,其中图1是其中可以实现该说明性实施例的示范性方面的异构多处理器系统的示范性框图;图2是说明其中可以实现该说明性实施例的示范性方面的存储器流控制器的示范性图示;
图3是根据一个说明性实施例、可以用于执行垃圾收集的垃圾收集机制的示范性图示;图4是说明根据一个说明性实施例的分布式垃圾收集操作的示范性图示;图5是说明根据另一个说明性实施例的、其中利用了预排序的增强标记和扫描操作的分布式垃圾收集操作的示范性图示;以及图6是概括根据一个说明性实施例、用于执行垃圾收集的示范性操作的流程图。
具体实施例方式
说明性实施例提供了用于在异构系统中执行垃圾收集的系统和方法。说明性实施例的机制可以在其中需要执行垃圾收集的任何异构多处理器系统中实现。这样的异构多处理器系统的例子包括NUMA系统、非SMP多处理器系统等。其中可以实现说明性实施例的示范性方面的一个这样的异构多处理器系统是可以从纽约Armonk的国际商业机器公司得到的单元宽带引擎(CBE,Cell Broadband Engine)。虽然将就正在CBE结构中实现的机制来说明说明性实施例,但是应该理解这只是示范性的,并且说明性实施例的机制也可以在其它异构多处理器系统中实现而不背离本发明的精神和范围。
图1是其中可以实现本发明的各方面的数据处理系统的示范性框图。图1中所示的示范性数据处理系统是单元宽带引擎(CBE)数据处理系统的示例。虽然将在本发明优选实施例的描述中使用CBE,但是本领域的技术人员通过阅读下面的描述显然可知本发明不限于此。
如图1中所示,CBE 100包括电源处理器元件(PPE)110,其包含处理器(PPU)116和它的L1和L2高速缓存112和114;以及多个协处理器元件(SPE),每个都具有它自己的协处理器单元(SPU)140-154、存储器流控制155-162、本地存储器或存储设备(LS)163-170,以及总线接口单元(BIU单元)180-194,其中该总线接口单元可以是,例如组合的直接存储器存取(DMA)、存储器管理单元(MMU)和总线接口单元。还提供了高带宽内部元件互联总线(EIB)196、总线接口控制器(BIC)197、和存储器接口控制器(MIC)198。
CBE 100可以是片上系统,以便可以在单个微处理器芯片上提供图1所述的每个元件。此外,CBE 100是异构处理环境,其中每个SPU可以从系统中每个其它SPU接收不同的指令。此外,用于SPU的指令集不同于用于PPU的指令集,例如PPU可以执行基于精简指令集计算机(RISC)的指令,而SPU执行SIMD矢量指令。
SPE互相耦接,并且经由EIB 196耦接到L2高速缓存114。另外,SPE经由EIB 196耦接到MIC 198和BIC 197。MIC 198提供到共享存储器199的通信接口。BIC 197提供在CBE 100和其它外部总线和设备之间的接口。
PPE 110是双线程的PPE 110。这个双线程的PPE 110与8个SPE的组合使得CBE 100能够处理10个同时线程以及超过128个未完成的存储器请求。PPE 110起其它8个SPE的控制器的作用,这8个SPE处理大部分计算工作负载。例如,PPE 110可以用于运行传统的操作系统,而SPE执行矢量化的浮点代码执行处理。
SPE包含协处理单元(SPU)140-154,存储器流控制单元155-162,本地存储器或存储设备163-170,以及接口单元180-194。在一个示范性实施例中,本地存储器或存储设备163-170包含256KB指令和数据存储器,该存储器对于PPE 110是可见的,并且可以由软件直接寻址。
PPE 110可以用小程序或线程加载SPE,将SPE链在一起以处理复杂操作中的每个步骤。例如,并入CBE 100的机顶盒可以加载用于读取DVD、视频和音频解码、以及显示的程序,而且数据将从一个SPE传递到另一个SPE,直到它最终在输出显示器上结束为止。在4GHz处,每个SPE给出理论上的32GFLOPS的性能,而且PPE 110具有类似的性能级别。
存储器流控制单元(MFC)155-162起SPU到系统其它部分以及其它元件的接口的作用。MFC 155-162提供了用于数据传输、保护、以及在主存储设备与本地存储163-170之间的同步的主要机制。逻辑上存在用于处理器中的每个SPU的MFC。一些实现可以在多个SPU之间共享单个MFC的资源。在这样的情况下,所有为MFC定义的工具和命令必须独立于用于每个SPU的软件而出现。共享MFC的效果受限于实现相关的工具和命令。
图2是根据本发明的示范性实施例的典型存储器流控制(MFC)单元200的示范性框图。在这个示范性实施例中,MFC 200具有2个到SPU的接口210和212、2个到总线接口单元(BIU)220的接口214和216、以及2个到可选的SL1高速缓存230的接口222和224。SPU接口210和212是SPU信道接口210和SPU本地存储接口212。SPU信道接口210允许SPU存取MFC工具并发出MFC命令。SPU本地存储接口212由MFC 200使用来存取SPU中的本地存储。一个到BIU 220的接口216允许存储器映射I/O(MMIO)对MFC工具的存取。这个接口216还允许其它处理器发出MFC命令。使用MMIO而发出的命令称为MFC代理命令。
到SL1高速缓存的接口222和224主要用于数据传输。一个接口222由MFC 200使用来存取主存储设备中的地址翻译表,以及另一个接口224用于在主存储设备和本地存储之间的数据传输。
如图2所示,典型MFC中的主要单元包括存储器映射输入/输出(MMIO)接口240、MFC寄存器250和DMA控制器260。MMIO接口230将SPU的MFC工具映射到系统的实际地址空间。这允许从系统中的任何处理器或任何设备访问MFC工具。另外,可以将MMIO接口240配置为将SPU的本地存储映射到实际地址空间中。这允许从系统中的任何处理器或任何设备直接访问本地存储,使能进行本地存储到本地存储传输以及I/O设备能够直接存取SPU的本地存储域。
MFC寄存器单元250包含大多数MFC工具。对本发明特别重要的是,MFC寄存器单元250包括SPU本地存储限制寄存器工具。使用这个工具,有特权的软件可以设置SPE的本地存储大小的限制,这将在以下更详细地说明。
数据同步和传输通常是MFC 200内的DMAC 260的职责。DMAC 260可以在SPU的本地存储和主存储区域之间移动数据。可选地,数据可以在SL1高速缓存中缓存。
SPE和PPE通过经由命令队列270和280之一排队到MFC的DMA命令请求,来指示MFC 200执行这些DMA操作。由SPE发出的命令排队到MFC SPU命令队列270中。由PPE发出的命令排队到MFC代理命令队列280中。MFC使用存储器映射单元(MMU)290来执行DMA传输所需要的所有MFC地址翻译和MFC存取保护检查。
MFC命令提供了使在SPU中执行的代码能够访问主存储设备并且保持与系统中的其它处理器和其它设备同步的主要方法。还提供了命令来管理可选的高速缓存。MFC命令可以由SPU上运行的代码,或者由在诸如PPE之类的另一个处理器或设备上运行的代码发出。在相关联的SPU上运行的代码执行一系列信道指令以发出MFC命令。在其它处理器或设备运行上的代码执行一系列存储器映射的I/O(MMIO)传输以发出MFC命令到SPE。将发出的命令排队到命令队列270和280之一中。
一般而言,可以使用MFC寄存器单元250中的MMIO寄存器,或者通过由相关联的SPU执行的信道指令来对命令排队。MMIO方法意图由PPE使用以代表SPE控制主存储设备和相关联的本地存储之间的数据传输。传输数据的MFC命令称为MFC DMA命令。MFC DMA命令的数据传输方向总是从SPE的角度来考虑。因此,将数据传输到SPE中(从主存储设备到本地存储)的命令被认为是获得命令,而将数据传输出SPE(从本地存储到主存储设备)的命令被认为是放出命令。
传输数据的命令称为MFC DMA命令。将这些命令转换为在本地存储域和主存储设备域之间的DMA传输。每个MFC通常能够同时支持多个DMA传输,并且能够保留和处理多个MFC命令。每个MFC DMA数据传输命令请求涉及本地存储地址(LSA)和有效地址(EA)。本地存储地址只能够直接寻址它相关联的SPU的本地存储区域。有效地址具有更广泛的应用,因为它能够引用主存储设备,而且如果SPU本地存储区域通过别名而进入实际地址空间,则还包括所有SPU本地存储区域。
说明性实施例提供了用于在诸如上述单元宽带引擎(CBE)之类的异构多处理器系统中执行垃圾收集操作的机制。使用CBE作为其中可以利用示范性实施例的机制的其它异构多处理器系统的范例,则可以在每个SPE中提供垃圾收集机制以执行如下所述的说明性实施例的垃圾收集操作。例如,垃圾收集机制可以包含与SPE的存储器流控制器(MFC)集成的硬件和/或软件元件。另外,可以向PPE 110提供类似机制来执行垃圾收集。
在一些说明性实施例中,垃圾收集操作分布在异构多处理器系统如CBE100中的多个处理器如SPE 120-134上。在其它说明性实施例中,垃圾收集操作可以由异构多处理器系统中的单个处理器如SPE 134执行。对这个单个垃圾收集处理器实施例,垃圾收集处理器如SPE 134,可以专用于仅仅执行垃圾收集,或者可以在除了其它服务任务之外,还执行垃圾收集。
应该注意到,在下面的说明性实施例的描述中,将引用可互换使用的“系统存储器”和“共享存储器”。这样的引用意图是引用用作正在讨论中的特定程序的堆的那部分系统存储器或共享存储器。因此,可能存在很多在异构多处理器系统内运行的不同程序,它们利用共享或系统存储器,并且它们每个都具有它们自己的堆用于存储器动态分配。因此,这里描述的垃圾收集相对于分配给感兴趣的特定程序的系统存储器或共享存储器来执行。采用其中垃圾收集分布在多个SPE 120-134上的说明性实施例,在一个说明性实施例中,PPE 110可以命令SPE执行垃圾收集,以便回收分配给不再由异构处理器系统中运行的程序引用的存储器对象(在下文中称为“系统存储器对象”)的部分共享存储器199。在作为替换的说明性实施例中,SPE120-134可以基于预定的准则、例如共享存储器199中的空闲空间数量低于阈值,来独立地确定需要垃圾收集,而且它们自己可以启动垃圾收集操作。在这样的作为替换的实施例中,检测需要进行垃圾收集的SPE 120-134可以将这个需要传递给其它SPE 120-134和PPE 110。
响应于来自PPE 110或者SPE 120-134的指令,SPE 120-134产生用于执行以下描述的垃圾收集操作的垃圾收集线程。SPE 120-134以及可能的PPE110,诸如在“世界停止”类型垃圾收集中那样,停止它们对线程的执行,并且执行所产生的收集线程,以便执行垃圾收集。
作为垃圾收集的一部分,PPE 110产生全局标记队列,该队列包含用于所运行的程序的、对共享存储器199中的存储器对象的引用。这样的全局标记队列的产生在本技术领域通常是已知的,并且不在这里提供细节。例如,生成全局标记队列并且与并行垃圾收集一起使用全局标记队列通常在Boehm所著、2000年惠普公司的惠普实验室技术报告2000-165的“FastMultiprocessor Memory Allocation and Garbage Collection”中进行了描述,该技术内容通过引用在此并入。
可以由例如存储器页来组织全局标记队列,以便对相同存储器页上存储的系统存储器对象的引用在全局标记队列中表示为相邻项目。以这种方式,部分全局标记队列可以容易地与部分共享存储器199相关联。
每个SPE 120-134的收集线程都获得一块共享存储器199以及全局标记队列中的相应部分,并且将它们存储在与SPE 120-134相关联的本地存储163-170中。因此,每个SPE 120-134将具有该SPE在其上进行操作的全局标记队列不同部分的拷贝以及共享存储器199中的相应不同块的拷贝。在这个描述的上下文中,存储器“块”是正在其上工作的存储器区域。在优选实施例中,这个区域是相邻和协调定位的,但是在其它实施例中,存储器“块”可以包含系统或共享存储器199中、多个逻辑或者另外有关的数据部分。
在每个SPE 120-134上运行的收集线程基于在全局标记队列相应部分中引用的系统存储器对象、对它们各自的共享存储器199中的块执行“标记和扫描”操作。由SPE 120-134检索的该部分全局标记队列包含从程序到要由“标记和扫描”操作检查的系统存储器对象的引用,即指针。这些引用和它们对从属存储器对象的引用要在“标记和扫描”操作期间跟踪,由此识别出哪些存储器对象可由所关注程序达到以及不可达到。
引用或指针利用共享存储器地址空间,并且因此需要被翻译为用于SPE120-134的本地存储地址空间,这是因为现在正被检查的共享存储器199中的块位于与SPE 120-134相关联的本地存储163-170内。这样的地址翻译可以涉及,例如,获取共享存储器199地址,减去被传输到本地存储的块的基地址,并且加上本地存储偏移。这个地址翻译给出了由该部分全局标记队列中的全局地址空间指针所引用的同一个系统存储器对象的本地存储空间地址。本领域的一般技术人员将认识到说明性实施例可以利用其它地址空间之间翻译方式,而没有背离本发明的精神和范围。
在由收集线程执行“标记和扫描”操作期间,由该部分全局标记队列引用的初始存储器对象将出现在加载到相应本地存储163-170中的该共享存储器199的块中。但是,该共享存储器199中的块可以包含其它未由该部分全局标记队列中的指针引用的存储器对象(并且因此,如果该存储器对象未由其指针在其它部分全局标记队列中的存储器对象引用,则可能是“不可达的”)或者未由其指针在全局标记队列其它部分中的其它存储器对象引用的存储器对象。
此外,在“标记和扫描”操作期间,可能遇到对其它不在加载到特定SPE的本地存储163-170中的共享存储器199的该块内的对象的引用。必须与对在加载到本地存储163-170中的共享存储器199的该块中的可达和不可达存储器对象的跟踪一起,跟踪对共享存储器199的其它块中的存储器对象的引用。
为了跟踪各种类型的存储器对象,由说明性实施例的收集线程执行的本地“标记和扫描”操作为每个SPE 120-134利用两个标记堆栈。第一标记堆栈,即本地标记堆栈,存储对可以由软件程序达到的、在加载到SPE 120-134的本地存储163-170中的共享存储器199的该块中的存储器对象的指针或引用。本地标记堆栈由与它在共享存储器199中的相应块一起加载到SPE中的部分全局标记队列所填充。这个本地标记堆栈在标记和扫描操作期间被遍历,以根据标记操作跟踪本地标记堆栈中引用的每个存储器对象,由此从本地标记堆栈中引用的存储器对象中标记所有可达的存储器对象。
第二标记堆栈,即非本地标记堆栈,存储指向由软件程序引用、但不在加载到本地存储163-170中的共享存储器199的当前块中的存储器对象的指针。在跟踪本地标记堆栈中引用的存储器对象期间,将指向存储器对象的指针或地址添加到非本地标记堆栈中。即,在跟踪由本地标记堆栈中的存储器对象可达的存储器对象期间,可能遭遇到指向不在本地存储中存储的共享存储器199的该块内的另一个存储器对象的引用或指针。响应于这样的事件,将指向这个“非本地”存储器对象的引用或指针添加到非本地标记堆栈中。
例如,可以通过使用显式堆栈来存储已知可达、但是其内容还未被检查的对象(即,“灰色”对象),来执行将执行存储器对象的指针放入各种堆栈中的操作。堆栈中的每个项目包含基地址和偏移,该偏移指示可能的指针相对于那个起始地址的相对位置。偏移通常采用简单的长度规定、位向量等的形式用于说明指针位置。
每个存储器对象可以具有相关联的标记描述符,该标记描述符将存储器对象标识为可达或不可达。用于每个存储器对象的标记描述符可以是用于共享存储器199中的块、共享存储器的页等的一般标记描述符的一部分。作为复制到SPE 120-134的本地存储163-170中的该部分全局标记队列的一部分、并且还未被跟踪的存储器对象可以最初将它们的标记描述符设置为例如“0”或“00”,以指示这些对象是不可达的。此后,在“标记和扫描”操作的标记阶段期间,当作出存储器对象可达的确定时,可以将这些标记描述符值设置为例如“1”或“01”。
因此,最初,在SPE 120-134上的垃圾收集操作初始化时,可以将用于讨论中程序的堆中的所有存储器对象设置为“不可达”状态。当由SPE检索全局标记队列的一部分并且将共享存储器199中它的相应块加载到本地存储中时,将用于该部分全局标记队列中的存储器对象的地址和偏移添加到本地标记堆栈中。另外,可以将用于该存储器对象的标记描述符添加到用于共享存储器199中的该块的一般标记描述符数据结构中。虽然为了清楚起见,标记描述符在附图中被示出并且在以下描述中被提及为和本地标记堆栈分离的数据结构,但是应该理解标记描述符可以与用于添加到本地标记堆栈的各种存储器对象引用的、本地标记堆栈中的项目相关联,并且甚至是它们的一部分。
在最初填充了本地标记堆栈之后,使用“标记和扫描”垃圾收集操作中的标记操作识别和跟踪本地标记堆栈中的下一个存储器对象。即,将本地标记堆栈中的下一个存储器对象标记为可达,并且变为“当前”存储器对象。从加载到本地存储中的共享存储器199块中识别由“当前”存储器对象引用的存储器对象。进行有关由“当前”存储器对象引用的存储器对象是否在本地存储中的共享存储器199块内的确定。如果确定是这样,则然后将用于这些存储器对象的标记描述符设置为“可达”状态。
如果在这个标记操作期间遇到这样的指向存储器对象的引用或指针,其中该引用或指针指向处于与加载到本地存储中的共享存储器块不同的共享存储器199块中的存储器对象,则将到这个存储器对象的引用添加到非本地标记堆栈中。因此,通过标记操作,将到本地标记堆栈中的存储器对象的引用在它们相关联的标记描述符中标记为在本地存储中的该共享存储器199块中可达。由本地标记堆栈中的存储器对象引用的其它存储器对象在当前处于本地存储中的共享存储器199块中可以是可达或不可达。因此,这些存储器对象可以更新它们的标记描述符以显示它们在共享存储器199块内是可达的,或者如果它们在本地存储中的共享存储器199块中实际上是不可达的,则可以将它们的引用添加到非本地标记堆栈中。
当该部分全局标记队列中的所有系统存储器对象都已经由SPE 120-134通过如上所述的“标记和扫描”操作检查了时,对该共享存储器199块,保持不可达的系统存储器对象,例如标记描述符是“0”或“00”的系统存储器对象,是让它们的存储器部分被回收的候选者。但是,此时不能回收这个系统存储器,这是因为可能存在来自全局标记队列的其它部分中的系统存储器对象对这些存储器对象的其它引用,其中取决于特定实施例,这些其它部分全局标记队列可以或可以未由CBE 100中的其它SPE 120-134处理。
在将系统存储器对象标记为在该共享存储器199块中可达(即,在本地标记堆栈的处理期间达到)、不在该共享存储器199块中(即,在非本地标记堆栈中),或者在该共享存储器199块中不可达(即,在该部分全局标记队列中保留有可能的引用,或者先前已经达到了)之后,收集线程执行合并操作,用于将非本地标记堆栈中的、对存储器对象的引用和仍然需要跟踪的部分全局标记队列合并,以由此产生全局标记队列中更新的“要跟踪”部分。作为结果,可以由相同或不同的SPE 120-134使用共享存储器199中的其它块重新检查对不在该共享存储器199块的本地存储拷贝中的存储器对象的引用。可以重复这个处理,直到全局标记队列中更新的“要跟踪”部分不包含对系统存储器对象的引用为止。
另外,收集线程将从处理本地标记堆栈获得的、有关存储器对象的可达性信息如标记描述符,与通过处理其它SPE 120-134的其它本地标记堆栈而获得的可达性信息相合并,以便生成全局标记描述符中获取的全局可达性信息。全局标记描述符表示那些可由软件程序达到并因此不能让它们的系统存储器被回收的系统存储器对象。未在全局标记描述符中出现其引用的系统存储器对象是用于存储器回收的候选者。
将指示可达存储器对象的本地标记描述符与全局描述符合并可以通过执行一组OR操作实现。但是,如Boehm op cit.所述的那样,必须保证原子性。合并操作因此合并用于存储器对象的标记描述符,以便对于每个合并的存储器对象存在单个项目来指示该存储器对象可由所考虑的软件程序达到。也就是说,合并操作消除了用于同一存储器对象的任何重复项目。因此,利用说明性实施例,不同于更新共同标记描述符的现有技术垃圾收集器,每个标记线程包含本地块特定的标记描述符,所述描述符合并到用于与正在考虑的程序相关联的堆的全局标记描述符中。
可以用自适应存储器流控制器(MFC)(该自适应存储器流控制器支持执行原子读-修改-写循环,以执行本地标记描述符到全局标记描述符的逻辑或操作)、已经被优化以包括特定描述符合并性能的MFC、或者通过在描述符图上使用软件锁来执行合并。理想为仅仅在合并处理的短时间段期间地获得这样的软件锁。为优化合并减少对合并锁的争夺,可以保持与标记描述符的区域相对应的多个合并锁。
在优化实施例中,可以通过复制全局标记描述符获得用于正被处理的存储器块的标记描述符。这个优化通过减小重复跟踪的数目而有利地减小了必须执行的跟踪步骤数目。在说明性实施例中,这个优化还可以用于防止活锁。
还是在另一个优化中,不用获得用于执行复制操作以获得本地描述符的初始化版本的锁。这个优化以丢失至少一部分可能同时发生的、对被跟踪和标记为可达位置的更新的代价,消除了锁同步开销。
可以执行类似的合并操作,用于将非本地标记堆栈与全局标记队列合并,以产生全局标记队列更新的“要跟踪”部分。将非本地堆栈合并到全局标记队列中的合并操作实质上产生了包含指向系统存储器对象的指针的数据结构,其中每个系统存储器对象在该数据结构中只有一个项目。也就是说,合并操作消除了重复项目,以便每个系统存储器对象在结果产生的数据结构中只出现一次。该结果是仍然需要由“标记和扫描”操作跟踪的系统存储器对象的列表。
每当每个SPE 120-134相对于复制到该SPE 120-134的本地存储中的该部分全局标记队列和系统存储器块完成其“标记和扫描”操作时,可以由该SPE 120-134重复上面的处理。应该理解因为一些对系统存储器对象的引用被合并回全局标记队列的“要跟踪”部分中,所以可以多次检查对系统存储器对象的相同引用。虽然这可能引入一些低效率,但是更有效的并行“标记和扫描”操作比冗余检查系统存储器对象所经历的稍微低效率提供相对更大的性能益处。
当全局标记队列的已更新“要跟踪”部分中没有更多的、对系统存储器对象的引用时,对在共享存储器199中出现的、在用于正在考虑的软件程序的堆中的存储器对象的每个引用,将要么在全局标记队列中标记为可达,要么对正在考虑的软件程序将是不可达的。那些对还未由标记处理到达的系统存储器对象的引用是其共享存储器199的相应部分可以被回收的对象。与全局标记堆栈中的所有其它系统存储器对象相关联的共享存储器199部分可由软件程序达到,并且因此不能被回收。
然后,可以执行回收处理,以回收与未在全局标记描述符中标记为可达的存储器对象相关联的系统存储器。这样的回收处理在技术上通常是已知的,因此这里不提供这样的回收处理的详细说明。
图3是根据一个说明性实施例、可以用于执行垃圾收集的垃圾收集机制的示范图。图3所示的垃圾收集机制可以集成到存储器流控制器(MFC),如例如图1的SPE 120-134中的如图2所示的MFC 200中。因此,图3中的垃圾收集机制可以利用MFC寄存器240、MIMO接口250、MFC命令队列280等执行说明性实施例中的垃圾收集操作。
在一个说明性实施例中,垃圾收集机制利用MFC命令得到部分全局标记队列和相应的共享存储器块,该部分全局标记队列存储在MFC寄存器240中,而该共享存储器块存储在与MFC相关联的本地存储中。此外,MFC命令可以用于利用例如由MFC寄存器240中的MFC维持的各种标记堆栈来执行“标记和扫描”操作以及合并操作,。
如图3所示,垃圾收集引擎300包括控制器310、全局标记队列接口模块320、共享存储器接口模块330、标记模块340、标记描述符存储设备345、全局标记队列部分存储设备350、本地存储接口360、本地标记堆栈存储设备370、非本地标记堆栈存储设备380以及合并模块390。元件310-390可以实现为硬件、软件或任何硬件和软件的组合。在说明性实施例中,元件310-340、360和390实现为由一个或更多处理元件执行的诸如MFC功能之类的软件功能,而元件345、350、370和380可以实现为诸如存储器、寄存器等之类的硬件元件。作为选择,所有图3中示出的元件可以实现为可以集成到MFC或SPE的其它部分中的硬件设备,或者实现为SPE中的专用单元。
控制器310控制垃圾收集引擎300的整体操作,并且编排其它元件320-390的操作。全局标记队列接口模块320负责提供这样的机制,即检索部分全局标记队列,以便由垃圾收集引擎300在根据说明性实施例执行垃圾收集操作中使用。经由全局标记队列接口模块320检索的该部分全局标记队列存储在全局标记队列部分存储器350中,用于在这部分全局标记队列中的引用上执行垃圾收集操作时使用。
共享存储器接口模块330负责提供检索一部分共享存储器、用于经由本地存储接口360存储在本地存储中的机制。所检索的这部分共享存储器对应于经由全局标记队列接口模块320检索的该部分全局标记队列。在控制器310根据被编程到控制器310中的垃圾收集方法的指挥下,全局标记队列接口模块320和共享存储器接口模块330与PPE进行通信,以便检索全局标记队列中的恰当部分以及共享存储器的相应部分。
标记模块340负责执行对在全局标记队列部分存储设备350中存储的部分全局标记队列中的引用的标记。作为标记操作的一部分,将对由控制器310经由全局标记队列接口模块320检索的该部分全局标记队列中的存储器对象的引用添加到本地标记堆栈存储设备370中。然后,由标记模块340使用“标记和扫描”垃圾收集操作中的标记操作检查这些引用,以因此识别本地存储中存储的共享存储器块中的可达存储器对象,和/或在经由共享存储器接口模块330和本地存储接口360检索并存储在本地存储中的共享存储器块内不可达的存储器对象。将在执行存储器对象的迭代跟踪时可能遇到的、作为对在共享存储器的其它块中的存储器对象的引用的存储器对象引用添加到非本地标记堆栈存储器380中。
这些在加载到本地存储中的共享存储器块内可达的存储器对象在与这些存储器对象相对应的标记描述符中被标记为可达。用于该共享存储器块的标记描述符可以存储在标记描述符存储设备345中。这些标记描述符构成随后合并到全局标记描述符中的本地标记描述符,其中该全局标记描述符用于与正为其执行的、所考虑中的软件程序相关联的整个堆。
在标记模块340根据上述方法执行本地可达存储器对象和非本地存储器对象的标记之后,合并模块390执行合并操作,以将标记描述符存储设备345中的本地标记描述符和其它SPE的堆栈中的其它本地标记描述符合并,以生成全局标记堆栈。合并模块390还将非本地标记堆栈380和全局标记队列中的“要跟踪”部分合并,以便这些引用可以用共享存储器的恰当块跟踪。
图4是说明根据一个说明性实施例的分布式垃圾收集操作的示范图。如图4所示,全局标记队列410具有“已清理”部分412和“要跟踪”部分414。“已清理”部分412是包含对已经由在一个或多个SPE 420-426上执行的“标记和扫描”垃圾收集操作处理的共享存储器对象的引用的一部分全局标记队列410。在将部分全局标记队列分配给SPE 420-426用于本地“标记和扫描”垃圾收集时,将全局标记队列中的这些部分添加到全局标记队列410的“已清理”部分412中。
全局标记队列410中的“要跟踪”部分414包含对还未由“标记和扫描”垃圾收集操作处理的共享存储器对象的那些引用、或者被确定为是对在共享存储器430的非本地部分中的共享存储器对象的引用。在将部分全局标记队列的“要跟踪”部分414中的部分分配给SPE 420-426用于垃圾收集时,将它们添加到全局标记队列410的“已清理”部分412。
如图4所示,每个SPE 420-426从全局标记队列41 0的“要跟踪”部分414获得全局标记队列410的一部分415-418,然后将该部分添加到全局标记队列410的“已清理”部分412中。虽然说明性实施例的操作不要求这个,但是这些部分415-418优选为全局标记队列410的顺序部分。
另外,每个SPE 420-426获得共享存储器430中的相应块432-438。由每个SPE 420-426获得的块432-438对应于由该SPE 420-426获得的全局标记队列410中的部分。
以SPE 420作为正在每个其它SPE 422-426中、使用它们自己的全局标记队列416-418的本地部分和共享存储器块434-438所执行的相同操作的示例,基于全局标记队列中的部分415和共享存储器中的相应块432、SPE 420在共享存储器的相应块432上执行标记操作。加载到SPE 420中的部分全局标记队列415用于用要使用标记操作检查的、指向存储器对象的引用或指针来填充本地标记堆栈(LMS)440。这个标记操作涉及取本地标记堆栈440中的下一个指针或引用,并且确定由该指针引用的系统存储器对象在存储在SPE本地存储中的共享存储器块432中是否是可达的。如先前所述,这可能要求指向系统存储器对象的指针从共享存储器地址空间翻译到本地存储地址空间。
如果系统存储器对象出现在共享存储器块432中,则将这个引用在相应的标记描述符460中标记为在本地存储中可达,然后以迭代方式跟踪这个存储器对象引用的任何对象,并且以类似的方式进行标记。继续这个迭代跟踪,直到遇到不引用任何其它存储器对象的存储器对象,或者遇到不在共享存储器块432中出现的存储器对象为止。任何对不在SPE 420本地存储中的共享存储器块432中的存储器对象的引用被标记为非本地存储器对象。
在使用本地标记堆栈440、以这种方式跟踪该部分全局标记队列415中的所有引用之后,本地标记堆栈440为空,并且存储器对象指针要么在本地标记描述符460中被标记,要么被添加到非本地标记堆栈450中。本地标记描述符460包含在共享存储器块432中可达的、所有在该部分全局标记队列415中的系统存储器对象引用。非本地标记堆栈440包含在跟踪该部分全局标记队列的41 5中的引用期间遇到的、引用不在本地存储处的共享存储器块432中的系统存储器对象的、对系统存储器对象的引用。
将SPE 420-426的本地标记描述符460-466合并到一起以形成全局标记描述符490。例如,这个合并可能涉及移除冗余项目,以便每个对系统存储器对象的引用在结果产生的全局标记描述符490中只有一个项目。在后续迭代中,本地标记描述符460-466、本地标记堆栈440-446和非本地标记堆栈450-456可以由后续标记操作重新初始化并重新填充。根据后续迭代产生的本地标记描述符460-466可以与现有的全局标记描述符490合并,以便继续更新全局标记描述符490。
SPE 420-426的非本地标记堆栈450-456与全局标记队列410的“要跟踪”部分414合并,以产生全局标记队列410的“合并”部分413。“合并”部分413可以与共享存储器430中的其它相应块一起由相同的或其它的SPE420-426的垃圾收集线程处理。再一次,这个合并可能涉及以这样的方式将该引用添加回全局标记队列410的“要跟踪”部分414,以使得每个引用在全局标记队列410中只有一个项目。
当跟踪部分全局标记队列415以及本地标记描述符460和非本地标记堆栈450的合并完成时,本地标记描述符460、本地标记堆栈440和非本地标记堆栈450可以被重新初始化,并且可以将全局标记队列410的新部分和相应的共享存储器430块检索到SPE 420中。然后可以在全局标记队列410的这个新部分和共享存储器430的相应块上执行垃圾收集。这个处理可以由每个SPE 420-426以迭代方式执行,直到全局标记队列410全部被跟踪了为止,因此全局标记队列410仅仅包含“已清理”部分412,而“要跟踪”部分414为空。
在整个全局标记队列410已经通过上述迭代和分布式垃圾收集操作跟踪了时,全局标记描述符490将包含对共享存储器430中、所有可以由与全局标记队列410相对应的程序达到的系统存储器对象的引用。因此,共享存储器430中未由全局标记描述符490引用的所有其它对象可以让它们的存储器空间被回收。可以初始化回收处理,以便本领域通常已知的方式执行这样的回收。
因此,说明性实施例提供了用于在异构多处理器系统中,以分布式方式在多个处理器上执行垃圾收集操作的机制。在这样的系统中,垃圾收集操作可以由诸如图1中的PPE 110之类的控制处理器编排,同时系统存储器各部分上的分布式垃圾收集可以由多个协处理器如图1中的SPE 120-134在控制处理器的指挥下执行。提供了地址翻译机制用于补偿控制和协处理器的不同存储器视角。
存在若干可以提供用于执行上述垃圾收集操作的优化。例如,在SPE中完成一部分全局标记队列的跟踪之后,SPE可以查看其它SPE的非本地标记堆栈,以确定是否存在对当前加载到SPE的本地存储处的系统存储器块中的存储器对象的引用。以这样的方式,可以将这样的、在其它SPE的非本地标记堆栈中的引用添加到当前SPE的本地堆栈中,而不必将该引用合并回全局标记队列中,并且然后将它复制回到另一个SPE。
此外,可以预排序全局标记队列,以便生成与分离的系统或者共享存储器区域相对应的分离的全局标记队列区域。当将非本地标记堆栈合并回全局标记队列的“要跟踪”部分中时,将非本地标记堆栈中对存储器对象的引用合并到全局标记队列的相应区域中。因此,如果第一非本地标记堆栈中的引用涉及处于共享存储器的第一区域中的存储器对象,则该项目将被合并到全局标记队列的第一区域的“要跟踪”部分中。类似地,如果第二非本地标记堆栈中的项目涉及处于共享存储器的第二区域中的存储器对象,则该项目将被合并到全局标记队列的第二区域的“要跟踪”部分中。这将加速垃圾收集操作,这是因为,在垃圾收集的后续迭代中较不可能将相同的引用确定为处于系统存储器的非本地部分中多次。
图5是说明根据另一个说明性实施例、其中利用了预排序的增强标记和扫描操作的分布式垃圾收集操作的示范图。图5类似于图4中所提供的说明,但有一些主要的例外。如图5所示,全局标记队列510诸如由图1的PPE 110预先排序,以便具有与共享存储器530中的区域532-536相对应的多个区域512-516。以与如上所述非常类似的方式执行由各个SPE 520-526检索全局标记队列510中的部分。但是,SPE 520-526的非本地标记堆栈550-556的合并被修改为考虑全局标记队列510的各个区域。
例如,当将SPE 520-526的非本地标记堆栈550-556与全局标记队列的“要跟踪”部分合并时,合并过程确定非本地标记堆栈550-556中的引用应该放在全局标记队列的哪个区域512-516中。这个例如可以通过使用所引用的共享存储器地址来确定该引用对应于共享存储器530中的哪个区域532-536,然后识别全局标记队列510的相应区域512-516来完成。然后,将这些引用与它们相应的全局标记队列的那个区域的“要跟踪”部分合并。
因为该引用被合并到与对应于该引用的系统存储器对象出现在其中的、共享存储器530中的这些区域相对应的全局标记队列510的这些区域中,所以这样的预排序和局部性增强的垃圾收集减少了相同引用必须重复地与全局标记队列合并的实例数量。作为结果,这降低了对相同引用的冗余检查的数目,由此减少了执行垃圾收集操作的时间。
作为进一步的优化,可以基于堆的当前状态调整每个SPE中使用的系统和共享存储器块的大小。如果堆相对较空,即具有很少的存储器分配,则可以选择相对大的块大小,这是因为要在其上执行垃圾收集的全局标记队列中将存在相对少的指针和引用。以这种方式,可以用较大的块大小快速扫描大块系统或共享存储器。
类似地,如果堆是满的,则全局标记队列中将存在相对大数目的指针,因此可以将块大小选择为相对小。虽然较小的块大小将使垃圾收集操作花费更长的时间量来完成,但是较小的块大小将有助于确保对于本地和非本地标记堆栈没有堆栈溢出例外。
在又一个进一步的优化中,每个SPE的本地存储可以分叉,以便本地存储的第一部分用于存储共享存储器的第一块,而本地存储的另一部分用于存储共享存储器的下一块的一部分。可以上面通常描述的方式在共享存储器的第一块上执行标记操作。当正在标记该共享存储器块时,例如可以使用DMA操作,可以将共享存储器的下一块带入本地存储中。以这种方式,因为执行了有些并行的加载操作,所以可以使共享存储器块和它们的全局标记队列中的相应部分的加载更加有效。
在该说明性实施例的还有另一个优化中,可以为被设计用于存储本地标记队列和非本地标记队列的存储器区域的溢出提供特殊处理。在第一个优化中,可以将非本地标记堆栈合并到保持在系统存储器中的全局标记队列中并删除该非本地标记堆栈。在第二个优化中,可以将一部分本地标记队列传输到保持在系统存储器中的全局标记队列中并删除该部分本地标记队列。在第三个优化中,可以减小并延迟(defer)块大小以便将来处理,同时确保对应于延迟的块部分的标记描述符保留在本地存储或全局系统存储器之一中。
图6是概述根据一个说明性实施例、用于执行垃圾收集的示范性操作的流程图。将理解的是流程图说明的每块以及流程图说明中块的组合可以由计算机程序指令实现。可以提供这些计算机程序指令给处理器或其它可编程数据处理设备以产生机器,以便在处理器或其它可编程数据处理设备上执行的指令创建了用于实现流程图块或者多个块中指定的功能的装置。这些计算机程序指令也可以存储在计算机可读存储器或存储器介质中,这些存储器或者介质可以引导处理器或其它可编程数据处理设备以特定的方式起作用,以便存储在计算机可读存储器或存储器介质中的指令产生包括实现了流程图块或者多个块中指定的特定功能的指令装置的制品。
因此,流程图说明的块支持用于执行所指定功能的装置组合、用于执行指定功能的步骤组合以及用于执行指定功能的程序指令装置。也将理解的是流程图说明中的每个块以及流程图说明中的块组合,可以由执行所指定的功能或步骤的、基于专用硬件的计算机系统实现,或者由特专用硬件和计算机指令的组合实现。
如图6所示,操作以SPE接收诸如来自另一个SPE或PPE的指令从而开始垃圾收集操作开始(步骤610)。SPE或者可选的PPE启动收集线程,该收集线程利用垃圾收集引擎来在分配给所接收的垃圾收集指令中识别的程序的一部分系统或共享存储器执行垃圾收集(步骤620)。由PPE为分配给该程序的该系统或共享存储器部分生成全局标记队列,即堆,并且初始化该全局标记队列(步骤630)。所产生的收集线程获得一部分全局标记队列以及系统或共享存储器的相应块(步骤640),以分别复制到本地标记堆栈和本地存储中。
收集线程对本地标记堆栈中的引用或指针启动标记和跟踪操作,其中所述LMS已经用一部分全局标记队列初始化了。收集线程从本地标记堆栈选择下一个项目,并且启动所有包含在相应的存储器块中的引用的标记和跟踪处理(步骤650)。作为标记和跟踪操作的一部分,收集线程识别该存储器块中的下一个引用或指针(步骤660),并且确定该引用是否指向该系统/共享存储器块中的存储器对象(步骤670)。如果引用指向该系统/共享存储器块中的存储器对象,则如果该引用对应于先前不可达的引用(即,标记描述符被设置为不可达),收集线程将该引用添加到本地标记堆栈中,并且例如通过将存储器对象的引用添加到本地标记描述符数据结构中并且相应地设置它的标记描述符位、在本地标记描述符数据结构中将存储器对象标记为可达(步骤680)。如果引用指向不在该系统/共享存储器块中的存储器对象,则收集线程将该引用标记为非本地标记的引用,并且将该引用添加到非本地标记堆栈中(步骤690)。
然后,收集线程确定是否存在来自当前存储器对象引用或在该部分全局标记队列中的、另外的到存储器对象的引用或指针(步骤700)。如果存在,则收集线程返回到步骤660。如果不存在,则收集线程确定本地标记堆栈是否为空,即是否所有项目都已经由标记和跟踪操作处理了(步骤705)。如果不是,则操作返回到步骤650,并且选择下一个要在其上执行标记和跟踪操作的本地标记堆栈项目。如果本地标记堆栈为空,则收集线程可选地轮询异构多处理器系统的其它处理器以获得引用当前处理器中的系统或共享存储器的当前块的、在非本地工作堆栈中的引用或指针(步骤710)。然后,以类似于步骤650-690的方式跟踪和标记任何这样的引用或指针(步骤720)。
然后,收集线程将结果产生的本地标记描述符和全局标记描述符合并(步骤730)。收集线程也可以将结果产生的非本地标记堆栈与全局标记队列的“要跟踪”部分合并(步骤740)。这可能涉及例如,确定非本地标记堆栈中的引用对应于全局标记队列的“要跟踪”部分的哪些区域;以及将这些引用与它们各自的全局标记队列的区域合并。
然后,收集线程重新初始化本地标记描述符、本地标记堆栈和非本地标记堆栈(步骤750)。然后,收集线程确定是否存在另外要处理的全局标记队列的部分(步骤760)。如果存在,则操作返回到步骤640,其中获得全局标记队列的下一个部分以及相应的存储器块,并且重复该处理。如果不存在要处理的全局标记队列的进一步部分,则操作终止。应该注意到在上述分布式“标记和扫描”操作结束之后,可以执行存储器回收以回收分配给未由全局标记堆栈引用的存储器对象的部分系统或共享存储器。
因此,说明性实施例提供了用于在异构多处理器系统中执行垃圾收集的机制。垃圾收集可以在异构多处理器系统中的多个处理器上并行地执行,并且适当地合并结果以识别那些可达的系统存储器对象和那些不可达的系统存储器对象。以这种方式,提供了利用异构多处理器系统中每个处理器的能力的有效的垃圾收集方法。
应该注意虽然上面的实施例按照分布式垃圾收集操作进行了说明,但是本发明不限于此。相反,可以分配异构多处理器系统中的单个处理器来执行垃圾收集操作,而不背离本发明的精神和范围。因为这样的处理器的本地存储具有有限的大小,所以仍然需要执行考入要在其上执行的、部分全局标记队列以及共享或系统存储器中的相对应部分。因此,可以使用单处理器而不是多处理器执行与上面描述的相同的操作,而不背离本发明的精神和范围。
说明性实施例可以采取完全硬件实施例、完全软件实施例或包含硬件和软件元件的实施例的形式。在优选实施例中,本发明以软件实现,该软件包括但不限于固件、驻留软件、微码等。
此外,说明性实施例可以采取计算机程序产品的形式,该计算机程序产品可以从提供用于由计算机或任何指令执行系统使用或者结合它们一起使用的程序代码的计算机可用或计算机可读介质访问。为了这个描述起见,计算机可用或计算机可读介质可以是任何这样的装置,该装置可以包含、存储、传达、传播或传输用于由指令执行系统、装置或设备使用或者结合它们一起使用的程序。
介质可以是电、磁、光、电磁、红外或半导体系统(或装置或设备)或传播介质。计算机可读介质的示例包括半导体或固态存储器、磁带、可移动计算机盘、随机存取存储器(RAM)、只读存储器(ROM)、刚性磁盘和光盘。当前光盘的示例包括紧致盘-只读存储器(CD-ROM)、可读性紧致盘(CD-R/W)和DVD。
如上所述,适于存储和/或执行程序代码的数据处理系统将包括至少一个通过系统总线直接或间接耦接到存储器元件的处理器。存储器元件可以包括程序代码实际执行期间使用的本地存储、大规模存储设备和高速缓存,其中该高速缓存提供了至少一些程序代码的暂时存储,以便减小执行期间必须从大规模存储器检索代码的次数。
输入/输出或I/O设备(包括但不限于键盘、显示器、指向设备等)可以直接或通过介于其间的I/O控制器耦接到该系统。网络适配器也可以耦接到该系统,以使数据处理系统变得能够通过介于其间的私有或公共网络耦接到其它数据处理系统或远程打印机或存储设备。调制解调器、电缆调制解调器和以太网卡只是一些当前可用的网络适配器类型。
重要的是要注意到虽然已经在完整功能的数据处理系统的环境中描述了本发明,但是本领域的技术人员将认识到本发明中的处理能够以指令的计算机可读介质的形式以及各种形式分布,以及本发明可以同样应用而不考虑实际用于执行分布的信号承载介质的特定类型。计算机可读介质的示例包括诸如软盘、硬盘驱动器、RAM、CD-ROM、DVD-ROM之类的可记录类型介质,以及诸如数字和模拟通信链路、使用例如射频和光波传输之类的传输形式的有线或无线通信链路之类的传输类型介质。计算机可读介质可以采用编码格式,其可被解码用于在特定数据处理系统中的实际使用。
已经为了说明和描述的目的提供了对本发明的描述,其意图不在于以所公开的形式详尽或限制本发明。很多修改和变化对本领域技术人员来说将是显而易见的。选择和描述实施例以便最好地阐述本发明的原理、实际应用,并且使本领域的其他技术人员理解本发明用于适于所考虑的特定用途而具有各种修改的各种实施例。
权利要求
1.一种用于在多处理器数据处理系统对共享存储器执行垃圾收集操作的方法,包含在多处理器数据处理系统的处理器中加载与部分共享存储器相对应的部分全局标记队列;基于对分配给所述处理器的所述部分全局标记队列中的存储器对象的引用、在所述部分共享存储器上执行标记操作,由此识别出可达的存储器对象,其中所述可达存储器对象的相关联存储器不能作为所述垃圾收集操作的一部分被回收;以及在标记操作期间识别对不在分配给所述处理器的所述部分共享存储器中的存储器对象的引用,以用于作为所述垃圾收集操作的一部分的进一步处理。
2.根据权利要求1所述的方法,其中所述部分全局标记队列小于全局标记队列的整个部分,以及其中与所述部分全局标记队列相对应的所述部分共享存储器小于共享存储器的整个部分。
3.根据权利要求1所述的方法,其中加载与部分共享存储器相对应的部分全局标记队列包含最初基于对所述部分全局标记队列中的存储器对象的引用,填充本地标记堆栈;以及在处理器的本地存储中加载与所述部分全局标记队列相对应的部分共享存储器,其中所述多处理器数据处理系统的多个处理器中的每个处理器都加载所述全局标记队列的不同部分以及相对应的共享存储器的不同部分,并且基于在所述全局标记队列的不同部分中的存储器对象引用,在所述共享存储器的不同部分上执行标记操作。
4.根据权利要求3所述的方法,其中基于对存储器对象的引用、在所述部分共享存储器上执行标记操作包含跟踪在所述部分全局标记队列中的存储器对象引用、以及对从属存储器对象的引用,直到识别出对不在所述部分共享存储器内的存储器对象的引用为止;将对在所述部分共享存储器内的存储器对象的引用存储在本地标记堆栈中;以及将对不在所述部分共享存储器内的存储器对象的引用存储在非本地标记堆栈中。
5.根据权利要求1所述的方法,还包含将与所述本地标记堆栈相关联的本地标记描述符数据结构与全局标记描述符数据结构合并;以及将所述非本地标记堆栈和所述全局标记队列的“要跟踪”部分合并,其中所述全局标记队列的“要跟踪”部分包含要通过执行标记操作来处理的存储器对象引用,以及其中所述本地标记描述符数据结构包含其引用处于所述本地标记堆栈中的存储器对象的可达性信息。
6.根据权利要求5所述的方法,其中所述全局标记描述符数据结构包含在所述多处理器数据处理系统的处理器的本地标记堆栈中的、所有对被识别为在部分共享存储器内的存储器对象的引用。
7.根据权利要求1所述的方法,其中所述多处理器数据处理系统是异构多处理器数据处理系统,其包含控制处理器和至少一个协处理器,以及其中所述控制处理器和至少一个协处理器使用不同的指令集操作。
8.根据权利要求7所述的方法,其中部分全局标记队列的加载、执行标记操作、和识别对不在所述部分共享存储器内的存储器对象的引用,由所述至少一个协处理器中的一个或多个执行。
9.根据权利要求8所述的方法,其中所述加载、执行和识别操作由所述至少一个协处理器的一个或多个中的存储器流控制器执行。
10.一种用于执行垃圾收集的系统,包含多个处理器,每个处理器具有相关联的本地存储;以及耦接到所述多个处理器的共享存储器,其中所述多个处理器的一个或多个处理器在处理器中加载与部分共享存储器相对应的部分全局标记队列,基于对分配给所述处理器的部分全局标记队列中的存储器对象的引用,在所述部分共享存储器上执行标记操作,由此识别可达的存储器对象,其中所述可达存储器对象的相关联存储器不能作为垃圾收集操作的一部分被回收,以及在标记操作期间识别对不在分配给所述处理器的所述部分共享存储器中的存储器对象的引用,用于作为垃圾收集操作的一部分的进一步处理。
11.根据权利要求10所述的系统,其中该一个或多个处理器还将与本地标记堆栈相关联的本地标记描述符数据结构与全局标记描述符数据结构合并;以及将非本地标记堆栈和全局标记队列的“要跟踪”部分合并,其中所述全局标记队列的“要跟踪”部分包含要通过执行标记操作来处理的存储器对象引用,以及其中本地标记描述符数据结构包含其引用在本地标记堆栈中的存储器对象的可达性信息。
12.根据权利要求10所述的系统,其中所述部分全局标记队列小于全局标记队列的整个部分,以及其中与所述部分全局标记队列相对应的所述部分共享存储器小于共享存储器的整个部分。
13.根据权利要求10所述的系统,其中所述一个或多个处理器通过下列处理加载与部分共享存储器相对应的部分全局标记队列最初基于对所述部分全局标记队列中的存储器对象的引用来填充本地标记堆栈;以及在处理器的本地存储中加载与所述部分全局标记队列相对应的部分共享存储器,其中多处理器数据处理系统的多个处理器中的每个处理器都加载全局标记队列的不同部分以及共享存储器中相应的不同部分,并且基于在全局标记队列不同部分中的存储器对象引用、在所述共享存储器的不同部分上执行标记操作。
14.根据权利要求13所述的系统,其中所述一个或多个处理器通过下列处理在基于对存储器对象的引用在部分共享存储器上执行标记操作跟踪在所述部分全局标记队列的存储器对象引用、以及对从属存储器对象的引用,直到识别出对不在所述部分共享存储器内的存储器对象的引用为止;将对在所述部分共享存储器内的存储器对象的引用存储在本地标记堆栈中;以及将对不在所述部分共享存储器内的存储器对象的引用存储在非本地标记堆栈中。
15.根据权利要求11所述的系统,其中所述全局标记描述符数据结构包含多处理器数据处理系统的处理器的本地标记堆栈中、所有对被识别为在部分共享存储器内的存储器对象的引用。
16.根据权利要求10所述的系统,其中所述系统是异构多处理器数据处理系统,其包含控制处理器和至少一个协处理器,以及其中所述控制处理器和至少一个协处理器使用不同的指令集操作。
17.根据权利要求16所述的系统,其中部分全局标记队列的加载、执行标记操作和识别对不在所述部分共享存储器内的存储器对象的引用由所述至少一个协处理器中的一个或者多个执行。
18.根据权利要求17所述的系统,其中所述加载、执行和识别操作由所述至少一个协处理器中的一个或多个的存储器流控制器执行。
全文摘要
提供一种用于异构多处理器系统中垃圾收集的系统和方法。在一些说明性实施例中,垃圾收集操作分布在异构多处理器系统中的多个处理器上。将部分全局标记队列与相应的共享存储器块一起分配给异构多处理器系统的处理器。该处理器在它们所分配的部分全局标记队列和相应的共享存储器块上执行垃圾收集操作,将存储器对象引用标记为可达或将存储器对象引用添加到非本地标记堆栈中。将所标记的存储器对象与全局标记堆栈合并,并且将非本地标记堆栈中的存储器对象引用与全局标记队列的“要跟踪”部分合并,以便使用垃圾收集操作进行重新检查。
文档编号G06F12/02GK101075209SQ200710100919
公开日2007年11月21日 申请日期2007年4月28日 优先权日2006年4月28日
发明者迈克尔·K·格施文德, 凯瑟琳·M·奥布赖恩, 约翰·K·奥布赖恩 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1