linux进程间数据传输,在Linux上进程之间传递消息的最快技术?

Mats Peterss..

39

虽然上述所有答案都非常好,但我认为我们必须讨论什么是"最快"[并且它必须"最快"还是"足够快"?]

对于LARGE消息,毫无疑问共享内存是一种非常好的技术,并且在很多方面非常有用.

但是,如果消息很小,则必须提出自己的消息传递协议以及通知其他进程存在消息的方法存在缺陷.

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

另一方面,共享内存依赖于其他一些机制来通知另一个线程"你有一个要处理的数据包".是的,如果您要复制大量数据,速度非常快 - 但如果管道存在巨大差异,我会感到惊讶.主要的好处是对方不必将数据从共享内存中复制出来 - 但它还依赖于有足够的内存来保存所有"在飞行中"的消息,或者发送者有能力阻止事物.

我不是说"不要使用共享内存",我只是说没有"一种能够最好地解决所有问题的解决方案".

为了澄清:我将首先使用管道或命名管道[取决于哪些目的]来实现一个简单的方法,并测量其性能.如果花费大量时间实际复制数据,那么我会考虑使用其他方法.

当然,另一个考虑应该是"我们是否会使用两台独立的机器[或同一系统上的两台虚拟机]来解决这个问题.在这种情况下,网络解决方案是更好的选择 - 即使它不是最快的我在我的机器上运行本地TCP堆栈以进行基准测试,并获得了大约20-30Gbit/s(2-3GB/s)的持续流量.同一进程内的原始memcpy大约为50-100GBit/s (5-10GB/s)(除非块大小真的很小并且适合L1缓存).我没有测量过标准管道,但我希望它大约在这两个数字的中间.[这是数字适用于许多不同的中型相当现代的PC - 显然,在ARM,MIPS或其他嵌入式控制器上,所有这些方法的数量都要低一些]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值