【问题标题】:Good alternative to shared memory IPC for Java/C++ apps on LinuxLinux 上 Java/C++ 应用程序共享内存 IPC 的良好替代品
【发布时间】:2010-10-28 14:48:37
【问题描述】:

我目前在 Java 和 C++ 应用程序之间为 IPC 使用共享内存,但正在寻找更方便的替代方案。

有人可以推荐一种性能和速度相同的更好方法吗?

谢谢!

【问题讨论】:

  • 我更新了描述因为“不清晰”的分数,希望现在更清楚了。

标签: java c++ linux ipc shared-memory


【解决方案1】:

这取决于您计划如何让应用交互。在 POSIX 环境中,您拥有管道、共享内存、套接字、信号量和消息队列。请参阅此问题:Comparing unix linux IPC 了解更多信息。

您的流程(即客户端/服务器、生产者-消费者等)的交互模型是什么?

根据个人经验,我建议您最好的选择是管道(因为它们只是用于读取和写入字节的文件)或套接字(因为两种语言都支持它们)。

【讨论】:

  • 主要消费者和几个愚蠢(但高效)的生产者。
  • 与共享内存相比,管道或套接字有多快?
  • @SyRenity ,非常快。取决于您锁定多少以及您真正使用的锁定。另外+1,命名管道很酷。
  • 最后一个问题 - 什么更快? :) 命名管道或套接字?
  • 我会在你的平台上做一个基准测试。性能会因内核实现而异。
【解决方案2】:

正如 mikelong 所说,这在很大程度上取决于您在做什么。 AFAIK,没有一个 IPC 方法具有本机 Java 绑定,因此您可能必须使用 JNI 并自己进行绑定,因此所有不同的方法大致同样困难。如果你正在做消息传递,我强烈建议使用消息队列。它们非常易于使用(一旦您拥有绑定),并且具有良好的性能。如果您需要“共享”某些资源,那么您可能希望坚持使用共享内存。

听起来您有某种客户端/服务器的东西,我会说使用消息队列、unix 域套接字或命名管道。它们都涉及在内核中复制数据,因此它们不如共享内存快,但它们仍然非常快。如果您有类似消息的数据(单个小数据包),请使用消息队列。这可能是最干净的解决方案。如果您有更多的数据流,请使用管道或套接字。套接字的优点是您可以在以后轻松地使其成为网络透明(如 X11),但它们比管道更难使用。性能可能非常相似。

【讨论】:

  • 只希望移动一些二进制数据 - 但要尽可能快。
  • 我实际上正在使用 JNA 进行 IPC,它工作正常 - 但同样,共享内存的一般不便(剩余的段等)是一个杀手。
  • Java 是否支持 Unix 域套接字?您可能需要一个附加库。如果您的数据由一些固定结构组成,请使用消息队列。它们快速且易于使用。如果数据更具可变性和流式,则使用命名管道。
  • 命名管道与共享内存的速度是否相同或非常接近?
  • 命名管道 (fifos) 将比共享内存慢,但这并不意味着它们不在您的应用程序可容忍的范围内。由于您有多个作家和一个读者,您现在可能正在做很多锁定。如果您的数据小于 PIPE_BUF(通常约为 4k),那么来自各种进程的写入将是原子的并由操作系统管理,以便从您的 pgms 中消除复杂性。或者,您可以让每个编写器使用自己的 FIFO,并使用 select() 之类的东西多路复用您的阅读器。
【解决方案3】:

虽然可能不是最有效的,Java 只支持开箱即用的套接字(我记得最好的)。它们非常灵活,只是可能不如其他选项快。正如 Zifre 提到的,它为您提供了网络透明性以及语言/绑定透明性的机会;因为现在几乎每种语言都支持开箱即用的套接字库。

虽然我将效率抛到了窗外,但如果您希望将其提升到一个新的水平,您可以将其包装在某种 Web 服务中。在消费者上使用嵌入式 Web 服务器,让生产者向其提交数据。

【讨论】:

    【解决方案4】:

    在用不同语言编写的应用程序之间进行通信的最简单方法是恕我直言CORBA。那里有非常好的开源CORBA ORBs。我们对 C++ 使用 TAO,对 Java 使用 JacORB。还有像OCIRemedy这样的公司提供技术支持。

    【讨论】:

    • CORBA 在这种情况下 IMO 将是矫枉过正。很容易忘记设置 ORB、学习 CORBA、IDL 等需要做多少工作。对于只想在同一台机器上传递一些数据的人来说,这是一个令人生畏的前景,其中大部分是非结构化的,有点像 PITA在 CORBA 中。
    • @Duck 根据我的经验,学习如何使用 CORBA 比手动正确地进行跨语言/平台通信更容易。仅仅为了让所有的编组/解组正确可能是一场噩梦。更不用说开箱即用的所有优质服务(命名、事件......)。
    • 你是认真的吗??眼镜蛇?在2012年?我确信这是一项不错的技术,它已死的事实令人遗憾和悲伤,但它仍然死了。
    【解决方案5】:

    我目前在 Java 和 C++ 应用程序之间为 IPC 使用共享内存, 但正在寻找更方便的选择。

    有人可以建议更好的方法,但性能速度相同吗?

    对于简单的共享内存,您甚至不需要特殊的库:

    class Main {
        private static class CustomThread extends Thread {
            public int x = 0;
            public void run() {
                x = 5;
            }
        }
    
        public static void main(String[] args) {
    
            CustomThread t = new CustomThread();
            t.start();
    
            System.out.println(t.x);
            System.out.println(t.x);
        }
    }
    

    局部变量 x 可以在线程外和线程内访问,允许您使用它来将信息传入和传出线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多