assembly - 在概念层面上,是否有可能在汇编/编译代码层面实现分布式计算?
问题描述
这个问题的目的是询问是否有可能通过发送一些已编译的代码(考虑一个普通程序,不一定以任何特殊方式[例如多线程]或任何特定范式/语言编写)网络以某种方式在位于另一台机器上的 cpu 中进行处理。
好的,所以这涉及到很多概念,而且我对分布式计算和内核/操作系统概念都不是特别熟悉,所以如果这个问题看起来太宽泛或太不集中,请原谅我;我会尽我所能保持在正轨上。
假设我们的代码中有一个函数的汇编代码(指令)。这是一个简单的函数,通过将 x 加 1 来获取 x 并输出 y。我知道在执行级别,CPU 需要获取 x 的值,将其移动到 CPU 寄存器中,执行加法,然后在最后执行 RET 指令。
从概念上讲,是否有可能通过网络传递指令以及执行所需的任何上下文信息?如果是这样,什么是必要的信息?CPU 寄存器和指令的初始状态,甚至更多信息?
我想内核将深入参与此类过程的协调,但我最努力实现的是我需要组装成消息的最小信息“包”,以便另一端的计算机网络将能够执行简单的计算,或者如果考虑到 PC 架构的限制,这根本没有意义。
那里有很多关于分布式计算的信息,但大多数人认为代码是以特定方式设计的。我对任何已经存在的代码的类似解决方案感兴趣。
解决方案
您给出的描述非常模糊,所以我在推测,但如果目标是“随机获取现有的本机代码并透明地在网络中移动”,唯一的可能性是复制整个过程,这与fork
在 Unix 派生的操作系统上 - 除了新进程将在另一台机器上运行。
fork
本质上是创建当前运行进程的完整克隆,因此新进程拥有自己的所有内容副本 - 私有内存、打开的文件描述符、内存映射文件等。这可以在本地提高效率(通过仅在实际更改时按需复制内存),但在远程情况下,您必须实际复制和发送所有内容;至于文件映射和合作,那将是一只坏猫,因为你必须在另一边拥有相同的文件系统(处于相同状态),而对于管道之类的东西,操作系统必须透明地替换他们通过插座或其他东西。这些东西在本地已经很复杂了,远程这将是一场噩梦。
这是必要的,因为在这个级别您几乎丢失了所有高级信息 - 函数主要是一种约定,代码可以随意跳转并随心所欲地做任何事情。即使假设代码遵循一些调用约定,你也无法知道有多少参数,它们的类型,如果输入参数是一个指针,它指向的块的逻辑大小有多大(你会也必须编组)。
OTOH,如果您对“可远程处理”代码的功能设置一些限制,问题就会变得更容易处理。如果我们可以假设:
- 代码是自包含的(没有随机跳转,可能全部打包在共享对象/dll中)并且可重定位/位置无关;
- 没有使用全局状态(包括打开的文件/套接字)
- 运行时知道这些可远程处理函数的参数,例如,它知道如何序列化/反序列化它们
然后可以轻松实施更外科手术的方法 - 并且过去已经以多种方式完成(想想 DCOM)。但这只是您在 OP 中似乎想到的“透明”方式。
推荐阅读
- javascript - 正则表达式替换(外部)两个标签之间的文本
- python - 函数内部不允许堆栈 python #pragma GCC 诊断
- javascript - Keypress 事件 keyCode 适用于空格键,但不适用于字母 F
- swift - 在 swift 5.1 中获取文本字段输入并将其插入到选择器中
- ruby-on-rails - Rails:仅为前端设置语句超时(不适用于 Sidekiq)
- sql - SQL - 如何创建透视表和现有表的视图
- c++ - 我应该为库中的类型提供 ostream << 运算符吗?
- reactjs - 从外部链接反应路由
- c# - 由文本文件组成的数组的“插入排序”
- java - Recyclerview不可点击的android studio(可能是我的代码错误?)