我正在寻找一些数据来帮助我确定Linux上两个独立进程之间的通信哪个更好/更快:
哪个更糟:管道的系统开销还是tcp堆栈开销?
更新了确切要求:
答案 0 :(得分:4)
过去我曾使用本地域套接字来处理这类事情。我的库确定其他进程是系统本地还是远程进程,并使用TCP / IP进行远程通信,使用本地域套接字进行本地通信。这种技术的好处是本地/远程连接对应用程序的其余部分是透明的。
本地域套接字使用与管道相同的机制进行通信,并且没有TCP / IP堆栈开销。
答案 1 :(得分:3)
我真的不认为你应该担心开销(这将是非常低的)。您是否确保使用性能分析工具来确定应用程序的瓶颈可能是TCP开销?
无论如何,Carl Smotricz说,我会选择套接字,因为将来分离应用程序真的很简单。
答案 2 :(得分:3)
我在对previous post的回答中讨论过这个问题。我不得不比较套接字,管道和共享内存通信。管道肯定比插座快(如果我没记错的话可能是2倍......我可以在回到工作岗位时查看这些数字)。但这些测量仅仅是为了纯粹的沟通。如果沟通只是整体工作的一小部分,那么两种沟通方式之间的差异可以忽略不计。
修改强> 以下是我几年前做过的测试中的一些数字。您的里程可能会有所不同(特别是如果我犯了愚蠢的编程错误)。在此特定测试中,同一台机器上的“客户端”和“服务器”来回回送100字节的数据。它提出了10,000个请求。在我写的文件中,我没有说明机器的规格,因此它只是相对速度可能是任何值。但是对于好奇,这里给出的时间是每个请求的平均成本:
.067 ms
.042 ms
.033 ms
.011 ms
答案 3 :(得分:2)
使用TCP会产生更多的开销 - 这将涉及将数据分解为数据包,计算校验和和处理确认,在同一台机器上的两个进程之间进行通信时,这些都不是必需的。使用管道只会将数据复制到缓冲区中。
答案 4 :(得分:2)
需要考虑两件事:
在TCP上:
(1)成本更高 - (潜在的)不可靠信道需要3次握手开销。
(2)更昂贵 - IP级开销(校验和等),TCP开销(序列号,确认,校验和等)几乎所有这些在同一台机器上都不是必需的,因为该通道应该是可靠且不会引入与网络相关的损伤(例如数据包重新排序)。
但我仍然会使用TCP ,只要它有意义(即取决于具体情况),因为它无处不在(阅读:简单的跨平台支持)并且开销不应该是一个问题在大多数情况下(阅读:个人资料,不要过早优化)。
已更新:如果不需要跨平台支持且重点在于性能,那么请使用命名/域管道,因为我非常确定平台开发人员将优化出处理网络级别损伤所需的不必要功能。
答案 5 :(得分:2)
我不知道这是否适合你,但linux下一种非常常见的IPC(进程间通信)方式是使用共享内存。它实际上超快(我没有对此进行分析,但这只是RAM上的共享数据,并且周围有强大的处理功能。)
这个approuch的主要问题是信号量,你必须在它周围建立一个小系统,所以你必须确保一个进程不是在另一个尝试读取的同时写入的。
一个非常简单的入门教程是here
这不像使用套接字那样可移植,但概念是相同的,所以如果你将它迁移到Windows,你只需要更改共享内存创建/附加层。
答案 6 :(得分:1)
unix domain socket是一个非常混乱的妥协。不是tcp的开销,而是比管道解决方案更具进化性。您没有考虑的一点是套接字是双向的,而命名管道是单向的。
答案 7 :(得分:0)
我认为管道会更轻一些,但我只是在猜测。
但由于管道是本地的东西,所以可能涉及的代码复杂得多。
其他人可能会告诉您尝试并测量两者以找出答案。这个答案很难出错,但你可能不愿意投入时间。这会让你希望我的猜测是正确的;)