在多台计算机上共享内存?

我想分享多个计算机周围的某些内存区域,即C / C ++项目。 当计算机B上的某些内容访问当前在计算机A上的某个内存区域时,必须将其locking在A上并发送给B.当它唯一的linux可以编译时,我很好。

先谢谢了

你不能为一个简单的C / C ++项目做这个。

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

为了让不同的机器上的C / C ++程序看起来是共享内存的,你必须编写提供这个功能的软件。 通常情况下,你需要做这样的事情:

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

此外,您需要确定如何处理内存一致性:如果两个进程几乎同时写入内存中的相同地址,会发生什么情况? 如果进程A写入到位置X,然后读取位置Y,则几乎在同一时间进程B写入到位置Y并读取X,他们看到了什么? 如果这两个进程看到的数据不可能是一次性写入内存的结果,那么可以吗?

最重要的是,这在时间上是非常昂贵的:存储到内存需要异常处理和网络操作需要数千次,可能几十万次,正常存储到内存。 无论何时写入共享内存,您的进程都将极其慢地执行。

正如评论中指出的,有软件解决方案。 它们使用节点中的处理器中的分页硬件来检测访问,并使用本地网络结构来传播对内存的更改。 一个硬件选择是反射记忆 – 你可以在这里阅读更多关于它的内容:

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

反射内存以环形或树形结构提供低延迟(每跳大约1微秒)。