【问题标题】:communicate btw 2 pc's using shared memory?使用共享内存在两台电脑之间进行通信?
【发布时间】:2009-04-22 18:32:32
【问题描述】:

我必须建立一个概念,以便使用共享内存或 tcp 套接字编程概念在两台计算机之间进行通信。我该怎么做?是否可以在客户端服务器架构中实现共享内存?我该怎么做?

【问题讨论】:

    标签: sockets shared-memory


    【解决方案1】:

    您无法使用共享内存在两台计算机之间进行通信,因为它们不共享内存。

    您应该使用 TCP 套接字。

    【讨论】:

    • 你可以在闪存棒上做到这一点:)
    • 我感觉 mayank 知道开箱即用的两台计算机不共享内存 - “是否有可能在客户端服务器架构中实现共享内存?我该怎么做?”答案是“是的,有可能,查找分布式共享内存”
    • 分布式共享内存比套接字更难(也更慢)。
    • 这是一个非常广泛的说法,不是吗? gemstone 和 gigaspaces 等产品是建立在 UDP / TCP 之上的分布式缓存,它不是非此即彼的东西。
    • 请谨慎回答,在我的直觉中,mayank 一定知道你在说什么......他问的方式可能是错误的
    【解决方案2】:

    CAN与具有共享内存的远程系统通信。 远程 DMA 是较新的高性能网络接口控制器卡(NIC )。

    这是一篇评估10 Gb ethernet RDMA 性能的论文。我知道 infinaband 也可以 RDMA,其他可能。 802.11 XXX出来了不是很好吗?无线 RDMA? :)

    【讨论】:

    【解决方案3】:

    我认为您正在寻找的不是共享内存,而是更恰当地称为“反射内存”。

    使用反射内存块,网络上的每台计算机都拥有一块内存。每个块都以高速在所有计算机之间的总线上运行。每台计算机从所有其他计算机获取内存副本以供读取,但通常只能写入自己的内存。

    因此,每台计算机都可以“看到”其他计算机的内存状态。通常,您会在工业控制系统中看到这种架构,将控制权分布在物理上独立的机器上,并希望近乎实时地查看整体状态。

    至于构建系统,您可以从 UDP 数据包开始,这些数据包会破坏本地计算机的状态,并让所有其他计算机读取该数据。

    【讨论】:

      【解决方案4】:

      尖刻的回答“你不能这样做,因为计算机不共享内存”是完全错误的。 单台计算机中的处理器不共享内存,硬件和软件实现共享内存协议以提供共享内存的假象。

      处理器之间的共享内存协议与计算机之间的共享内存协议非常相似,这是同样的问题。

      搜索“分布式缓存”“元组空间”和"distributed shared memory" 可能会提供一些思考。 memcached 是一个非常流行的开源产品,你可以看看。

      编辑:关于“缓存一致性架构”的评论。每个处理器都有自己的本地内存缓存(例如 L1 缓存)。有一大堆“东西”恰好使这个“缓存连贯”,因此看起来每个处理器都在读取和写入共享内存空间。处理器绝对不会直接写入单个共享内存空间。跨计算机共享内存的问题在概念上是相同的。

      【讨论】:

      • 这是不正确的。在缓存一致性架构(如 x86)上,同一台计算机上的处理器确实共享内存。
      • 每个处理器的缓存。处理器仍然共享主内存并从同一内存位置填充 L1 缓存。
      • 不仅如此,较新的 Intel 处理器还具有共享的 L3 缓存。
      • 正确的,每个处理器的缓存。因此,处理器严格读取和写入 L1 缓存,并且有一个一致性协议,该协议通过共享总线定期发送消息以使本地缓存与共享缓存同步。 这是分布式共享内存
      • @Blank:他的意思是当他们有 L1 缓存时,他们不会因为日期被提取到缓存中的故障
      【解决方案5】:

      您可能想研究memcached 之类的东西,一个分布式内存对象缓存系统。

      当然,这仍然是通过 TCP 完成的。

      【讨论】:

        【解决方案6】:

        【讨论】: