Dmi*_*lov 12 parallel-processing garbage-collection haskell immutability
大多数语言,使用垃圾收集器(可能都是这些),有一个与并行计算相关的主要问题:垃圾收集器必须停止所有正在运行的线程才能删除未使用的对象.Haskell也有垃圾收集器.但是,由于纯度,Haskell保证没有计算改变原始数据,而是生成副本,然后进行更改.我想,通过这种方式,GC不必停止所有线程来完成它的工作.我只是好奇:Haskell是否与垃圾收集有相同的问题?
nom*_*olo 17
GHC的垃圾收集器是并行的,但不是并发的.这意味着它可以使用所有线程来执行垃圾收集,但它必须阻止所有线程执行此操作.并发垃圾收集更难实现(并且通常具有更大的性能开销).
具有讽刺意味的是,Haskell确实使用了许多可变对象,即thunk(未评估的表达式).可变对象不能自由复制(即使对于不可变对象,也应该检查过多的重复).
对于在具有真正并发收集器的多个核上运行的程序会很好,但是通过进行堆本地垃圾收集也可以获得不错的好处.这个想法是,多个CPU之间不共享的数据只能由拥有的CPU收集.这通常是短期数据的情况.西蒙斯最近在这方面做了一些工作.请参阅他们的论文"使用本地堆的多核垃圾收集"(PDF).本文还介绍了一些如何以类似于您提议的方式利用不变性的方法.
编辑:我忘了提到Erlang基本上完全按照你的建议行事.每个Erlang进程都有自己的堆,并且发送消息将数据从一个进程复制到另一个进程.因此,每个Erlang进程都可以独立于所有其他进程执行自己的GC.(缺点是Erlang没有给你共享内存并发.)