Ask*_*aga 9 language-agnostic concurrency garbage-collection copying
在收集时,垃圾收集器将所有活动对象复制到另一个内存空间,从而丢弃进程中的所有垃圾对象.在新空间中指向复制对象的前向指针安装到对象的"旧"版本中,以确保收集器正确更新对象的所有剩余引用,并且不会错误地复制同一对象两次.
对于世界各地的收藏家来说,这显然效果很好.但是,由于停止世界的停顿时间很长,现在大多数垃圾收集器允许mutator线程与收集器同时运行,只是停止mutator一小段时间来进行初始堆栈扫描.
那么收集器如何确保mutator在复制时/之后不会访问对象的"旧"版本?我想,mutators可以检查带有某种读取障碍的前向指针,但是这对我来说似乎很昂贵,因为变量经常被读取.
您几乎需要使用读屏障或写屏障。您显然已经意识到阅读障碍,所以我不会尝试进入它们。
写入者屏障之所以有效,是因为只要您阻止写入发生,您就不在乎是否有人访问数据的旧副本或新副本。您设置写屏障,复制数据,然后开始调整指针。复制完成后,您并不真正关心有人读取数据的旧副本还是新副本,因为写屏障确保它们是相同的。一旦完成指针调整,一切都将与新数据一起工作,因此您可以撤销写入屏障。
已经完成了一些工作,使用页面保护位将内存区域标记为只读,以在相当标准的硬件上创建写屏障。然而,至少在我上次研究它时,这仍然处于概念验证阶段——可以工作,但速度太慢,不太实用。
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |