最快的技术,在进程间传递消息在Linux上?(Fastest technique to pass m

2019-07-17 23:52发布

什么是C ++应用程序之间发送消息,在Linux上最快的技术? 我隐约知道,下面的技术是在桌子上:

  • TCP
  • UDP
  • 套接字
  • 管道
  • 命名管道
  • 内存映射文件

有什么更多的方式,什么是最快的?

Answer 1:

我建议在看这个也: 如何在C使用共享内存的Linux 。

基本上,我就把你的网络协议,如TCP和UDP一台机器上做IPC时。 这些都开销分组化也必将给更多的资源(如港口,环回接口)。



Answer 2:

虽然上述所有的答案都非常好,我想我们要讨论什么是“最快” [和它必须是“最快”或只是“足够快”?]

对于大的消息,这是毫无疑问的是共享内存是一个很好的技术,而且在许多方面非常有用。

然而,如果消息是小的,存在具有拿出自己的消息传递协议,并通知其他过程,有一个消息的方法的缺点。

管道和命名管道更容易在这种情况下使用 - 它们的行为很像一个文件,你只写在发送端的数据,并在接收端读取数据。 如果发件人写东西时,接收端会自动唤醒。 如果管道是满的,在发送端被阻断。 如果有来自发送方没有更多的数据,接收侧自动地阻止。 这意味着,这是可以实现的代码相当几行有相当不错的保证,它会在任何时候,每一次工作。

在另一方面共享内存的依赖于一些其他的机制来通知其他线程说:“你有数据包处理”。 是的,这就是,如果你有数据复制的大数据包非常快 - 但如果有一个管道的巨大差异,我真的会感到很惊讶。 主要好处是,对方并没有将数据复制出来的共享内存的 - 但它也依赖于有是足够的内存来容纳所有的“飞行中”的消息,或不得不忍住事物的能力发件人。

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

澄清:我将通过实施使用管道或命名管道的简单方法开始[取决于哪个适合目的],并测量其性能。 如果显著时间实际花费复制数据,那么我会考虑使用其他方法。

当然,另一个要考虑的应该是“是我们曾经打算使用两个单独的机器[或两个虚拟机在同一系统上]来解决这个问题。在这种情况下,网络解决方案是一个更好的选择 - 即使它并不是最快,我在为基准目的工作在我的机器上运行的本地TCP堆栈,并且将持续业务得到了一些20-30Gbit /秒(2-3GB /秒)。在同一进程中原始的memcpy得到周围50-100GBit /秒(5-10GB /秒)(除非块大小为真的很小并且在L1高速缓存适合)。我还没有测量的标准管,但我期望的某处大致这两个数字的中间。[这是数字这是关于适合多种不同的中型颇具现代PC的 - 显然,在ARM,MIPS或其他嵌入式控制器的风格,期待所有的这些方法的一个较小的数字]



Answer 3:

剑桥大学NetOS系统研究小组,英国已经做了一些(开源的),IPC标准。

源代码位于https://github.com/avsm/ipc-bench 。

项目页面: http://www.cl.cam.ac.uk/research/srg/netos/projects/ipc-bench/ 。

结果: http://www.cl.cam.ac.uk/research/srg/netos/projects/ipc-bench/results.html

:这项研究已使用上述结果发表http://anil.recoil.org/papers/drafts/2012-usenix-ipc-draft1.pdf



Answer 4:

检查CMA和kdbus: https://lwn.net/Articles/466304/

我想,这几天是基于AIO最快的东西。 http://www.kegel.com/c10k.html



Answer 5:

当你标记为C ++这个问题,我建议你Boost.Interprocess中 :

共享存储器是最快的进程间通信机制。 操作系统映射在多个进程的地址空间的存储器段,从而使几个过程可以读取和在该存储器段不调用操作系统功能写。 然而,我们需要读取和写入共享内存的进程之间的某种同步。

资源

有一点需要注意,我发现是同步原语的便携性限制 。 也不OS X,也不支持Windows有间条件变量,例如本地实现,因此它与自旋锁模仿他们。

现在,如果你使用支持POSIX进程共享元* nix的,不会有问题。

与同步共享存储器是一个很好的方法,当相当大的数据涉及。



Answer 6:

好了,你可以简单地让您的进程间共享内存段,使用Linux的共享内存又名SHM

这是很容易使用,看看链接的一些例子。



Answer 7:

POSIX消息队列是相当快的,但他们有一定的局限性



文章来源: Fastest technique to pass messages between processes on Linux?