gpt4 book ai didi

erlang - Erlang 是否总是在同一节点上的进程之间复制消息?

转载 作者:行者123 更新时间:2023-12-04 01:20:35 25 4
gpt4 key购买 nike

Actor 消息传递语义的忠实实现意味着即使对于不可变类型,消息内容也可以从逻辑的角度进行深度复制。消息内容的深度复制仍然是actor模型实现的瓶颈,因此为了性能,一些实现支持零复制消息传递(尽管从程序员的角度来看它仍然是深度复制)。

Erlang 是否完全实现了零拷贝消息传递?在节点之间显然不能这样实现,但是在同一节点上的进程之间呢? This question相关的。

最佳答案

我认为您的断言根本不正确 - 进程间消息的深度复制不是 Erlang 的瓶颈,并且使用默认的 VM 构建/设置,这正是所有 Erlang 系统正在做的事情。

Erlang进程堆之间是完全分离的,消息队列位于进程堆中,所以必须复制消息。这对于将数据传入和传出 ETS 表也是如此,因为它们的数据存储在与进程堆不同的分配区域中。

然而,有许多共享数据结构。大型二进制文件(>64 字节长)通常在节点范围内分配并进行引用计数。 Erlang 进程只存储对这些二进制文件的引用。这意味着如果你创建一个大的二进制文件并将它发送到另一个进程,你只是在发送引用。

就分配大小而言,在进程之间发送数据实际上比您想象的要糟糕 - 在复制期间不会保留术语内部的共享。这意味着,如果您小心地构造一个具有共享的术语以减少内存消耗,它将在另一个进程中扩展到其未共享的大小。您可以在 OTP Efficiency Guide 中看到一个实际示例。 .

正如 Nikolaus Gradwohl 指出的那样,VM 有一个实验性的混合堆模式,它确实允许进程之间的术语共享并启用零复制消息传递。据我所知,这并不是一个特别有前途的实验——它需要额外的锁定,并使进程独立垃圾收集的现有能力复杂化。因此,复制进程间消息不仅不是 Erlang 系统中常见的瓶颈,实际上还降低了性能。

关于erlang - Erlang 是否总是在同一节点上的进程之间复制消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3406425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com