0

アクター メッセージ パッシング セマンティクスの忠実な実装は、不変型であっても、論理的な観点からメッセージ コンテンツがディープ コピーされることを意味します。アクター モデルの単純な実装では、メッセージ コンテンツのディープ コピーが依然として最大のボトルネックであるため、一部の実装 (例: 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 は、メッセージ オブジェクトの単一の所有者を強制し、メッセージ パッシング中にアクターからアクターへのメッセージ参照のハンドオフを実装することにより、ゼロコピー メッセージ パッシングを行います。プログラマー レベルでは、参照は文字通り 1 つのヒープから消えて別のヒープに表示されますが、そのプロセスでメッセージが割り当てられたり割り当て解除されたりすることはありません。Erjang は Java+Kilim を使用して実装されています。

安全でないゼロコピー メッセージ パッシングは、同じプロセス内の Scala アクターと Akka アクターの標準的な方法です。アクター間で変更可能なオブジェクトへの参照を共有することから保護されないため、安全ではないと言います。不変メッセージの送信に固執するのは、プログラマーの責任です。実際には、これは完全に合理的なトレードオフです。他の人のコードをコーディングまたはレビュアーするときは、これに注意する必要があります。

于 2010-07-28T22:48:10.910 に答える