2012-08-10 289 views
3

我想共享多台计算机的某些内存区域,即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 2012-08-10 13:06:08

+2

阅读在RDMA上:http://en.wikipedia。org/wiki/Remote_direct_memory_access – 2012-08-10 13:11:23

回答

3

有软件解决方案,在评论中指出的。它们使用节点中的处理器中的分页硬件来检测访问,并使用本地网络结构来传播对内存的更改。一个硬件替代方案是反射内存 - 你可以进一步了解它的位置:

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

反射内存在任何一个环或树结构提供低等待时间(每跳约一微秒)。

4

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

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

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

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

此外,您需要确定如何处理内存一致性:如果两个进程几乎同时写入内存中的相同地址,会发生什么情况?如果进程A写入位置X然后读取位置Y,则几乎在同一时间进程B写入位置Y并读取X,他们看到了什么?如果两个进程看到的数据不可能是单次写入内存的结果,那么可以吗?除此之外,这在时间上非常昂贵:存储到内存需要异常处理和网络操作需要数千次,可能数十万次,正常存储到内存。无论何时写入共享内存,您的进程都会慢慢地执行。

+0

这正是我想要做的。你知道更多关于编写我自己的内核扩展吗? 另外,我也想通过网络发送代码,以便正在操作的代码和数据将在同一台计算机上,而且会很快。结果将仅被共享。它关于可能性。 您在syncronisation中看到的问题对我来说很奇怪。在发送之前锁定页面? – imacake 2012-08-10 13:52:31

+1

这些都是复杂的问题,需要大量的学习和工作。我只能推荐先分别学习每件作品。如何将系统中的页面更改为只读?你如何创建具有两组不同虚拟地址的地图到同一个内存?你如何编写一个信号处理程序?你如何解码导致异常的指令?你如何通过网络发送消息? – 2012-08-10 14:12:56

+1

简单地锁定页面可能不是同步问题的解决方案。如果您锁定页面并向其他系统发送更新,如果其他系统同时发送更新会发生什么情况?你拒绝吗?那么其他系统应该做什么,因为它已经在本地应用了它的更新并释放了进程以继续执行? – 2012-08-10 14:14:29