【问题标题】:Efficient GC write barrier in generated C生成的 C 中的高效 GC 写屏障
【发布时间】:2013-03-17 16:51:53
【问题描述】:

我正在设计一个预先编译 CIL 字节码的系统。为了使其相对简单并使其非常可移植,系统将发出 C 源代码(但排除了所有更高级别的结构,如 OOP)而不是机器代码。目的是目标平台的标准 C 编译器将用于该代码以获得最终产品。

最初我打算使用一种非常简单的 GC 方法,例如 stop-the-world。然而,虽然应用程序不需要出色的性能,但它确实需要不错的性能,因此最终可能需要更改 GC。

我正在考虑最终需要某种写屏障的更复杂的 GC。我已经研究过 SATB 和卡片标记方法,但我还没有准备好实际计划一个好的 GC。我只是不想让这个东西发出 C 源代码,但后来发现高效的 GC 写入障碍需要内联汇编,这在很大程度上违背了发出 C 的目的。

那么,我的问题是,典型的写障碍能否在 C 代码中有效地实现?我们可以假设 C 编译器有一个不错的优化器。生成的“源代码”将完全难以辨认,这也是一个假设,因此清晰度并不重要。

我猜 - 以进一步膨胀源文件为代价 - 它可能可以合理地完成,但我会感谢在 GC 设计和/或编译器内部更有经验的人的话。

【问题讨论】:

    标签: garbage-collection code-generation


    【解决方案1】:

    我假设你想要一个精确的代移动或复制 GC。

    C 中可能存在写屏障;例如,Ocaml 和MELT 运行时都具有带写屏障的分代 GC。而qish 是一个带有写屏障的分代复制 GC,与 C 一起工作。

    (顺便说一句,MELT 是扩展 GCC 的领域特定语言,它被编译成 C,就像你想做的那样)

    一个更重要的问题是如何保留本地指针(以及 GC 如何知道它们),这是 GC 的确切方面。您可能希望将它们打包在一些本地结构中......但是可能会发生 C 编译器(例如 GCC)的优化少一点。

    您可能会查看MONO 的最新版本的源代码,它们具有分代复制GC。还可以查看Chicken Scheme 内部(也生成 C 代码)。

    请注意,您的 C 代码生成器必须进行更改以适应某些(或您的)特定 GC 实现(因为每个 GC 的不变量和期望略有不同)。还要注意tail recursion(一些 C 编译器,尤其是最近的 GCC,可能会在有限的情况下对其进行优化)。

    在 Qish、MELT 或 Ocaml 中,写屏障(在 C 端)由为每个触摸指针调用的一些宏(或内联函数)实现。细节是特定于实现的。您的 C 代码生成器将不得不处理它们。

    请注意,多线程 GC 难以设计,调试 GC,即使是简单的 GC,也需要花费大量时间且难度很大。

    【讨论】:

    • 好信息..谢谢!我可能会选择代代相传的部分保守的移动 GC。这避免了键入堆栈内容的复杂性和开销,但必须将任何看起来像 obj* 的东西固定在堆栈或 CPU 寄存器上。在这个特定的系统中,应用程序是事件驱动的,因此大多数事情不会在堆栈中停留太久。
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2013-08-31
    • 2019-03-02
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多