首页 > 解决方案 > 在概念层面上,是否有可能在汇编/编译代码层面实现分布式计算?

问题描述

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

好的,所以这涉及到很多概念,而且我对分布式计算和内核/操作系统概念都不是特别熟悉,所以如果这个问题看起来太宽泛或太不集中,请原谅我;我会尽我所能保持在正轨上。

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

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

我想内核将深入参与此类过程的协调,但我最努力实现的是我需要组装成消息的最小信息“包”,以便另一端的计算机网络将能够执行简单的计算,或者如果考虑到 PC 架构的限制,这根本没有意义。

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

标签: assemblydistributedthread-synchronizationmessage-passingcompiled

解决方案


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

fork本质上是创建当前运行进程的完整克隆,因此新进程拥有自己的所有内容副本 - 私有内存、打开的文件描述符、内存映射文件等。这可以在本地提高效率(通过仅在实际更改时按需复制内存),但在远程情况下,您必须实际复制和发送所有内容;至于文件映射和合作,那将是一只坏猫,因为你必须在另一边拥有相同的文件系统(处于相同状态),而对于管道之类的东西,操作系统必须透明地替换他们通过插座或其他东西。这些东西在本地已经很复杂了,远程这将是一场噩梦。

这是必要的,因为在这个级别您几乎丢失了所有高级信息 - 函数主要是一种约定,代码可以随意跳转并随心所欲地做任何事情。即使假设代码遵循一些调用约定,你也无法知道有多少参数,它们的类型,如果输入参数是一个指针,它指向的块的逻辑大小有多大(你会也必须编组)。


OTOH,如果您对“可远程处理”代码的功能设置一些限制,问题就会变得更容易处理。如果我们可以假设:

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

然后可以轻松实施更外科手术的方法 - 并且过去已经以多种方式完成(想想 DCOM)。但这只是您在 OP 中似乎想到的“透明”方式。


推荐阅读