Read-Copy-Update (RCU) 是一种手动内存管理技术,在 Linux 内核中越来越流行。
是否可以设计一种语言和虚拟机,使用 RCU 而不是传统的垃圾收集器来回收无法访问的内存?
Read-Copy-Update (RCU) 是一种手动内存管理技术,在 Linux 内核中越来越流行。
是否可以设计一种语言和虚拟机,使用 RCU 而不是传统的垃圾收集器来回收无法访问的内存?
是否有可能:是的,Linux 内核就是一个活生生的例子。
在 linux 内核中,当使用 RCU 时,之前版本的数据结构的垃圾收集发生在此期间,schedule()
因为此时已知所有读取器都已完成。
当然,Linux 内核没有垃圾收集器,对不可达内存的回收一般是显式且即时的。RCU更新是一种特殊情况,回收是明确的但不是立即的。
像 Python of JavaScript 这样的通用 vm是否可能:这很难。
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 以将执行固定到特定内核,以从本地缓存中受益和/或在用户空间被抢占时运行自定义代码。
虽然这不是一个完整的答案,但我希望这个扩展评论有助于限制原始问题。