Java 和 C/C++ 之间进程间通信的最快(低延迟)方法

2024-04-20

我有一个Java应用程序,通过TCP套接字连接到用C/C++开发的“服务器”。

应用程序和服务器都在同一台机器(Solaris 机器)上运行(但我们最终正在考虑迁移到 Linux)。 交换的数据类型是简单消息(登录、登录ACK,然后客户端请求某些内容,服务器回复)。每条消息的长度约为 300 字节。

目前我们正在使用套接字,一切都很好,但是我正在寻找一种更快的方式来交换数据(更低的延迟),使用 IPC 方法。

我一直在研究网络并提出了以下技术的参考:

  • 共享内存
  • pipes
  • queues
  • 以及所谓的 DMA(直接内存访问)

但我找不到对它们各自性能的正确分析,也找不到如何在 JAVA 和 C/C++ 中实现它们(以便它们可以互相交谈),除了我可以想象如何做的管道。

任何人都可以评论这种情况下每种方法的性能和可行性吗? 任何有用的实现信息的指针/链接?


编辑/更新

根据我在这里得到的评论和答案,我找到了有关 Unix 域套接字的信息,它似乎是在管道上构建的,并且可以节省我整个 TCP 堆栈。 它是特定于平台的,所以我计划使用 JNI 或其中之一来测试它juds http://code.google.com/p/juds/ or 朱尼克斯插座 http://code.google.com/p/junixsocket/.

下一个可能的步骤是直接实现管道,然后共享内存,尽管我已经被警告过额外的复杂性......


感谢您的帮助


刚刚在我的 Corei5 2.8GHz 上测试了 Java 的延迟,仅发送/接收单字节, 刚刚生成了 2 个 Java 进程,未使用任务集分配特定的 CPU 核心:

TCP         - 25 microseconds
Named pipes - 15 microseconds

现在明确指定核心掩码,例如任务集 1 java Srv or 任务集 2 java CLI:

TCP, same cores:                      30 microseconds
TCP, explicit different cores:        22 microseconds
Named pipes, same core:               4-5 microseconds !!!!
Named pipes, taskset different cores: 7-8 microseconds !!!!

so

TCP overhead is visible
scheduling overhead (or core caches?) is also the culprit

同时 Thread.sleep(0) (如 strace 所示,导致执行单个 sched_yield() Linux 内核调用)需要 0.3 微秒 - 因此调度到单核的命名管道仍然有很大的开销

一些共享内存测量:2009 年 9 月 14 日 – Solace Systems 今天宣布,其统一消息平台 API 使用共享内存传输可以实现低于 700 纳秒的平均延迟。 http://solacesystems.com/news/fastest-ipc-messaging/ http://solacesystems.com/news/fastest-ipc-messaging/

附: - 第二天尝试以内存映射文件的形式共享内存, 如果繁忙等待可以接受,我们可以将延迟降低到0.3微秒 使用如下代码传递单个字节:

MappedByteBuffer mem =
  new RandomAccessFile("/tmp/mapped.txt", "rw").getChannel()
  .map(FileChannel.MapMode.READ_WRITE, 0, 1);

while(true){
  while(mem.get(0)!=5) Thread.sleep(0); // waiting for client request
  mem.put(0, (byte)10); // sending the reply
}

注意:需要 Thread.sleep(0),以便 2 个进程可以看到彼此的更改 (我还不知道还有其他方法)。如果 2 个进程被迫与任务集相同的核心, 延迟变为 1.5 微秒 - 这是上下文切换延迟

P.P.S - 0.3 微秒是一个不错的数字!以下代码仅花费 0.1 微秒,同时仅进行原始字符串连接:

int j=123456789;
String ret = "my-record-key-" + j  + "-in-db";

P.P.P.S - 希望这不是太离题,但最后我尝试用增加一个静态易失性 int 变量来替换 Thread.sleep(0) (这样做时 JVM 碰巧会刷新 CPU 缓存)并获得 - 记录! -Java 到 Java 进程通信延迟 72 纳秒!

然而,当被迫使用相同的 CPU 核心时,易失性递增的 JVM 永远不会相互放弃控制,从而产生恰好 10 毫秒的延迟 - Linux 时间量子似乎是 5 毫秒......所以只有在有空闲核心时才应该使用它 -否则 sleep(0) 更安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 和 C/C++ 之间进程间通信的最快(低延迟)方法 的相关文章

随机推荐

  • 如何在 JPA 查询中编写 MAX 和 OVER (PARTITION BY) 函数

    我需要根据另一列 绘图编号 获取一列 修订版 最大值 谁能告诉我此功能的 JPA 查询 我编写了以下查询 但该查询不起作用 请帮助我如何在 JPA 查询中编写 MAX 和 OVER PARTITION BY 函数 Query select
  • 为什么我的输入不适合 div?

    我写了这个html和css代码 HTML div div h1 Seek enjoy h1 h3 Your movie seeker h3 div div div div
  • 使用反射实例化不可变对象

    我创建了一个基类来帮助我减少 C 中不可变对象初始化的样板代码 我使用延迟初始化是为了尽量不影响性能 我想知道这样做对性能有多大影响 这是我的基类 public class ImmutableObject
  • HashLocation 策略有什么缺点吗?

    我目前正在学习 Angular 我已经使用 HashLocation 实现了路由器 因为 PathLocation 在 Apache 服务器中不起作用 我浏览了各种帖子来解决这个问题 但最终不得不选择 Apache 的 HashLocati
  • 实体框架代码优先 - 将两个字段合并为一个集合

    我有这个型号和配置 public class Person public int FatherId get set public virtual Person Father get set public int MotherId get s
  • 使用内联要求

    如果我使用内联要求 如下所示 function something paths return require path join paths something etc etc 每次调用时引擎都需要吗 例子 let i 10 while i
  • 使用频带刻度的相同可重复字符串值

    我是 D3 的新手 想绘制带有 6 个水平条的图表 我的 xAxis 与它们的值是scaleLinear 的 所以我希望 yAxis 只是一个包含每个条形名称的列表 所以对于 yScale 我有 6 个名称 Games Apps Games
  • 禁用 Odoo 中看板列视图上的拖动和排序功能

    我正在 Odoo 9 中制作看板视图 以在基于 Many2one 字段的列中显示我的模型 我创建了这样的看板视图
  • matplotlib散点图颜色作为第三个变量的函数[重复]

    这个问题在这里已经有答案了 我想知道如何通过第三个变量使 matplotlib 的散点函数颜色点 问题matplotlib 中的 gnuplot linecolor 变量 https stackoverflow com questions
  • build.gradle 文件中的 IntelliJ 运行配置

    我有一个 Gradle 项目 目前可以通过以下方式导入到 IntelliJ 中 build gradle文件 IntelliJ 将设置正确的源位置并为我引入依赖项 我想做的是列出 IntelliJ 运行配置 build gradle文件 以
  • UIViewController 通话中状态栏问题

    Issue 通话状态栏消失后 模态呈现的视图控制器不会向上移动 在顶部留下 20px 的空白 透明空间 正常 没有问题 通话中 没有问题 通话中消失后 在顶部留下 20 像素高的空白 透明空间 显示下面的橙色视图 但是状态栏仍然存在于透明区
  • “您确定要离开此页面吗?”取消和确定功能

    我正在尝试执行类似于您离开的某些网站的操作 它会显示一个弹出窗口 显示 您确定要离开此页面吗 并有两个选项 取消 和 确定 我该如何做到这一点 并做到当您单击 取消 时 它只会取消该框 当他们单击 确定 时 它会执行 leaveChat 功
  • 如何仅在非整数时显示小数点?

    我用谷歌搜索过 但找不到正确的答案 假设我们有浮点数并得到它们的平均值 他们的平均值是这样的 3 5 2 5 5 7 所以我们有 4 个数字 不再在列表中的人 两个带小数的数字和两个整数 我想做的是 打印这些数字并保持这样 但我的问题是 当
  • JQuery ajax调用默认超时值

    我收到了无法复制的错误报告 但 ajax 调用超时是当前最好的猜测 所以我试图找出 jQuery 超时的默认值 ajax 称呼 有人有主意吗 在 jQuery 文档中找不到它 似乎没有标准化的默认值 我感觉默认是0 超时事件完全取决于浏览器
  • 使用 Javascript 将日期设置为 raddatepicker

    我从服务器端获取日期值并将其传递给 javascript 方法 然后使用 Javascript 将日期分配给 Telerik RadDatePicker 控件 我得到的日期为 var Date1 16 01 2013 00 00 00 fu
  • 更广泛的递归/泛型问题

    根据提出的问题和回答的问题here https stackoverflow com questions 6650532 recursive java generics between two classes 我有第二个 更复杂的一个 至少在
  • 如何过滤wireshark以仅查看从我的计算机发送/接收的dns查询?

    我是wireshark新手 正在尝试编写简单的查询 要查看仅从我的计算机发送或由我的计算机接收的 DNS 查询 我尝试了以下操作 dns and ip addr 159 25 78 7 其中 159 25 78 7 是我的 IP 地址 看起
  • IE11 中图标字体未加载

    我们使用 icomoon 作为图标字体 它们在 Chrome 和 Firefox 中运行良好 但在 IE11 中无法显示 有时 它似乎适用于第一个页面加载 但不适用于后续页面加载 清除缓存似乎不会重置它 其他IE版本也可能存在此问题 目前我
  • Android视频删除色度键背景

    我检查过this https stackoverflow com questions 12813089 i am working on android camera app i want to capture image and chang
  • Java 和 C/C++ 之间进程间通信的最快(低延迟)方法

    我有一个Java应用程序 通过TCP套接字连接到用C C 开发的 服务器 应用程序和服务器都在同一台机器 Solaris 机器 上运行 但我们最终正在考虑迁移到 Linux 交换的数据类型是简单消息 登录 登录ACK 然后客户端请求某些内容