Memory management RCU作为传统垃圾收集的替代品

Memory management RCU作为传统垃圾收集的替代品,memory-management,garbage-collection,rcu,Memory Management,Garbage Collection,Rcu,读拷贝更新(RCU)是一种手动内存管理技术,在Linux内核中越来越流行 是否有可能设计一种使用RCU而不是传统垃圾收集器来回收无法访问内存的语言和VM?是否有可能:是的,Linux内核就是一个活生生的例子 在linux内核中,当使用RCU时,数据结构早期版本的垃圾收集会在schedule()期间发生,因为此时已知所有读卡器都已完成 当然,Linux内核没有垃圾收集器,对不可访问内存的回收通常是显式的和即时的。RCU更新是一种特殊情况,其中回收是明确的,但不是立即的 像JavaScript的P

读拷贝更新(RCU)是一种手动内存管理技术,在Linux内核中越来越流行


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

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

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

当然,Linux内核没有垃圾收集器,对不可访问内存的回收通常是显式的和即时的。RCU更新是一种特殊情况,其中回收是明确的,但不是立即的


像JavaScript的Python那样的通用vm是否可能:这很难

  • RCU需要一个垃圾收集器
  • RCU主要用于读取工作负载
  • RCU适用于较短的临界截面
RCU仍然需要一个垃圾收集器;相反,与垃圾收集器一起工作的RCU可以避免在大多数情况下锁定,也就是说,当读关键部分在没有并发写的情况下完成时

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

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

在动态语言VM中,由于不断的间接寻址,临界段的长度特别难以预测。例如,考虑<代码> int(代码,替换(“”,“”)):<代码> INT/code >可以通过<代码> > y> int >代码>,>代码>。替换< /code >可能通过属性重载,<代码>(…)>代码>可以通过<代码>每个重载都是Python代码,可能需要任意长的时间。这同样适用于内置数据结构,其中
c=1的update(last语句);d={c:42};d[c]=43
可以在内部使用RCU进行某些操作,但必须非常小心,因为
c
可能只实现
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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

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



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

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