压缩垃圾收集后确保“指针一致性”

时间:2016-03-15 09:55:10

标签: pointers garbage-collection segmentation-fault memory-barriers

我想为运行时系统实现压缩垃圾收集器,该系统支持并行运行的多个线程,没有全局解释器锁。我的主要目标是实现简单性。可移植性不是一个重要的优先事项 - 我对只能在x86-64 Linux系统上运行的东西感到满意。

理想情况下,我希望我的记忆障碍就像mprotect()正在收集内容或移动到其他地方的页面一样简单。如果这导致mutator中的页面错误,则mutator必须等到垃圾收集周期完成 - 我将设置一个SIGSEGV处理程序来执行此操作。

但是,因为它是一个压缩收集器,当垃圾收集周期结束时,mutator试图操作的对象可能已被移动到其他位置。我需要一些方法来确保当mutator重新尝试操作对象时,它将使用对象的新内存地址,而不是旧内存地址。我该怎么做?

如果有帮助,这里是对象模型的描述。这个设计不是一成不变的,但它是一个很好的参考点。

内存分为正确对齐的64位字。每个对象都包含一个固定长度的标题(1个单词),后跟一个可变长度的主体。对象可以是标量或数组。

标量的标题词包含以下信息:

  • 对象大小:对象正文中的单词数。不得超过48.(6位)
  • 数组标志:始终为0.(1位)
  • Alive flag:确定对象是否在下一个垃圾回收周期中存活。 (1位)
  • 构造函数标记:垃圾收集器未使用。可用于标识代数数据类型的构造函数,因此也就是名称。 (8位)
  • 指针标志:第i个指针标志确定第i个正文字是否是指向另一个对象的指针。 (48位)

数组的标题字包含以下信息:

  • 元素大小:单个元素正文中的单词数。不得超过48.(6位)
  • 数组标志:始终为1.(1位)
  • Alive flag:确定数组的某些 slice (见下文)是否能够在下一个垃圾收集周期中存活。 (1位)
  • 数组长度:数组中的元素数。 (56位)

数组的元素本身就是标量,必须有自己的标题字。数组元素的对象大小必须与数组的元素大小一致。

数组切片或仅切片是数组对象中的连续元素范围。指向切片的指针由三个单词组成:

  • 指向正确数组对象的指针。
  • 半开元素的端点范围[from,to)

指向数组的指针不能孤立存在 - 它们必须始终是指向切片的指针的一部分。这种设计有一些实际的后果:

  • 多个切片可以包含具有相同物理身份的元素。
  • 获取切片的子切片是O(1)操作。
  • 如果没有对它们的连续引用,则可以通过垃圾收集器截断或拆分数组。

0 个答案:

没有答案