我正在考虑函数式语言可以更直接地绑定到他们的硬件,并且想知道垃圾收集的任何硬件实现。
这会显着加快速度,因为硬件本身会隐式处理所有集合,而不是某些环境的运行时。
这是LISP机器做的吗?有没有进一步研究这个想法?这个域名是否具体?
思考?异议?讨论
答案 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)
是。查看这两篇论文的相关工作部分:
https://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/index.htm http://www.filpizlo.com/papers/pizlo-ismm2007-stopless.pdf
或者在这一个:
http://researcher.watson.ibm.com/researcher/files/us-bacon/Bacon12StallFree.pdf
答案 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)
答案 10 :(得分:0)
为什么会“加快速度”?硬件到底应该做什么? 它仍然必须遍历对象之间的所有引用,这意味着它必须在主内存中运行大量数据,这是它花费时间的主要原因。你会得到什么?您认为哪种特定操作可以通过硬件支持更快地完成?垃圾收集器中的大多数工作只是跟随指针/引用,偶尔会将活动对象从一个堆复制到另一个堆。这与CPU已经支持的指令有何不同?
话虽如此,为什么你认为我们需要更快的垃圾收集?现代GC已经非常快速和高效,基本上它已解决了问题。