garbage-collection - 生成的 C 中的高效 GC 写入屏障

标签 garbage-collection code-generation

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

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

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

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

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

最佳答案

我假设您想要一个精确的分代移动或复制 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,也会花费大量时间并且很困难。

关于garbage-collection - 生成的 C 中的高效 GC 写入屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15456846/

相关文章:

java - 如何清理该 Java 示例内存

c# - 如果 volatile 引用在线程加载引用和对其调用函数之间发生了变化,旧对象是否可以被垃圾回收?

visual-studio - 如何说服 Visual Studio 在生成代码时不省略访问修饰符?

python - Pytest 在派生类中生成测试

c# - 如何为任意类型创建 Roslyn ITypeSymbol?

java - 在 GCViewer 的帮助下调整垃圾收集器

python - 为什么 sys.getrefcount() 返回 2?

php - 为什么 ini_set ('session.gc_maxlifetime' ,60) 不起作用?

.net - 是否有任何 .NET 工具可以基于某种元数据生成表单?

php - 动态创建类