添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
任性的火车  ·  WebApi:在ApiController之 ...·  1 年前    · 
力能扛鼎的路灯  ·  java iso8601 ...·  1 年前    · 
帅气的瀑布  ·  SQL Server:在UPDATE ...·  1 年前    · 

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

10 人关注

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

谁能提供一个更好的、具有相同性能和速度的方法?

1 个评论
由于 "不清楚 "的分数,我更新了描述,希望现在更清楚。
java
c++
linux
ipc
shared-memory
SyRenity
SyRenity
发布于 2009-05-25
5 个回答
mikelong
mikelong
发布于 2012-04-10
已采纳
0 人赞同

这取决于你打算让你的应用程序如何互动。 在POSIX环境中,你有管道、共享内存、套接字、semaphores和消息队列。 请看这个问题。 比较unix linux IPC 欲了解更多信息。

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

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

主要消费者和几个哑巴(但效率很高)生产商。
与共享内存相比,管道或套接字的速度如何?
@SyRenity ,相当快。这取决于你锁定了多少,以及你使用什么锁定,真的。另外,+1,命名的管道是很酷的。
最后一个问题--什么更快?)命名的管道还是套接字?
我将在你的平台上做一个基准测试。 性能将随内核的实现而变化。
Zifre
Zifre
发布于 2012-04-10
0 人赞同

正如mikelong所说,这在很大程度上取决于你在做什么。据我所知,所有的IPC方法都没有本地的Java绑定,所以你可能不得不使用JNI并自己制作绑定,所以所有不同的方法的难度大致相同。如果你要做消息传递,我强烈建议使用消息队列。它们非常容易使用(一旦你有了绑定),并且具有良好的性能。如果你需要 "共享 "一些资源,那么你可能想坚持使用共享内存。

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

只想移动一些二进制数据--但要尽可能快。
实际上,我正在使用JNA进行IPC,它工作得很好--但同样,共享内存的普遍不便(剩余的段,等等...)是一个杀手。
Duck
Java是否支持Unix域套接字? 你可能需要一个附加的lib来实现这个功能。 如果你的数据由一些固定的结构组成,就用消息队列。 它们既快又容易使用。 如果数据更多的是可变的和流式的,那么就用命名的管道。
命名管道是否与共享内存有相同或非常接近的速度?
Duck
命名管道(fifos)会比共享内存慢,但这并不意味着它们不在你的应用程序可容忍的范围内。 由于你有多个写入器和一个读取器,你现在可能正在做大量的锁定。 如果你的数据少于PIPE_BUF(通常是4k左右),那么你的各个进程的写操作将是原子的,并由操作系统管理,这样就可以从你的pgms中去除复杂性。 另外,你可以让每个写者使用它自己的FIFO,用类似select()的东西复用你的读者。
monceaux
monceaux
发布于 2012-04-10
0 人赞同

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

当我把效率抛出窗外时,如果你想把它提高到一个新的水平,你也许可以把它包在某种网络服务中。 在消费者身上使用一个嵌入式网络服务器,让生产者提交他们的数据。

lothar
lothar
发布于 2012-04-10
0 人赞同

在用不同语言编写的应用程序之间进行通信的最简单方法是IMHO CORBA .有非常好的开放源码 CORBA ORBs out there. We use TAO 为C++和 JacORB 为Java。也有一些公司,如 OCI Remedy 提供技术支持。

Duck
在这种情况下,CORBA 将是矫枉过正的 IMO。 我们很容易忘记在设置 ORB、学习 CORBA、IDL 等方面要做多少工作。 对于那些只想在同一台机器上传递一些数据的人来说,这是一个令人生畏的前景,其中大部分是非结构化的,这在 CORBA 中是一个有点麻烦的。
@Duck 根据我的经验,学习如何使用 CORBA 比手动正确地进行跨语言/平台通信更容易。仅仅获得所有的 marhalling/demarshalling 的权利就会是一场噩梦。更不用说所有漂亮的服务(命名,事件,......),人们可以使用开箱即用。
MK.
你是认真的吗?COBRA?在2012年? 我确信这是一项不错的技术,它的死亡是不幸和悲哀的,但它仍然是死亡。
zjagannatha
zjagannatha
发布于 2012-04-10
0 人赞同

我目前在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);