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

ima*_*ake 3 c linux memory memory-management

我想在多台计算机上共享某些内存区域,即用于C / C ++项目。当计算机B上的某项访问当前位于计算机A上的某个内存区域时,必须将其锁定在A上并发送给B。如果它的唯一Linux兼容,我很好。

先谢谢了

Eri*_*hil 6

对于简单的C / C ++项目,您无法执行此操作。

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

为了使它们在共享内存的不同计算机上的C / C ++程序中显示,您必须编写提供此功能的软件。通常,您需要执行以下操作:

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

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

最重要的是,这在时间上是非常昂贵的:需要异常处理和网络操作的存储到内存的时间是普通存储到内存的时间的数千倍,甚至数十万倍。每当您的进程写入此共享内存时,它们的执行速度就会非常慢。

  • 仅锁定页面可能无法解决同步问题。如果您锁定页面并将更新发送给另一个系统,那么如果另一个系统同时发送更新会怎样?你拒绝吗?那么,另一个系统应该怎么做,因为它已经在本地应用了更新并释放了进程以继续执行? (2认同)

amd*_*mdn 5

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

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

旧页面已损坏

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

反射内存在环形或树形配置中提供低延迟(每跳约一微秒)。