0

Actor 消息传递语义的忠实实现意味着消息内容是从逻辑角度深度复制的,即使对于不可变类型也是如此。消息内容的深度复制仍然是 Actor 模型幼稚实现的最大瓶颈之一,因此一些实现(即 Kilim)支持零复制消息传递。

我的问题是,如何在 JVM 等共享内存平台中实现零拷贝消息传递(作为Actor 库/框架的一部分)?我认为它只能用于具有不可变内容的消息,并且必须以某种方式限制消息引用的可见性。但是,我很难找到 Actor 模型实现背后的“理论”。

4

2 回答 2

1

并不是说我知道任何实际的实现是如何完成的,但是当在编译时确保不变性时,如下所示:

 class Immutable {
     private final String str = "A";
     public String getString(){
         return str;
     }
 }

你可以简单地传递一个参考,对吧?它不是一个 Actor 库,但 Google Guava 为您提供了这个习惯用法,如果它是不可变的(即,如果它是 ImmutableList 的实例),它将return ImmutableList.copyOf(someList);是一个零副本。someList猜测可以使用类似的方法,例如通过实现标记接口Immutable并检查它,从而决定是否复制。

于 2010-07-28T22:24:51.507 回答
0

Kilim 通过对 Message 对象强制执行单个所有者并在消息传递期间实现消息引用的 Actor 到 Actor 切换来进行零复制消息传递。在程序员级别,引用从一个堆中消失并出现在另一个堆上,但在进程中没有分配或释放消息。Erjang 是使用 Java+Kilim 实现的。

不安全的零拷贝消息传递是 Scala Actors 和 Akka Actors 在同一进程中的标准做法。我说这是不安全的,因为它们不能保护您免于在参与者之间共享对可变对象的引用。坚持发送不可变消息是程序员的责任。在实践中,这是一个完全合理的权衡。您只需要在编码或审查其他人的代码时意识到这一点。

于 2010-07-28T22:48:10.910 回答