硬件辅助垃圾收集

时间:2009-02-12 16:50:16

标签: functional-programming garbage-collection hardware

我正在考虑函数式语言可以更直接地绑定到他们的硬件,并且想知道垃圾收集的任何硬件实现。

这会显着加快速度,因为硬件本身会隐式处理所有集合,而不是某些环境的运行时。

这是LISP机器做的吗?有没有进一步研究这个想法?这个域名是否具体?

思考?异议?讨论

11 个答案:

答案 0 :(得分:14)

由于Generational Collection,我不得不说跟踪和复制不是 GC的巨大瓶颈。

有什么用呢,硬件辅助的READ障碍在进行堆栈扫描和标记堆时不需要“停止世界”暂停。

Azul Systems已经这样做了:http://www.azulsystems.com/products/compute_appliance.htm 他们在JavaOne上介绍了他们的硬件修改如何允许完全无间断的GC。

另一项改进是硬件辅助写入障碍,用于跟踪记忆集。

分代GC,对于G1或Garbage来说更是如此,首先,通过扫描分区来减少它们必须扫描的堆的数量,并为跨分区指针保留一个记住的列表。

问题在于这意味着任何时候mutator('真实程序'的花哨字)设置指针它也必须在适当的重新设置的集合中放入一个条目。所以即使你不是GCing,你也有(小)开销。如果可以减少这种情况,则可以减少GCing所需的暂停时间和整体程序性能。

答案 1 :(得分:5)

答案 2 :(得分:4)

一个明显的解决方案是使内存指针大于可用内存,例如,32位机器上的34位指针。或者当你只有16MB的RAM(2 ^ 24)时,使用32位机器的最高8位。苏黎世联邦理工学院的Oberon machines使用这样的方案取得了很大成功,直到RAM变得太便宜。那是在1994年左右,所以这个想法很老了。

这为您提供了几个可以存储对象状态的位(例如“这是一个新对象”和“我只是触摸了这个对象”)。在进行GC时,更喜欢“这是新的”对象并避免“刚触及”。

这可能实际上看到了复兴,因为没有人拥有2 ^ 64字节的RAM(= 2 ^ 67位;宇宙中有大约10 ^ 80~2 ^ 240个原子,所以可能无法拥有很多RAM 永远)。这意味着您可以在今天的机器中使用几个位如果 VM可以告诉操作系统如何映射内存。

答案 3 :(得分:4)

an article on lambda the ultimate描述了如何让GC感知虚拟内存管理器拥有真正高效的GC,而VM映射主要由硬件完成。你在这里:)

答案 4 :(得分:4)

你是一名研究生,听起来像是一个研究基金的好主题。 看看FPGA设计和计算机架构,http://www.opencores.org/

可以使用大量免费的处理器设计

垃圾收集可以作为后台任务实现,它已经用于并行操作。

皮特

答案 5 :(得分:2)

我很确定应该存在一些原型。但是开发和生产硬件特定功能非常昂贵。在硬件级别实施MMU或TLB花了很长时间,这很容易实现。

GC太大,无法有效实施到硬件级别。

答案 6 :(得分:2)

较旧的sparc系统有标记内存(33位),可用于标记地址。 今天不适合?

这来自他们的LISP遗产IIRC。

我的一个朋友建造了一个世代GC,通过从基元窃取一点来标记。它运作得更好。

所以,是的,它可以完成,但是nodody不再标记事物了。

runT1mes关于硬件辅助代际GC的评论值得一读。

给定一个足够大的门阵列(顶点-III弹簧),可以使用支持GC活动的增强型MMU。

答案 7 :(得分:1)

这里需要的最相关的数据可能是,目前花在垃圾收集上的时间(CPU时间的百分比)是多少?这可能不是问题。

如果我们确实这样做了,我们必须考虑到硬件是在“我们背后”的内存中愚弄。我想这将是“另一个线索”,用现代的说法。如果正在检查某些内存可能不可用(也许可以用双端口内存解决),当然如果HWGC要移动东西,那么它将不得不锁定其他进程,因此它不会干扰它们。并以适合所使用的架构和语言的方式进行。所以,是的,具体领域。

看看刚刚出现的内容...... in another post ...查看java的GC日志。

答案 8 :(得分:1)

我收集的最大问题是CPU寄存器和堆栈。在GC期间你需要做的事情之一是遍历系统中的所有指针,这意味着知道这些指针是什么。如果其中一个指针当前在CPU寄存器中,那么您也必须遍历它。同样,如果你有一个指针在堆栈上。因此,每个堆栈帧都必须有某种映射,说明什么是指针,什么不是,在进行任何GC遍历之前,必须将任何指针输入内存。

你也遇到了闭包和延续的问题,因为突然你的堆栈停止成为一个简单的LIFO结构。

显而易见的方法是永远不要在CPU堆栈或寄存器中保存指针。相反,您将每个堆栈帧作为指向其前任的对象。但这会导致性能下降。

答案 9 :(得分:1)

麻省理工学院80年代的几位杰出人士创造了SCHEME-79芯片,它直接解释了方言的方言,是用LISP DSL设计的,内置了hardware-gc。

Scheme-79 die

答案 10 :(得分:0)

为什么会“加快速度”?硬件到底应该做什么? 它仍然必须遍历对象之间的所有引用,这意味着它必须在主内存中运行大量数据,这是它花费时间的主要原因。你会得到什么?您认为哪种特定操作可以通过硬件支持更快地完成?垃圾收集器中的大多数工作只是跟随指针/引用,偶尔会将活动对象从一个堆复制到另一个堆。这与CPU已经支持的指令有何不同?

话虽如此,为什么你认为我们需要更快的垃圾收集?现代GC已经非常快速和高效,基本上它已解决了问题。