【问题标题】:Why CPU registers act like roots for Garbage Collector?为什么 CPU 寄存器就像垃圾收集器的根?
【发布时间】:2013-10-09 14:47:44
【问题描述】:

为什么 CPU 寄存器充当垃圾收集器的根?当 mutator 暂停时,垃圾收集器可以扫描根,变量内容被刷新到内存(使用内存栅栏),因此寄存器不包含不在内存中的数据......如果我的理解是正确的......

那你为什么需要扫描它们呢?我认为这是冗余......

【问题讨论】:

  • 标准 C++ 没有垃圾收集。您是在询问特定的语言扩展,还是不同的语言?
  • C++ 和垃圾收集在一起......虽然有 C++ 的垃圾收集器,但没有标准的。您必须通过包括您正在谈论的垃圾收集器来使这个问题更加详细。
  • 据我所知,根是堆栈中的变量和GC一般上下文中的全局变量。
  • cpu 寄存器究竟如何成为任何东西的“根”?据我所知,在汇编级别的 CPU 根本无法按照您描述的方式工作。这部分尤其对我没有任何意义任何“变量内容被刷新到内存(使用内存栅栏),因此寄存器不包含不在内存中的数据”寄存器与内存无关,GC不会在寄存器级别操作,而且变量已经在内存中,所以你不能在那里刷新它们。
  • @DaniloCarvalho:“最终寄存器值将被写入内存” 这不是真的,也不能保证。变量可以完全转换为寄存器。值可能永远不会写入内存。地址(存储在寄存器中)可能会被重用。即使在外部函数调用之后,寄存器值也可能保持不变。如果你想写一个 GC,我建议你在比 CPU 更高的级别上操作。 AFAIK,CPU 寄存器是多用途的,不只是存储计算的“中间结果”。

标签: c++ garbage-collection memory-fences


【解决方案1】:

刷新到内存是一个实现细节。重要的是,在启动 GC 周期时寄存器中包含的数据被视为可访问的,无论在 GC 周期本身期间该数据如何或存储在内存中的位置。

【讨论】:

  • 我的问题是:如果我保证所有的 mutators 都被暂停并且他们(mutators)在暂停之前已经调用了std::atomic_thread_fence...在std::atomic_thread_fence 之后所有的寄存器值都被刷新到内存吗?那么,如果所有内容都被刷新到内存中(并假设程序员自己不会更改寄存器值),为什么我需要在扫描根时读取寄存器?
  • @DaniloCarvalho 不,你不能保证所有的寄存器都被刷新到内存,如果仅仅因为一个符合要求的实现被允许有只寄存器的变量(是的,甚至是指向对象的指针)永远不会写入内存.
  • 但是如果我对这些变量使用 & 运算符,那么我将强制它们不只是注册。对吗?
  • @DaniloCarvalho:不,因为您无法预测编译器将如何处理该值。你不知道编译器会产生什么样的 CPU 指令,以及它将如何以及在哪里存储变量。您的想法仅适用于某种定制的编译器(与替代方案相比效率低下)。尝试不同的方法。
  • 我想知道编译器会为烘焙到寄存器中的变量返回什么地址...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2020-03-06
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多