Functional programming 硬件辅助垃圾收集

Functional programming 硬件辅助垃圾收集,functional-programming,garbage-collection,hardware,Functional Programming,Garbage Collection,Hardware,我在想函数式语言可以更直接地与硬件联系在一起的方法,我想知道垃圾收集的硬件实现 这将大大加快速度,因为硬件本身将隐式处理所有集合,而不是某些环境的运行时 这就是LISP机器所做的吗?对这个想法有没有进一步的研究?这是否过于特定于域 想法?反对意见?讨论。为什么它会“加快速度”?硬件到底应该做什么? 它仍然必须遍历对象之间的所有引用,这意味着它必须遍历主内存中的一大块数据,这是它需要时间的主要原因。你会从中得到什么?您认为通过硬件支持可以更快地完成哪项特定操作?垃圾收集器中的大部分工作只是遵循指针

我在想函数式语言可以更直接地与硬件联系在一起的方法,我想知道垃圾收集的硬件实现

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

这就是LISP机器所做的吗?对这个想法有没有进一步的研究?这是否过于特定于域

想法?反对意见?讨论。

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


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

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


GC太大,无法有效地在硬件级别实现。

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

这将为您提供一些位,您可以在其中存储对象状态(例如“这是一个新对象”和“我刚刚接触了这个对象”)。在执行GC时,优先选择带有“this is new”的对象,并避免使用“just touch”


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

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


如果我们真的这么做了,我们就必须考虑到硬件在背后隐藏着记忆。我想用现代的说法,这将是“另一条线”。如果正在检查某些内存(可能可以通过双端口内存解决),那么某些内存可能不可用。当然,如果HWGC要四处移动内容,那么它必须锁定其他进程,以免干扰它们。并以适合所用架构和语言的方式进行。所以,是的,特定领域


看看刚才出现了什么。。。查看java的GC日志。

其中描述了如何需要一个感知GC的虚拟内存管理器来拥有真正高效的GC,而如今虚拟机映射主要由硬件完成。给你:)

是的。查看这两篇论文的相关工作部分:

或者在这里:


我想最大的问题是CPU寄存器和堆栈。GC期间必须做的一件事是遍历系统中的所有指针,这意味着知道这些指针是什么。如果其中一个指针当前位于CPU寄存器中,那么您也必须遍历该寄存器。类似地,如果堆栈上有指针。因此,每个堆栈帧都必须有某种映射,说明什么是指针,什么不是指针,在执行任何GC遍历之前,必须将任何指针输出到内存中

你也会遇到闭包和延续的问题,因为突然你的堆栈不再是一个简单的后进先出结构


显而易见的方法是永远不要在CPU堆栈或寄存器中保留指针。而是将每个堆栈帧作为指向其前一帧的对象。但是这会降低性能。

由于分代收集,我不得不说跟踪和复制并不是GC的巨大瓶颈

有帮助的是硬件辅助的读屏障,它消除了在进行堆栈扫描和标记堆时“停止世界”暂停的需要

Azul系统公司已经做到了这一点: 他们在JavaOne上做了一个演示,介绍了他们的硬件修改如何允许完全无暂停GC

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

分代gc,甚至对于G1或garbagefirst,通过只扫描一个分区,并为跨分区指针保留一个记忆集列表,减少了它们必须扫描的堆的数量


问题是,这意味着任何时候,变异子设置一个指针时,它也必须将一个条目放入适当的重设集中。所以即使你没有GCing,你的开销也很小。如果可以减少这一点,就可以减少GCing所需的暂停时间和总体程序性能。

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

这来自他们的LISP传统IIRC

我的一个朋友构建了一个分代GC,通过从原语中偷取一点来标记。效果更好

所以,是的,这是可以做到的,但是nodody再也懒得给东西贴标签了

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

如果有足够大的门阵列(我想到的是vertex III),支持GC活动的增强型MMU是可能的。

你是个毕业生