【问题标题】:Zero-copy message-passing on the JVMJVM 上的零拷贝消息传递
【发布时间】:2010-07-28 21:50:56
【问题描述】:

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

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

【问题讨论】:

    标签: java jvm actor message-passing actor-model


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-08-22
        • 2012-05-26
        • 2012-02-20
        • 2016-08-14
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多