大多数编程语言使用垃圾回收器(可能所有编程语言),与并行计算有关的一个主要问题是: 垃圾回收器必须停止所有正在运行的线程以删除未使用的对象。Haskell也有垃圾回收器。但由于其纯度性质,Haskell保证没有任何计算会改变原始数据,而是生成一个副本,然后进行更改。我想,这样GC就不必停止所有线程来完成其工作。我只是好奇:Haskell是否存在相同的垃圾回收问题?
大多数编程语言使用垃圾回收器(可能所有编程语言),与并行计算有关的一个主要问题是: 垃圾回收器必须停止所有正在运行的线程以删除未使用的对象。Haskell也有垃圾回收器。但由于其纯度性质,Haskell保证没有任何计算会改变原始数据,而是生成一个副本,然后进行更改。我想,这样GC就不必停止所有线程来完成其工作。我只是好奇:Haskell是否存在相同的垃圾回收问题?
GHC的垃圾回收器是并行而不是并发。这意味着它可以使用所有线程执行垃圾回收,但必须停止所有线程才能执行。并发垃圾收集实现起来要困难得多(通常也有更大的性能开销)。
有些讽刺的是,Haskell确实使用了许多可变对象,即thunks(未评估表达式)。可变对象不能自由地复制(对于不可变对象,过多的复制也应该受到限制)。
对于在多个核心上运行的程序,拥有真正的并发收集器会很好,但您也可以通过执行堆本地垃圾回收来获得不错的效果。其思想是仅由拥有数据的CPU收集未与多个CPU共享的数据。这通常适用于短暂的数据。Simons最近在这个领域做了一些工作。请参见他们的论文“Multicore Garbage Collection with Local Heaps”(PDF)。该论文还展示了一些类似于您提出的利用不变性的方法。
编辑:我忘记提到Erlang基本上就是您提出的方法。每个Erlang进程都有自己的堆,发送消息会将数据从一个进程复制到另一个进程中。因此,每个Erlang进程可以独立于所有其他进程执行其自己的GC。(缺点是Erlang不能给您提供共享内存并发。)