什么是C ++应用程序之间发送消息,在Linux上最快的技术? 我隐约知道,下面的技术是在桌子上:
- TCP
- UDP
- 套接字
- 管道
- 命名管道
- 内存映射文件
有什么更多的方式,什么是最快的?
什么是C ++应用程序之间发送消息,在Linux上最快的技术? 我隐约知道,下面的技术是在桌子上:
有什么更多的方式,什么是最快的?
我建议在看这个也: 如何在C使用共享内存的Linux 。
基本上,我就把你的网络协议,如TCP和UDP一台机器上做IPC时。 这些都开销分组化也必将给更多的资源(如港口,环回接口)。
虽然上述所有的答案都非常好,我想我们要讨论什么是“最快” [和它必须是“最快”或只是“足够快”?]
对于大的消息,这是毫无疑问的是共享内存是一个很好的技术,而且在许多方面非常有用。
然而,如果消息是小的,存在具有拿出自己的消息传递协议,并通知其他过程,有一个消息的方法的缺点。
管道和命名管道更容易在这种情况下使用 - 它们的行为很像一个文件,你只写在发送端的数据,并在接收端读取数据。 如果发件人写东西时,接收端会自动唤醒。 如果管道是满的,在发送端被阻断。 如果有来自发送方没有更多的数据,接收侧自动地阻止。 这意味着,这是可以实现的代码相当几行有相当不错的保证,它会在任何时候,每一次工作。
在另一方面共享内存的依赖于一些其他的机制来通知其他线程说:“你有数据包处理”。 是的,这就是,如果你有数据复制的大数据包非常快 - 但如果有一个管道的巨大差异,我真的会感到很惊讶。 主要好处是,对方并没有将数据复制出来的共享内存的 - 但它也依赖于有是足够的内存来容纳所有的“飞行中”的消息,或不得不忍住事物的能力发件人。
我不是说“不使用共享内存”,我只是说,有是没有这样的事“一个解决方案,解决所有问题的‘最好的’。”
澄清:我将通过实施使用管道或命名管道的简单方法开始[取决于哪个适合目的],并测量其性能。 如果显著时间实际花费复制数据,那么我会考虑使用其他方法。
当然,另一个要考虑的应该是“是我们曾经打算使用两个单独的机器[或两个虚拟机在同一系统上]来解决这个问题。在这种情况下,网络解决方案是一个更好的选择 - 即使它并不是最快,我在为基准目的工作在我的机器上运行的本地TCP堆栈,并且将持续业务得到了一些20-30Gbit /秒(2-3GB /秒)。在同一进程中原始的memcpy得到周围50-100GBit /秒(5-10GB /秒)(除非块大小为真的很小并且在L1高速缓存适合)。我还没有测量的标准管,但我期望的某处大致这两个数字的中间。[这是数字这是关于适合多种不同的中型颇具现代PC的 - 显然,在ARM,MIPS或其他嵌入式控制器的风格,期待所有的这些方法的一个较小的数字]
剑桥大学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
检查CMA和kdbus: https://lwn.net/Articles/466304/
我想,这几天是基于AIO最快的东西。 http://www.kegel.com/c10k.html
当你标记为C ++这个问题,我建议你Boost.Interprocess中 :
共享存储器是最快的进程间通信机制。 操作系统映射在多个进程的地址空间的存储器段,从而使几个过程可以读取和在该存储器段不调用操作系统功能写。 然而,我们需要读取和写入共享内存的进程之间的某种同步。
资源
有一点需要注意,我发现是同步原语的便携性限制 。 也不OS X,也不支持Windows有间条件变量,例如本地实现,因此它与自旋锁模仿他们。
现在,如果你使用支持POSIX进程共享元* nix的,不会有问题。
与同步共享存储器是一个很好的方法,当相当大的数据涉及。
好了,你可以简单地让您的进程间共享内存段,使用Linux的共享内存又名SHM
。
这是很容易使用,看看链接的一些例子。
POSIX消息队列是相当快的,但他们有一定的局限性