跨多台计算机共享内存?

4
我希望能够在多台计算机之间共享特定的内存区域,也就是针对 C/C++ 项目。当计算机 B 访问当前位于计算机 A 上的某个内存区域时,必须在 A 上将其锁定并发送到 B。如果仅限于 Linux 兼容性,那我很满意。
谢谢! :D

1
你应该首先了解一个叫做分布式共享内存的主题(即 https://www.google.com/search?q=distributed+shared+memory&sugexp=chrome,mod=4&sourceid=chrome&ie=UTF-8)。 - RageD
3
了解RDMA:http://en.wikipedia.org/wiki/Remote_direct_memory_access - Nikolai Fetissov
2个回答

6

对于简单的C/C++项目,您无法这样做。

通常计算机硬件没有直接支持此功能的物理属性:一个系统上的内存不能被另一个系统读取。

为了使不同机器上的C/C++程序看起来像是共享内存,您需要编写提供此功能的软件。通常,您需要执行以下操作:

  1. 在虚拟内存地址空间(每个进程)中分配一些页。
  2. 将这些页面标记为只读。
  3. 设置处理程序以接收当进程尝试向只读内存写入时发生的异常。(此处理程序可能在操作系统中作为某种内核扩展,也可能是您进程中的信号处理程序。)
  4. 当收到异常时,确定进程尝试写入内存的内容。通过使用虚拟内存中的单独映射将其写入页面中(可能通过将其写入到与此额外映射相同的物理内存中,并将此额外映射标记为可写)。
  5. 通过网络通信向另一台机器发送消息,告诉它内存已更改。
  6. 在写入内存的指令后,在进程中恢复执行。

此外,您还需要确定如何处理内存一致性:如果两个进程几乎同时写入内存中的同一地址,会发生什么?如果进程A将X位置写入,然后读取Y位置,而几乎在同一时间,进程B将Y位置写入并读取X位置,他们会看到什么?如果两个进程看到不可能是单个时间序列对内存的写入结果的数据,这是否可以接受?

最重要的是,这需要大量的时间支出:需要进行异常处理和网络操作的内存存储需要比正常内存存储花费多很多,可能高达数千次或数十万次。每当进程写入此共享内存时,您的进程将非常缓慢地执行。


这正是我想做的。你知道关于编写自己的内核扩展还有什么更多的信息吗? 此外,我也想通过网络发送代码,这样操作的代码和数据将在同一台计算机上,并且速度会很快。结果只会被共享。这是关于可能性的问题。 我觉得你所看到的同步问题很奇怪。在发送之前只需锁定页面即可。 - imacake
1
这些都是复杂的问题,需要大量的学习和工作。我只能建议先分别了解每个部分。如何将系统页面更改为只读?如何创建具有两个不同虚拟地址集的映射到同一内存的地图?如何编写信号处理程序?如何解码导致异常的指令?如何通过网络发送消息? - Eric Postpischil
2
仅仅锁定页面可能不是解决同步问题的方法。如果您锁定页面并向其他系统发送更新,那么如果另一个系统同时发送更新会发生什么?您会拒绝它吗?那么另一个系统应该怎么做呢?因为它已经在本地应用了更新并释放了进程以继续执行。 - Eric Postpischil
1
你知道有没有类似的系统适用于Linux来完成这个任务?我已经在这里查看了http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html,我觉得这不是一个太难的工作,只是需要时间(太多时间)。 - imacake
1
由于需要进行大量工作,我无法提供进一步的帮助,并且认为,在没有强烈理由的情况下,阻止您继续追求这个目标是最好的行动方针。任何实际问题都可能有更好的解决方案。 - Eric Postpischil
这是一个C++编译器的问题。CPU以完全相同的方式远程访问内存,但C++是为此构建的,而不是为其他远程通信构建的。 - Ryan Brown

5

正如评论中所提到的,有软件解决方案。这些解决方案利用节点处理器中的分页硬件来检测访问,并使用本地网络结构传播内存更改。另一种硬件替代方案是反射性内存 - 您可以在此处阅读更多信息:

https://en.wikipedia.org/wiki/Reflective_memory http://www.ecrin.com/embedded/downloads/reflectiveMemory.pdf

旧页面已损坏

http://www.dolphinics.com/solutions/embedded-system-reflective-memory.html

反射式内存提供低延迟(每个跳一微秒左右)的环形或树形配置。


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