【问题标题】:Running Boehm GC in multiple threads independently在多个线程中独立运行 Boehm GC
【发布时间】:2014-01-22 04:55:47
【问题描述】:

我正在尝试为 Rust 写一些 bindings 到 Boehm GC。

一些背景知识:Rust 被设计为一种高并发语言,这种设计的结果是能够将 GC 指针静态限制在分配它们的线程内(即分配的 GC 指针线程 x 永远不能被另一个线程保持活动状态(甚至根本无法引用)。

因此,我希望推动 Boehm 尽可能利用这一点来提高性能:

  1. 线程安全,因此我可以从多个线程中分配和收集
  2. 尽可能少地停止集合(即仅当前线程),其他线程可以继续运行,因为它们不可能干扰与自身之外的 GC 指针相关的任何内容
  3. 最好是完全本地线程,不同线程的 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


【解决方案1】:

我没有关于如何使用 Boehm 执行此操作的答案。但是,这里有两个 GC,它们似乎具有足够的控制和封装,可以为每个线程拥有一个完全独立的 GC 上下文。

【讨论】:

  • 链接已修复
【解决方案2】:

设施 3 似乎是在 Boehm GC fork 中实现的,方法是将收集器的每个全局变量声明为线程局部变量 - https://github.com/Samsung/gcutil/commit/0cc277fb0cef82d515cc4ff4a439e50568474e16

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多