3

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

先谢谢了

4

2 回答 2

6

您不能对简单的 C/C++ 项目执行此操作。

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

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

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

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

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

于 2012-08-10T13:49:35.520 回答
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

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

于 2012-08-10T13:38:35.287 回答