【发布时间】:2020-04-23 01:46:35
【问题描述】:
这个问题的目的是询问是否有可能有一些已编译的代码(从普通程序的角度考虑,不一定以任何特殊的方式[例如多线程]或任何特定的范例/语言编写)通过网络发送,以某种方式在另一台机器上的 cpu 中进行处理。
好的,所以这涉及到很多概念,我对分布式计算和内核/操作系统概念都不是特别熟悉,如果这个问题看起来太宽泛或太不集中,请原谅我;我会尽我所能保持在正轨上。
假设我们的代码中有一个函数的汇编代码(指令)。这是一个简单的函数,通过将 x 加 1 来获取 x 并输出 y。我知道在执行层面,CPU需要获取x的值,将其移入CPU寄存器,执行加法,最后执行RET指令。
从概念上讲,是否有可能通过网络传递指令以及执行所需的任何上下文信息?如果是这样,什么是必要的信息? CPU寄存器和指令的初始状态,甚至更多信息?
我猜内核将深入参与此类过程的协调,但我最难以意识到的是,我需要将信息的最小“包”组装成一条消息,以便计算机在网络的另一端将能够执行简单的计算,或者如果考虑到 PC 架构的限制,这根本没有意义。
那里有很多关于分布式计算的信息,但大多数人认为代码是以特定方式设计的。我对任何已经存在的代码的类似解决方案感兴趣。
【问题讨论】:
-
甚至试图回答这个问题都非常复杂,因为它非常模糊......我们是在谈论将单个函数移动到其他地方运行吗?这是当前正在运行的功能吗?或者我们想要透明地编组一个函数调用,以便它在其他地方运行?函数调用之后,是控制流返回到原来的机器,还是流程应该在新机器上继续?那么应该如何处理多个线程呢?这个函数是否应该是纯函数? IO应该如何工作?我们在谈论什么架构? x86 上的普通 Linux?微型?
-
如果您知道目标操作系统和架构,您可以在运行时编译一个动态库(Windows 为 dll,Linux 为 dylib,osx 为 dylib)导出具有特定导出名称和原型的函数,例如
int __cdecl compute(int x)。将该 DLL 发送到服务器。在服务器上,加载 DLL 并调用该函数。 -
这个问题太宽泛了,但是很有可能。最小是什么在很大程度上取决于代码,您需要知道目标,x86 不足通常需要更多细节,很可能是操作系统、版本、内核版本(如果适用)等库依赖项。几乎所有你需要在你的机器上运行的东西,你需要知道在远程机器上运行加上更多,因为理想情况下,你的机器上的二进制文件不会在没有安装程序或构建依赖项测试的情况下创建/安装。
-
在 linux 上,您可以使用包管理系统根据应用程序的依赖项来发现其中的内容。
-
或者使用与目标无关的语言,java,python等,那么你只需要知道解释器/虚拟机是否在那里。
标签: assembly distributed thread-synchronization message-passing compiled