在不同虚拟机之间高效地复制对象

5

我有一种感觉,我要问一个“愚蠢”的问题,但我必须问...

我有两个虚拟机。

我想将一个对象的实例从一个虚拟机复制到另一个虚拟机,

是否可以复制表示此对象的位在VM的堆中,将其发送到另一个VM,以便另一个VM只需在其内存中分配这些位并在其堆栈中添加对该内存插槽的引用...?

目前,为了做到这一点,我们将对象序列化并反序列化,这比仅仅复制实例要低效(计算方面)...解析是计算浪费...

JS序列化示例:每个VM都是V8(JavaScript)的一个实例, 其中一种方法是将对象转换为JSON(JSON.stringify),将其某种方式发送到另一个VM,后者获取字符串并将其转换回对象(例如var myObject = eval('(' + myJSONtext + ')');)..(这里仅举JavaScript的例子,这是某种序列化方式)


这与Java或Python有什么关系? - Katriel
2
Java和Python也可以在虚拟机中执行... - DuduAlul
你的应用程序将在虚拟机内部还是外部运行?如果在其中一个虚拟机内部,则我认为这是不可能的,因为它将完全被隔离。 - Roopesh Shenoy
3个回答

7
暂且不考虑可以轻松将此问题推广到多个虚拟机的幼稚假设。任何试图构建这样一个机制的尝试都会严重依赖于你为其构建机制的虚拟机的实现细节。
以下是几个原因,说明为什么不这样做:
  1. 核心表现形式通常在不同架构之间不可移植。如果我从 SPARC 机器上的 VM 发送一个“对象”到 x86 机器上的 VM,而没有了解它的结构,该对象将在另一端显示为损坏。
  2. 对象在两台计算机上的内存位置可能不相同,因此需要在第二个 VM 中到达后修补对象内部指针。这也需要对对象结构的内部知识。
  3. 对象可能包含对其他对象的引用,因此复制对象意味着复制对象树,通常不是无环树。您最终将构建看起来非常像序列化库的代码,以可靠地执行此操作。
  4. 对象经常持有不能可靠地传输到其他计算机的本机资源(如文件句柄和套接字)。
  5. 在许多 VM 中,数据(您要复制的对象)和元数据(例如,您要复制的对象的类)之间存在区别。在这些类型的 VM 中,即使您可以无损地按位复制对象,它也可能依赖于一堆在远程端不存在的元数据。按位复制元数据也很棘手,因为许多 VM 使用实现技术(例如全局池化字符串或内存映射对象代码),使数据本质上不可移植。您还可能会得到比您想要的更多的元数据(例如,在 .net 中,您可以打包并发送到某个地方的最小元数据单元通常是一个程序集)。
  6. 核心表现形式通常在同一 VM 的不同版本之间不可移植,并且不包含可用于修补数据的内部版本信息。
  7. 核心表现形式包含许多东西(例如内联缓存、垃圾回收信息),不需要复制。复制这些东西是浪费的,而且信息在另一端可能甚至不合理。
基本上,为了可靠地执行此操作,您最终将构建世界上最笨拙和最不可靠的序列化库,并且简单内存复制的性能增益在修补许多在您幼稚地进行复制时被破坏的内容时丧失。
因此,这些机制往往不存在。
有一个巨大的例外:基于映像的虚拟机(例如许多小型语言和自我 VM)是围绕着虚拟机状态存在于可以复制、移动到其他计算机等概念的“映像”中构建的。这通常会带来相当大的性能成本。

2
为什么不使用cpickle?它能够快速可靠地序列化数据,然后你可以通过套接字、命名管道、内存映射等方式发送数据,只要在传输过程中没有损坏并且pickle模块版本不是非常不同,你就可以期望它可靠地重新组装。当然,真正企业级的方法是使用跨平台的标准格式,如XML,它将让你将平台互操作性扩展到Python以外。我知道这绕过了问题,但我认为那些对Python解释器代码库作出了贡献的人会为你澄清这一点。

0
我确信在VMware API中没有直接内存传输的方法;我不知道其他虚拟化软件是否有,但我还是有点怀疑。VMware有一些方法可以将整个机器的内存传输到另一个主机服务器(主要是使用分页文件),但没有办法从运行中的程序中提取一部分内存并将其传递给另一个程序——这里涉及的内容太多了。
因此,您现有的对象序列化策略绝对是满足此需求的好方法,而且幸运的是,您正在使用的编程语言有很好的选项(PythonJava)。

但我在想,你是否真的需要整个对象被隐藏和重新创建,或者只是其中包含了一些数据。如果数据不是过多的话,你可以使用某种远程方法调用来从源VM向接收器发送消息,告诉它使用这些数据创建一个对象。在这种情况下,你只需要序列化必要的数据,让目标机器在自己的内存中重新构建对象。


我非常确定他使用“VM”这个术语时,指的是像Hotspot和V8这样的虚拟机,而不是像VMWare和Xen这样的虚拟机。 - blucz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接