跨多台计算机共享内存?

时间:2012-08-10 13:03:59

标签: c linux memory memory-management

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

提前致谢:D

2 个答案:

答案 0 :(得分:5)

对于简单的C / C ++项目,你不能这样做。

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

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

  1. 在虚拟内存地址空间(每个进程)中分配一些页面。
  2. 将这些页面标记为只读。
  3. 设置处理程序以接收进程尝试写入只读内存时发生的异常。 (此处理程序可能在操作系统中,作为某种内核扩展,或者它可能是您进程中的信号处理程序。)
  4. 收到异常时,确定进程尝试写入内存的内容。将其写入页面(可能通过将其通过虚拟内存中的单独映射写入相同的物理内存,并将此额外映射标记为可写)。
  5. 通过网络通信向另一台机器发送消息,告知内存已更改。
  6. 在写入内存的指令后继续执行。
  7. 此外,您需要确定如何处理内存一致性:如果两个进程几乎同时写入内存中的同一地址,会发生什么?如果进程A写入位置X然后读取位置Y,而几乎同时,进程B写入位置Y并读取X,他们看到了什么?如果两个进程看到的数据不可能是单个时间内存写入序列的结果,那还可以吗?

    最重要的是,这在时间上非常昂贵:存储需要异常处理和网络操作的内存需要数千倍,可能是正常存储到内存的数十万倍。每当他们写入这个共享内存时,你的进程都会以极其缓慢的速度执行。

答案 1 :(得分:3)

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

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

Old page was broken

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

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