7

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

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

4

1 回答 1

0

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

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

当然,Linux 内核没有垃圾收集器,对不可达内存的回收一般是显式且即时的。RCU更新是一种特殊情况,回收是明确的但不是立即的。


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

  • 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 以将执行固定到特定内核,以从本地缓存中受益和/或在用户空间被抢占时运行自定义代码。


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

于 2020-08-26T05:24:32.050 回答