Java/C+;共享内存IPC的良好替代品+;Linux上的应用程序 我目前在java和C++应用程序间使用共享内存来进行IPC,但寻找更方便的替代方案。

Java/C+;共享内存IPC的良好替代品+;Linux上的应用程序 我目前在java和C++应用程序间使用共享内存来进行IPC,但寻找更方便的替代方案。,java,c++,linux,ipc,shared-memory,Java,C++,Linux,Ipc,Shared Memory,有人能推荐一种性能和速度相同的更好的方法吗 谢谢 这取决于您计划如何让应用程序进行交互。在POSIX环境中,您有管道、共享内存、套接字、信号量和消息队列。请参阅此问题:了解更多信息 您的流程(即客户端/服务器、生产者-消费者等)的交互模型是什么 根据个人经验,我建议您最好选择管道(因为它们只是读取和写入字节的文件)或套接字(因为两种语言都支持它们) 正如米克龙所说,这在很大程度上取决于你在做什么。顺便说一下,没有一个IPC方法具有本机Java绑定,因此您可能必须使用JNI并自己进行绑定,因此所有

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


谢谢

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

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


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

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


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

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


当我将效率抛到窗外时,如果您希望将其提升到下一个级别,您可以将其封装在某种Web服务中。在消费者上使用嵌入式web服务器,以便生产者将其数据提交到。

在用不同语言编写的应用程序之间进行通信的最简单方法是IMHO。有非常好的开源软件。我们使用C++和java。也有像和这样的公司提供技术支持

<>我现在在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可以在线程外和线程内访问,允许您使用它在线程内外传递信息。

我更新了描述,因为“不清楚”分数,希望现在更清楚。只希望移动一些二进制数据-但要尽可能快。我实际上在IPC中使用JNA,它工作正常-但再次,共享内存的普遍不便(剩余的内存段等)是一个杀手。Java支持Unix域套接字吗?为此,您可能需要一个附加库。如果您的数据由几个固定结构组成,则使用消息队列。它们快速且易于使用。如果数据更易变且更像流,则使用命名管道。命名管道与共享内存的速度是否相同或非常接近?命名管道(FIFO)将比共享内存慢,但这并不意味着它们不在应用程序可接受的范围内。由于您有多个编写器和一个读卡器,您现在可能正在进行大量锁定。如果您的数据小于PIPE_BUF(通常约为4k),那么来自各个进程的写入将是原子的,并由操作系统进行管理,这样就可以消除PGM的复杂性。或者,您可以让每个写入程序使用自己的FIFO,并使用类似select()的东西多路复用读卡器。主消费者和几个愚蠢(但高效)的生产者。与共享内存相比,管道或套接字的速度有多快?@SyRenity,相当快。这取决于您锁定的数量和实际使用的锁定方式。另外+1,命名管道很酷。最后一个问题-什么更快?:)命名管道或套接字?我将在您的平台上进行基准测试。性能会随着内核实现的不同而变化。在这种情况下,CORBA会显得有些过分。很容易忘记设置ORB、学习CORBA、IDL等的工作量。对于只想在同一台机器上传递一些数据的人来说,这是一个令人望而生畏的前景,大部分是非结构化的,这在CORBA中有点像PITA。@根据我的经验,学习如何使用CORBA比正确地手动进行跨语言/平台通信更容易。仅仅是为了让所有的marhalling/demarshalling正确,可能是一场噩梦。更不用说所有现成的服务(命名、事件等)。你是认真的吗??眼镜蛇2012年?我相信这是一项很好的技术,它的死是不幸和悲哀的,但它仍然死了。