在多线程中独立运行Boehm GC

39

我正在尝试为Rust编写一些与Boehm GC相关的绑定

一些背景:Rust被设计成一种高并发语言,其设计结果之一是具有将GC指针静态限制在它们分配所在的线程内的能力(也就是说,在线程x中分配的GC指针永远不能被其他线程保持活动状态(甚至根本不会被引用))。

因此,我希望尽可能地利用Boehm来提高性能:

  1. 线程安全,这样我就可以从多个线程分配和收集
  2. 最小化停机时间(即仅当前线程),其他线程可以继续运行,因为它们不可能干扰任何与GC指针外部相关的东西
  3. 最好是完全线程本地化,没有不同线程的GC“实例”之间的同步

1很容易,但我找不到2和3的任何设施。最重要的部分是1和2,因为我希望能够在后台运行线程,独立于其他线程所做的事情(即使它们都分配和垃圾回收吉字节的内存)。

(我确实知道THREAD_LOCAL_ALLOCgc_thread_local.h,但它并不能完全满足3,它只是使其更有效,但仍然可以在线程之间转移本地线程分配的指针,而我不需要这个保证。)


3
你是否已决定使用Boehm垃圾回收器?或者你愿意考虑市场上其他的保守型开源垃圾回收器吗?例如,你可以尝试将Tamarin的MMgc进行修改来满足你此处的需要。(我记得MMgc允许每个线程具有自己的垃圾回收对象,每个对象都有自己的根节点和对象图。) - pnkfelix
3
关于MMgc的后续:GCHeap类和全局页面映射仍存在全局跨线程状态,我不确定您的第三个标准打算覆盖多少方面。同时,还存在一个问题,即Adobe可能不会为这个项目提供太多支持。 - pnkfelix
2
@pnkfelix 我没有做出任何承诺,只是在尝试“易于使用”的GC(即使像你这样的人知道得比我多 :)),而我可能会在Rust的上下文中进行尝试。那看起来似乎是可行的,但我对编写通过FFI使用的C接口不太感兴趣(虽然我肯定会将其作为一个可能性来调查,谢谢)。无论如何,我现在正在研究一个纯Rust GC;更容易满足所有上述要求,也更有趣:但要让它变得与其他GC一样快就困难得多,因此我仍然对这个问题的任何答案感兴趣。 - huon
如果是新问题,仅适用于追随者:-DPARALLEL_MARK https://github.com/ivmai/bdwgc/blob/master/doc/scale.md 还有带时间限制的增量方式(以并行标记为代价)https://github.com/ivmai/bdwgc/commit/3c571c7ad66a90e33e4701afe3dc4d2113c60adc - rogerdpack
2个回答

8

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接