C ++和Java之间的低延迟IPC

 2023-01-19    378  

问题描述

在以下情况下实现C ++/Java IPC的最佳方法是什么?

(最近有人问A 类似的问题,但我的要求更多具体)

C ++和Java之间的低延迟IPC

  1. 我有两个程序 – 一个用C ++写的程序,另一个用Java编写 – 需要相互交流.两者都在同一台计算机上运行.

  2. 程序相互发送消息.消息通常很短(少于几百个字节),但可能是100kb或更大的.

  3. 不需要确认消息(即,不是像HTTP这样的请求/响应模型).例如,C ++程序将消息发送给Java程序,Java程序可以通过以后将消息发送给C ++程序来回复 – 反之亦然.

  4. 理想的解决方案将具有a)非常低的延迟,b)没有安全麻烦(用户不必授权打开端口./li>

我的第一个想法是使用套接字 – 每个程序将充当另一个程序.插座比其他形式的IPC具有更多的开销,如果我让系统自动分配端口号,我不知道服务器如何将端口号告知客户端.我还考虑了命名的管道,但是在不同平台上不支持(至少不始终如一). jni 看起来像是一个选择,但是它可以交叉过程界限吗?

有什么建议?

谢谢!

后续问题

  1. 如果我使用插座,我是否需要打开两个两个插座以允许如上所述进行异步通信?

推荐答案

我建议您使用 tcp插座.

与其他任务的应用程序的工作量相比,TCP插座的实际开销非常低,至少是我用来开发的应用程序.我的意思是,有时,即使插座的潜伏期是其他IPC机制的延迟的两倍,在整体工作流程中,它们的影响很小.它为您节省了在Java应用程序和C ++之间制作IPC的麻烦,最终将要求您使用使用JNI的特定Java库,其中JNI的开销和库本身之一.

.

我实际上在我的Java应用程序中测量了垃圾收集器的影响要比” loopback ” TCP插座引起的延迟更为重要.

此外,与传统IPC相比,TCP插座更可扩展(和便携式!).如果将来您必须在不同的机器上运行客户端和服务器怎么办?在” TCP插座”方案中,您必须在”传统IPC”方案中进行5分钟的黑客攻击,您必须重写整个IPC.

但是,您的应用程序的一般工作流程是什么?

即使不需要确认,我建议使用TCP(而不是UDP)来避免未分类的交付(这会导致您收到的东西重新排列时的屁股疼痛 – 您的某些消息是100KB,这不适合UDP数据包).

回答您的最后一个问题,供服务器告知客户端端口有关,您只需使服务器使用特定的”端口”命令行参数启动客户端,或者使服务器在/下保存一个小文件. TMP(或另一个临时目录),内部写了端口号.

其他推荐答案

我听说过关于 Zeromq 的好消息.在某些情况下,它甚至比TCP更快.简而言之,尝试一下不会有任何伤害.

其他推荐答案

另一种替代方法是使用内存映射的文件,并通过检查编译器设置是否为POSIX,并将其存放. Posix OS具有mmap(),在Windows中,您将使用CreateFileMapping()

在Boost库中是C ++的便携式实现,在Java中,您应该能够使用FileChannel().

此页面很好地解释了如何将其用于IPC .wikipedia.org/wiki/memory-mapped_file

以上所述是小编给大家介绍的C ++和Java之间的低延迟IPC,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25775.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。