【发布时间】:2014-01-22 04:55:47
【问题描述】:
我正在尝试为 Rust 写一些 bindings 到 Boehm GC。
一些背景知识:Rust 被设计为一种高并发语言,这种设计的结果是能够将 GC 指针静态限制在分配它们的线程内(即分配的 GC 指针线程 x 永远不能被另一个线程保持活动状态(甚至根本无法引用)。
因此,我希望推动 Boehm 尽可能利用这一点来提高性能:
- 线程安全,因此我可以从多个线程中分配和收集
- 尽可能少地停止集合(即仅当前线程),其他线程可以继续运行,因为它们不可能干扰与自身之外的 GC 指针相关的任何内容
- 最好是完全本地线程,不同线程的 GC“实例”之间没有同步
1 很简单,但我找不到 2 和 3 的任何设施。最重要的部分是 1 和 2,因为我希望能够让线程在后台运行,而与其他线程正在做什么无关(即使他们都在分配和垃圾收集千兆字节的内存)。
(我确实know about THREAD_LOCAL_ALLOC & gc_thread_local.h,但这并不能完全满足3,它只是让它更高效,但在线程之间传输本地分配的指针仍然有效,而我不需要那个保证。)
【问题讨论】:
-
您是否致力于使用 Boehm,或者您是否愿意考虑市场上其他开源保守的 GC?例如。您也许可以在这里将 Tamarin 的 MMgc 破解成适合您需求的东西。 (我的记忆是 MMgc 允许每个线程 GC 对象,每个对象都有自己的根和对象图。)
-
(作为 MMgc 的后续:GCHeap 类和全局页面映射中仍然存在全局跨线程状态;我不确定您打算将第三个标准走多远。还有一个问题,adobe 不太可能为这个项目提供太多支持。)
-
@pnkfelix 我并没有致力于任何事情,我只是在尝试“简单”的 GC(我不妨在 Rust 的上下文中这样做,即使像你这样的人知道得很远超过我:) )。这看起来可能是可行的,但我对编写一个通过 FFI 使用的 C 接口不是很感兴趣(不过,我肯定会记住它作为调查的可能性,谢谢)。无论如何,我现在正在破解一个纯 Rust GC;更容易满足上述所有要求,而且更有趣:但更难达到尽可能快的速度,所以我仍然对这个问题的任何答案感兴趣。
-
如果它是新的问题,只为关注者:
-DPARALLEL_MARKgithub.com/ivmai/bdwgc/blob/master/doc/scale.md还有时间限制的增量(以平行标记为代价)github.com/ivmai/bdwgc/commit/…
标签: c multithreading garbage-collection rust boehm-gc