栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

刚刚在我的Corei5 2.8GHz上测试了Java的延迟,仅发送/接收了单字节,仅产生了2个Java进程,而没有为任务集分配特定的CPU内核:

TCP         - 25 microsecondsNamed pipes - 15 microseconds

现在明确指定核心掩码,例如 taskset 1 java Srvtaskset 2 java Cli

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

所以

TCP overhead is visiblescheduling 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/

PS-第二天以内存映射文件的形式尝试了共享内存,如果可以接受繁忙的等待,我们可以将使用以下代码传递单个字节的延迟降低到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微秒-
这是上下文切换延迟

PPS-0.3微秒是个好数字!以下代码仅在执行原始字符串连接时,恰好需要0.1微秒:

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

PPPS-希望这不是太多的话题,但是最后我尝试用增加静态volatile
int变量(JVM这样做时刷新CPU缓存)替换Thread.sleep(0)并获得-记录!- 72纳秒的延迟Java到Java进程通信

但是,当强制使用相同的CPU内核时,易失性递增的JVM永远不会相互控制,从而产生恰好10毫秒的延迟-Linux时间间隔似乎是5ms
…因此,只有在有备用内核时才应使用-否则sleep(0)更安全。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452635.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号