读-复制-更新(RCU)是一种用于手动内存管理的技术,该技术在Linux内核中正变得越来越流行。
是否可以设计使用RCU而不是传统的垃圾收集器来回收无法访问的内存的语言和VM?
最佳答案
是否可能:是有点,Linux内核是一个生动的例子。
在Linux内核中,当使用RCU时,在schedule()
期间会发生数据结构以前版本的垃圾回收,因为此时已知道所有读取器都已完成。
当然,Linux内核没有垃圾收集器,回收不可访问的内存通常是显式且立即的。 RCU 更新是一种特殊情况,其中回收是显式的,但不是立即的。
像JavaScript的Python这样的通用vm 是否有可能:很难。
RCU仍需要一个垃圾收集器; RCU与垃圾回收器一起使用避免了大多数时间的锁定,即在读取关键部分完成而没有并发写入的情况下。
主要是工作负载。引用计数特别繁重,以至于多线程Python VM具有GIL来防止并发的refcount更新,因为这会导致缓存同步损失。因此,需要一些其他技术进行垃圾回收。
同时,天真的JavaScript实现完全不需要同步,因为它是单线程的(尽管可以想象将垃圾回收卸载到单独线程的JavaScript实现)。
动态语言虚拟机中关键部分的长度特别难于预测,因为它会不断地进行间接操作。例如,考虑
int(code.replace(" ", ""))
:int
可以通过__int__
重载,.replace
可以通过属性重载,(...)
可以通过__call__
重载。每个重载都是可能花费很长时间的Python代码。内置数据结构也是如此,其中c=1; d={c:42}; d[c]=43
的更新(最后一条语句)可以在内部使用RCU进行处理,除非必须非常小心,因为c
可能只是实现__hash__
,这可能会花费任意时间。恐怕我对编译语言及其VM的了解还不够。
我的直觉认为,新颖的高性能垃圾收集器确实可以在内部使用RCU,然后可能将RCU暴露给内置数据结构的实现。我认为可能要求操作系统提供更好的API,以将执行固定到特定的内核,以便从本地缓存中受益和/或在抢占用户土地时运行自定义代码。
尽管这不是的完整答案,但我希望本文的扩展评论有助于界定原始问题。
关于memory-management - RCU替代常规垃圾收集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17437165/