Linux上进程间传递消息的最快技术? 在Linux上,最快的技术是在C++应用程序之间发送消息吗?我模模糊糊地意识到以下技术正在讨论中: TCP UDP 插座 管道 命名管道 内存映射文件

Linux上进程间传递消息的最快技术? 在Linux上,最快的技术是在C++应用程序之间发送消息吗?我模模糊糊地意识到以下技术正在讨论中: TCP UDP 插座 管道 命名管道 内存映射文件,c++,linux,performance,ipc,latency,C++,Linux,Performance,Ipc,Latency,还有其他方法吗?最快的方法是什么 那么,您可以使用akaSHM在进程之间共享内存段 它很容易使用,请查看链接中的一些示例。检查CMA和kdbus: 我认为现在最快的东西都是基于人工智能的。 我建议您也看看这个: 基本上,在一台机器上执行IPC时,我会放弃TCP和UDP等网络协议。这些都有打包开销,并且必然会占用更多的资源(例如端口、环回接口)。虽然上述所有答案都很好,但我认为我们必须讨论什么是“最快的”[它必须是“最快的”还是“足够快的”?] 对于大型消息,毫无疑问,共享内存是一种非常好的技术

还有其他方法吗?最快的方法是什么

那么,您可以使用aka
SHM
在进程之间共享内存段

它很容易使用,请查看链接中的一些示例。

检查CMA和kdbus:

我认为现在最快的东西都是基于人工智能的。

我建议您也看看这个:


基本上,在一台机器上执行IPC时,我会放弃TCP和UDP等网络协议。这些都有打包开销,并且必然会占用更多的资源(例如端口、环回接口)。

虽然上述所有答案都很好,但我认为我们必须讨论什么是“最快的”[它必须是“最快的”还是“足够快的”?]

对于大型消息,毫无疑问,共享内存是一种非常好的技术,在许多方面都非常有用

但是,如果消息很小,则必须提出自己的消息传递协议和方法来通知另一个进程存在消息,这是有缺点的

在这种情况下,管道和命名管道更易于使用-它们的行为非常类似于文件,您只需在发送端写入数据,然后在接收端读取数据。如果发送方写了什么,接收方会自动唤醒。如果管道已满,则发送端将被阻塞。如果没有来自发送方的更多数据,接收方将自动被阻止。这意味着这可以在相当少的代码行中实现,并且可以很好地保证它在任何时候都可以工作

另一方面,共享内存依赖于其他一些机制来通知另一个线程“您有一个数据包要处理”。是的,如果要复制大量数据包,速度会非常快——但如果管道真的存在巨大差异,我会感到惊讶。主要的好处是,另一方不必将数据从共享内存中复制出来,但它也依赖于有足够的内存来保存所有“正在传输”的消息,或者发送方有能力保留内容

我不是说“不要使用共享内存”,我只是说没有“一个解决方案可以‘最好’解决所有问题”这样的东西

澄清一下:首先,我将使用管道或命名管道实现一个简单的方法(取决于适合的用途),并测量其性能。如果花费大量的时间实际复制数据,那么我会考虑使用其他方法。
当然,另一个需要考虑的问题是“我们是否打算使用两台独立的机器[或同一系统上的两台虚拟机]来解决这个问题。在这种情况下,网络解决方案是一个更好的选择-即使它不是最快的,我已经在工作中的机器上运行了一个本地TCP堆栈来进行基准测试,并获得了大约20-30Gbit/s的数据(2-3Gb/s)具有持续的流量。同一进程中的原始MimcPy大约在50-100Gb/s(5-10Gb/s)(除非块大小非常小,适合L1高速缓存)。我还没有测量标准管道,但我希望这大概是在这两个数字中间的某个地方。这是一些中等大小的相当现代PC的数字,很明显,在一个臂,MIPS或其他嵌入式控制器中,对于所有这些方法期望更低的数量[

< P> >,当你用C++标记这个问题时,我建议:

共享内存是最快的进程间通信机制 操作系统将一个内存段映射到多个存储单元的地址空间中 进程,以便多个进程可以在该内存中读写 不调用操作系统函数的段。但是,我们需要 读写进程之间的某种同步 共享内存

我发现的一个警告是.Nor OS X和Windows都没有进程间条件变量的本机实现,例如, 所以它用旋转锁来模拟它们

现在,如果您使用支持POSIX进程共享原语的*nix,就不会有问题了


当涉及大量数据时,同步共享内存是一种很好的方法。

非常快,但有一些局限性

英国剑桥大学的NetOS系统研究小组已经完成了一些(开源)IPC基准测试

源代码位于

项目页面:

结果:


这项研究是使用上述结果发表的:

你的应用程序的延迟要求是什么?@paddy基本上我会尽可能减少每一纳秒/微秒。AIO不是同一处理器上进程间通信的最快解决方案。你的第二个链接并不是我想要的推荐。@JamesKanze您能详细阐述一下您的观点吗?关于c10k,我经常分享您的观点-但我看到URL多次引用,所以@user997112对于同一处理器上的任何内容,共享内存都可以轻而易举地替代。处理器之间,异步IO和使用separat之间的时间差e线程可以忽略不计,而且多线程模型更干净,更易于开发和维护。有了高效的线程,我就不会选择异步IO。人们大多对正在交换的消息的大小以及是否使用一个或两个处理器进行了评论。但我相信一个相关且重要的问题是事件的速率。如果你每秒处理大量事件(比如数十万),那么AIO可能会给你一个优势。@JamesKanze“和multithre