5

「ばかげた」質問をする気がしますが、質問しなければなりません...

2 つの仮想マシンがあります。

オブジェクトのインスタンスをあるインスタンスから別のインスタンスにコピーしたいのですが、

このオブジェクトを表すビットを VM のヒープにコピーし、それを他の VM に送信することは可能ですか? 他の VM はメモリ内のビットを割り当て、そのスタック内の参照をこのメモリ スロットに追加するだけで済みます。 .?

現在、そのようなことを行うために、オブジェクトをシリアル化してからシリアル化を解除します。これは、インスタンスをそのままコピーするよりもはるかに効率的ではありません (計算上)... 解析は計算上の無駄です...

JSシリアライゼーション_ JSON.stringify_ var myObject = eval('(' + myJSONtext + ')');) .. (ここでは JavaScript は単なる例です。これはある種のシリアル化です)

4

3 に答える 3

7

この質問を複数のVMに簡単に一般化できるという素朴な仮定を少しの間無視しましょう。このようなメカニズムを構築する試みは、メカニズムを構築するVMの実装の詳細に大きく依存します。

これが行われない理由は次のとおりです。

  1. インコア表現は、通常、アーキテクチャ間で移植可能ではありません。SPARCマシンのVMからx86マシンのVMに、その構造を知らずに「オブジェクト」を送信すると、オブジェクトは反対側で破損しているように見えます。

  2. オブジェクトは必ずしも両方のマシンの同じメモリ位置に存在するわけではないため、オブジェクト内の内部ポインタは、2番目のVMに到達した後にパッチを適用する必要があります。これも、オブジェクトの構造に関する内部知識が必要です。

  3. オブジェクトにはおそらく他のオブジェクトへの参照が含まれているため、オブジェクトをコピーするということは、オブジェクトのツリーをコピーすることを意味し、通常は非循環ツリーでもありません。これを確実に行うために、シリアル化ライブラリに非常によく似たコードを作成することになります。

  4. 多くの場合、オブジェクトは、マシン間で確実に送信できないネイティブリソース(ファイルハンドルやソケットなど)を保持します。

  5. 多くのVMでは、データ(コピーしようとしているオブジェクト)とメタデータ(たとえば、コピーしようとしているオブジェクトのクラス)が区別されます。これらの種類のVMでは、オブジェクトをビットごとに無傷でコピーできたとしても、リモートエンドに存在しないメタデータの束に依存する可能性があります。多くのVMは、データを本質的に移植不可能にする実装手法(インターンされた文字列のグローバルプールやメモリマップされたオブジェクトコードなど)を使用するため、メタデータをビットごとにコピーすることも注意が必要です。また、必要以上のメタデータが生成される可能性があります(たとえば、.netでは、パッケージ化してどこかに送信できるメタデータの最小単位は通常、アセンブリです)。

  6. インコア表現は通常、同じVMの異なるバージョン間で移植可能ではなく、データのパッチに使用できる内部バージョン情報が含まれていません。

  7. インコア表現には、コピーする必要のない多くのもの(インラインキャッシュ、ガベージコレクション情報など)が含まれています。このようなものをコピーすることは無駄であり、情報は反対側でさえ意味をなさないかもしれません。

基本的に、これを確実に行うには、世界で最も厄介で信頼性の低いシリアル化ライブラリを構築することになり、単純なメモリコピーのパフォーマンスの向上は、コピーを単純に行うときに壊れてしまう多くのことをパッチすることで失われます。

したがって、これらのメカニズムは存在しない傾向があります。

このルールには大きな例外が1つあります。イメージベースの仮想マシン(多くのsmalltalkやセルフVMなど)は、仮想マシンの状態がコピーしたり、マシン間で移動したりできる「イメージ」に存在するという考えに基づいて構築されています。通常、かなりのパフォーマンスコストがかかります。

于 2010-08-26T13:23:58.733 に答える
2

cpickleを使ってみませんか。データは非常に確実かつ迅速にシリアル化され、パイプ、mmapという名前のソケットを介して送信できます。ただし、転送中に破損しない限り、データを確実に再構築することが期待できます。ピクルスモジュールのバージョンはそれほど違いはありません。もちろん、真に企業的な方法は、XMLなどのプラットフォームにとらわれない標準を使用することです。これにより、Pythonを超えてプラットフォームの相互運用性を拡張できます。私はこれが質問を回避することを知っていますが、Pythonインタープリターコードベースに貢献した誰かがあなたのためにそれを明確にする必要があると思います。

于 2010-08-26T16:16:29.267 に答える
0

VMware API でこの種の直接メモリ転送を行う方法はないと確信しています。他のハイパーバイザーについては知りませんが、まだ疑いがあります。VMware には、マシン全体のメモリを別のホスト サーバーに転送する方法がありますが (ほとんどの場合、ページング ファイルを使用して)、実行中のプログラムからメモリの一部だけを抽出して別のプログラムに渡す方法はありません。そこの。

したがって、オブジェクトのシリアル化の既存の戦術は、このニーズに対する優れた一般的なソリューションであり、幸いなことに、使用しているプログラミング言語には適切なオプションがあります ( PythonJava )。

しかし、オブジェクト全体を隠して再作成する必要があるのか​​ 、それとも含まれているデータの一部だけなのか疑問に思っています。データが過剰でない場合は、何らかのリモート メソッド呼び出しを使用して、ソース VM からレシーバーにメッセージを送信し、このデータを使用してオブジェクトを作成するように指示できます。この場合、必要なデータのみをシリアル化し、ターゲット マシンが独自のメモリでオブジェクトを再構築できるようにします。

于 2010-08-26T13:28:22.727 に答える