Linux上用于Java / C ++应用程序的共享内存IPC的良好替代品

时间:2009-05-24 19:33:31

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

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

有人可以建议一个性能和速度相同的更好的方法吗?

谢谢!

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

虽然我将效率从窗口中抛出,但如果你希望将它提升到一个新的水平,你可以将它包装在某种Web服务中。在使用者身上使用嵌入式Web服务器,生产者可以将数据提交给。

答案 3 :(得分:0)

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

答案 4 :(得分:-6)

  

我目前正在使用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可以在线程外部访问,允许您使用它来传递信息进出线程。