在JVM上进行零拷贝消息传递

时间:2010-07-28 21:50:56

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

忠实地实现actor消息传递语义意味着消息内容是从逻辑视点深度复制的,即使对于不可变类型也是如此。对邮件内容进行深度复制仍然是天真实现actor模型的最大瓶颈,因此一些实现(即Kilim)支持零拷贝消息传递。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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