参与者消息传递语义的忠实实现意味着消息内容从逻辑角度被深度复制,甚至对于不可变类型也是如此。消息内容的深度复制仍然是天真实现参与者模型的最大瓶颈之一,因此有些实现(即。支持零拷贝消息传递。
我的问题是,在像JVM这样的共享内存平台中,零拷贝消息传递(作为Actor library/framework的一部分)是如何实现的?我假设它只能用于具有不可变内容的消息,并且消息引用的可见性必须在某种程度上受到限制。但是,我很难找到Actor模型实现背后的“理论”。
发布于 2010-07-28 22:24:51
我并不知道实际的实现是如何实现的,而是当在编译时确保不可变时,如下所示:
class Immutable {
private final String str = "A";
public String getString(){
return str;
}
}你可以简单地传递一个引用,对吗?它不是一个Actor库,但是Google给了你这个成语return ImmutableList.copyOf(someList);,如果someList是不可变的(也就是说,如果它是ImmutableList的一个实例),它将是一个零拷贝。可以使用类似的方法,例如通过实现标记接口Immutable并检查它,从而决定是否要复制。
发布于 2010-07-28 22:48:10
Kilim通过强制消息对象的单个所有者并在消息传递期间实现参与者到参与者的消息引用切换来执行零复制消息传递。在程序员级别,引用实际上从一个堆中消失,出现在另一个堆上,但是在进程中没有分配或释放任何消息。Erjang是使用Java+Kilim实现的。
不安全的零拷贝消息传递是Scala Actors和Akka Actors在同一过程中的标准做法。我说这是不安全的,因为它们不能保护您在参与者之间共享对可变对象的引用。坚持发送不可变的消息是程序员的责任。在实践中,这是一个完全合理的权衡。在编写代码或查看其他人的代码时,您只需要意识到这一点。
https://stackoverflow.com/questions/3357829
复制相似问题