在概念层面上,是否有可能在汇编/编译代码层面上实现分布式计算



这个问题的目的是问是否有可能通过网络发送一些编译过的代码(从普通程序的角度考虑,不一定以任何特殊的方式[例如多线程]或任何特定的范式/语言编写),以便在另一台机器的cpu中进行处理。

好吧,这涉及到很多概念,我对分布式计算和内核/OS概念都不太熟悉,所以如果这个问题看起来太宽泛或太不集中,请原谅我;我会尽我所能保持正轨。

假设我们的代码中有一个函数的汇编代码(指令)。这是一个简单的函数,它取x并通过将1加到x来输出y。我知道在执行级别,CPU需要获取x的值,将其移动到CPU寄存器中,执行加法,然后在最后执行RET指令。

从概念上讲,是否可以通过网络传递指令以及执行所需的任何上下文信息?如果是,需要什么信息?CPU寄存器和指令的初始状态,或者更多信息

我想内核会深入参与这一过程的协调,但我最难意识到的是,我需要将什么信息组合成一条消息,这样网络另一端的计算机就可以执行简单的计算,或者,如果考虑到PC架构的限制,这根本没有意义的话。

有很多关于分布式计算的信息,但大多数人都认为代码是以特定的方式设计的。我对任何已经存在的代码的类似解决方案感兴趣。

您给出的描述非常模糊,所以我推测,但如果目标是"随机获取现有的本地代码并在网络中透明地移动它",那么唯一的可能性就是在整个过程中进行复制,这与Unix衍生操作系统上的fork非常相似,只是新过程要在另一台机器上运行。

fork本质上创建了当前运行进程的完整克隆,因此新进程拥有自己的所有内容的副本——私有内存、打开的文件描述符、内存映射文件&co。这可以在本地变得高效(只在内存实际更改时按需复制内存),但在远程情况下,你必须实际复制并发送所有内容;至于文件映射&co,这将是一只难缠的猫,因为你必须在另一边拥有相同的文件系统(处于相同状态),对于管道之类的东西,操作系统必须用套接字或其他东西透明地替换它们。这些东西在本地已经很复杂了,从远程来看,这将是一场噩梦。

这是必要的,因为在这个级别上,你几乎失去了所有的高级信息——函数大多是一种约定,代码可以在内存中随意跳转。即使假设代码遵循某种调用约定,你也无法知道有多少个参数、它们的类型,如果输入参数是指针,那么它所指向的块的逻辑大小有多大(你也必须封送)。


OTOH,如果你对"可移动"代码的功能设置一些限制,问题就会变得更容易处理。如果我们可以假设:

  • 代码是自包含的(没有随机跳转,可能都打包在共享对象/dll中),并且可重定位/位置无关
  • 未使用全局状态(包括打开的文件/套接字)
  • 这些可再操作函数的参数为运行时所知,如中所示,它知道如何序列化/反序列化它们

然后可以很容易地实施更外科手术的方法,并且在过去已经以多种方式进行了(想想DCOM)。但这几乎是你在OP.中想到的"透明"方式

https://en.wikipedia.org/wiki/OpenMosixdod:透明地将进程迁移到其他集群节点,使集群的行为有点像一个具有多个核心的单个系统。(2008年停止开发)。

它的工作方式是挂起一个进程,并通过网络将其所有映射的内存发送到另一个节点,在那里运行。它有一种在主节点上运行系统调用的机制,因此整个过程不必仅为此迁移回,例如复制读或写系统调用中涉及的内存。

所有这些对项目来说都是完全透明的;它允许您在集群上轻松运行单线程程序,而不需要像网格引擎这样的集群作业调度程序。但这并不能帮助多线程程序同时利用多个节点中的CPU。它太粗了。(这也是OpenMosix被放弃的主要原因之一。)

最新更新