【问题标题】:RCU as an alternative to conventional garbage collectionRCU 作为传统垃圾收集的替代品
【发布时间】:2013-06-30 12:05:49
【问题描述】:

Read-Copy-Update (RCU) 是一种手动内存管理技术,在 Linux 内核中越来越流行。

是否可以设计一种语言和虚拟机,使用 RCU 而不是传统的垃圾收集器来回收无法访问的内存?

【问题讨论】:

  • 是互斥算法,不是内存回收器。好吧,大多数情况下,无论如何。
  • 好吧,我读过的所有描述都表明您可以在至少一个宽限期后释放旧数据,所以这似乎是相关的。
  • 嗯。我看不出拥有一个 RCU 对象的活动“查看器”数量与任何其他引用计数实现有任何显着差异。所以我想说,“RCU 不是垃圾收集器,但它确实实现了类似于 Refcounting 本身的东西”,但在内部,RCU 更像是一种设计模式而不是 GC 。所以也许,这些不是您要寻找的机器人,而您一直在寻找的 GC 替代方案称为 ARC(自动引用计数),即编译器自动生成所有添加和释放引用调用的引用计数你。
  • “与任何其他引用计数实现有任何显着差异”。引用计数读屏障非常昂贵(通常是缓存未命中),而 RCU 读屏障非常便宜(并且可以是免费的)。这听起来对我来说是一个潜在的重大好处。
  • 嗯,我希望有人回答 (a) 是,有或 (b) 不,这是不合适的,这就是原因,因为我无法知道它在内核空间之外是否可行共享内存实现是常态,即每个进程都有自己的共享内存 RCU 堆。我怀疑内核中的少数站点处理的对象总数约为 5000 个对象,而 GC 实现扩展到数十亿个对象可能没有太多共同点。

标签: memory-management garbage-collection rcu


【解决方案1】:

有没有可能:是的,Linux内核就是一个活生生的例子。

在 linux 内核中,当使用 RCU 时,之前版本的数据结构的垃圾收集发生在 schedule() 期间,因为此时已知所有读取器都已完成。 p>

当然,Linux 内核没有垃圾收集器,对无法访问的内存的回收通常是显式且即时的。 RCU update 是一种特殊情况,回收是明确的但不是立即的。


通用 vm 有没有可能,比如 JavaScript 的 Python:这很难。

  • RCU 需要一个垃圾收集器
  • RCU 专为以读取为主的工作负载而设计
  • RCU 专为较短的关键部分而设计

RCU 仍然需要一个垃圾收集器;相反,RCU 与垃圾收集器一起工作,在大多数情况下避免了锁定,即当读取临界区完成而没有并发写入时。

以阅读为主的工作负载。引用计数的写入量特别大,以至于多线程 Python VM 具有 GIL 来防止并发引用计数更新,因为这会导致缓存同步损失。因此,需要一些其他的垃圾收集技术

同时,一个简单的 JavaScript 实现根本不需要同步,因为它是单线程的(尽管可以想象一个 JavaScript 实现,其中垃圾收集被卸载到一个单独的线程)。

动态语言 VM 中临界区的长度特别难以预测,因为它会不断地进行间接寻址。例如,考虑int(code.replace(" ", ""))int 可能通过__int__ 重载,.replace 可能通过属性重载,(...) 可能通过__call__ 重载。每个重载都是 Python 代码,可能需要任意长的时间。这同样适用于内置数据结构,其中c=1; d={c:42}; d[c]=43 的更新(最后一条语句)可以在内部使用 RCU 做某事,但必须非常小心,因为c 可能只实现__hash__,这可能需要任意长时间。

恐怕我对编译语言及其虚拟机了解不够。

我的直觉认为,新颖的高性能垃圾收集器确实可以在内部使用 RCU,然后可能将 RCU 暴露给内置数据结构的实现。我认为操作系统可能需要提供更好的 API 以将执行锁定到特定内核,以从本地缓存中受益和/或在用户空间被抢占时运行自定义代码。


虽然这不是一个完整的答案,但我希望这个扩展评论有助于限制原始问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2012-03-13
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多