對actor的消息傳遞語義的忠實實現意味着即使對於不可變類型,也可以從邏輯深度複製消息內容。消息內容的深度複製仍然是幼稚執行actor模型的最大瓶頸,所以一些實現(即.Kilim)支持零拷貝消息傳遞。JVM上的零拷貝消息傳遞
我的問題是,零拷貝消息傳遞(作爲Actor library/framework的一部分)如何在共享內存平臺(如JVM)中實現?我認爲它只能用於具有不可變內容的消息,並且消息引用的可見性必須以某種方式受到限制。但是,我無法找到Actor模型實現背後的「理論」。
對actor的消息傳遞語義的忠實實現意味着即使對於不可變類型,也可以從邏輯深度複製消息內容。消息內容的深度複製仍然是幼稚執行actor模型的最大瓶頸,所以一些實現(即.Kilim)支持零拷貝消息傳遞。JVM上的零拷貝消息傳遞
我的問題是,零拷貝消息傳遞(作爲Actor library/framework的一部分)如何在共享內存平臺(如JVM)中實現?我認爲它只能用於具有不可變內容的消息,並且消息引用的可見性必須以某種方式受到限制。但是,我無法找到Actor模型實現背後的「理論」。
據我所知沒有任何實際的實現是如何做的,但當不變性在編譯時確保這樣的:
class Immutable {
private final String str = "A";
public String getString(){
return str;
}
}
你可以簡單地沿着引用傳遞,對不對?它不是一個Actor庫,但Google Guava爲您提供了這個成語return ImmutableList.copyOf(someList);
,如果someList
是不可變的(即它是ImmutableList的實例),它將成爲零拷貝。猜測可以使用類似的方法,例如,通過實施標記界面並檢查該標記界面,從而決定是否複製。
Kilim通過強制消息對象的單個所有者並在消息傳遞過程中實現參與消息引用的actor參與者的實現零複製消息傳遞。在程序員級別,引用逐字地從一個堆中消失並出現在另一堆上,但是沒有消息在進程中被分配或解除分配。 Erjang使用Java + Kilim實現。
不安全的零拷貝消息傳遞是Scala Actor和Akka Actor在同一進程中的標準做法。我說這是不安全的,因爲它們不能保護你不在參與者之間共享對可變對象的引用。程序員有責任堅持發送不可變的消息。在實踐中,這是一個完全合理的交易。編碼或審閱其他人的代碼時,您只需要注意它。