Domanda

Ho la sensazione che sto per fare una domanda "stupido", ma devo chiedere ...

Ho 2 macchine virtuali.

Vorrei copiare un'istanza di un oggetto da uno all'altro,

E 'possibile copiare i bit che rappresentano l'oggetto in mucchio del VM, invia agli altri VM, così l'altro VM solo bisogno di allocare i bit in esso di memoria e aggiungere un riferimento in essa di pila a questa memoria Slot ...?

Al momento, al fine di fare una cosa che serializzare l'oggetto e unserialize esso, che è molto meno efficiente (computazionale saggio) che solo copiare l'istanza come è ... l'analisi è uno spreco computazionale ...

JS serializzazione Esempio: ogni VM è un'istanza di V8 (JavaScript) , Un modo per farlo è quello di convertire l'oggetto JSON (JSON.stringify), inviarla in qualche modo verso l'altro VM, che ottiene la stringa e riconvertirlo in oggetto (es var myObject = eval('(' + myJSONtext + ')');) .. (JavaScript è solo un esempio qui, questa è una sorta di serializzazione)

È stato utile?

Soluzione

Consente di ignorare per un secondo l'ipotesi ingenua che si può generalizzare questa domanda su più macchine virtuali facilmente. Qualsiasi tentativo di costruire un meccanismo come questo sarebbe fortemente dipendente i dettagli di implementazione del VM si stavano costruendo il meccanismo per.

Qui ci sono diversi motivi per cui questo non avviene:

  1. In-core rappresentazione non è generalmente portabile su architetture. Se fossi l'invio di un "oggetto" da una macchina virtuale su un sistema SPARC per una macchina virtuale su una macchina x86 senza la conoscenza della sua struttura, l'oggetto sembra corrotto sul lato opposto.

  2. L'oggetto non esisterà neccesarily nella stessa posizione di memoria su entrambe le macchine, dovranno essere ricucito dopo aver raggiunto il secondo VM puntatori così interne dell'oggetto. Anche questo richiede la conoscenza interna della struttura dell'oggetto.

  3. L'oggetto contiene probabilmente riferimenti ad altri oggetti, la copia in tal modo un mezzo oggetto copia di un albero di oggetti, e in genere non un albero aciclica sia. Si finisce per costruire il codice che sembra un sacco come una biblioteca serializzazione al fine di fare questo in modo affidabile.

  4. Oggetti spesso aggrapparsi alle risorse autoctone (come handle di file e prese) che non possono essere trasmessi in modo affidabile attraverso le macchine.

  5. In molte macchine virtuali, v'è una distinzione tra i dati (l'oggetto che si sta cercando di copiare) e metadati (ad esempio, la classe dell'oggetto che si sta cercando di copiare). In questi tipi di macchine virtuali, anche se si potrebbe copiare l'oggetto bit-per-bit indenne, potrebbe dipendere da una serie di metadati che non esiste, alla fine remoto. Copiare bit bit per metadati è anche difficile, come molte tecniche di attuazione uso VM (quali un pool globale di stringhe internati o codice oggetto memoria mappata) che compongono i dati intrinsecamente non portabile. Si potrebbe anche finire con molto più di quanto si vuole metadati (ad esempio nel .net la più piccola unità di metadati che si possono confezionare ed inviare qualche parte è in genere un assembly).

  6. In-core rappresentazione è generalmente non portabile diverse versioni della stessa VM e non contengono informazioni sulla versione interna che potrebbe essere usata per combinare il backup dei dati.

  7. In-core rappresentazione contiene un sacco di cose (per esempio in linea cache, le informazioni raccolta dei rifiuti), che non hanno bisogno di essere copiati. Copia di questa roba sarebbe uno spreco, e l'informazione potrebbe anche non essere sensibile sul lato opposto.

In sostanza, per fare questo in modo affidabile, si finisce per costruire biblioteca serializzazione più scomodo e inaffidabile del mondo, e l'incremento delle prestazioni della semplice copia della memoria si perdono nel rattoppare le molte cose che vengono rotti quando si esegue la copia ingenuamente.

Così, questi meccanismi tendono a non esistere.

C'è una grande eccezione a questa regola: le macchine virtuali di immagini basata (come molti Smalltalk e auto VM) sono costruiti intorno all'idea che lo stato della macchina virtuale esiste in una "immagine" che può essere copiato, spostato tra le macchine, ecc Questo avviene generalmente a un costo delle prestazioni.

Altri suggerimenti

Perché non usare cPickle. Sarà serializzare dati molto affidabile e molto velocemente quindi è possibile inviare più di un socket, named pipe, mmap, è il nome, tranne che su l'altra estremità si può aspettare di ricomporre in modo affidabile il più a lungo in quanto non ha ottenuto corrotto nel trasferimento e le versioni del modulo pickle non sono enormemente diverse. Naturalmente il modo veramente enterprisey è quello di utilizzare una piattaforma agnostica standard come XML, che vi permetterà di espandere piattaforma di interoperabilità al di là di pitone. So che questo elude la domanda, ma credo che qualcuno che ha contribuito al codice di base interprete Python avrebbe dovuto chiarire che per voi.

Sono certo non v'è alcun modo per fare questo tipo di trasferimento diretto alla memoria nelle API VMware; Non so su altri hypervisor, ma ho ancora un po 'dubbio. VMware ha un modo di spedizione per il ricordo di una intera macchina ad un altro server host (per lo più utilizzando un file di paging), ma nulla che possa estrarre solo un pezzo di memoria da un programma in esecuzione e dare ad un altro - c'è semplicemente troppo coinvolto lì.

Quindi la tua tattica esistente di serializzazione degli oggetti è sicuramente una buona soluzione comune per questa esigenza, e per fortuna i linguaggi di programmazione si sta lavorando con avere buone opzioni ( Python , Java ).

ma mi chiedo se davvero bisogno di avere l'intero oggetto nascosto e ri-creato, o è solo alcuni dei dati inclusi. Se i dati non è eccessiva, si potrebbe utilizzare una sorta di remote Method invocation per inviare un messaggio dalla sorgente VM al ricevitore dicendogli di creare un oggetto con questi dati. In questo caso, si sarebbe serializzare solo i dati necessari, e lasciando che la macchina di destinazione ricostruire l'oggetto nella propria memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top