posix管道是轻量级的吗?

时间:2010-03-28 14:42:05

标签: c linux posix pipe

在linux应用程序中,我使用管道在线程之间传递信息。

使用管道的想法是我可以使用poll(2)一次等待多个管道。这在实践中运作良好,我的线程大多数时间都在睡觉。他们只有在有事情要做的时候才会醒来。

在用户空间中,管道看起来就像两个文件句柄。现在我想知道这些管道在OS端使用了多少资源。

顺便说一句:在我的应用程序中,我只是偶尔发送单个字节。把我的管道想象成简单的消息队列,它允许我唤醒接收线程,告诉他们发送一些状态数据或终止。

4 个答案:

答案 0 :(得分:8)

不,我不会认为管道“轻量级”,但这并不一定意味着它们对您的应用程序来说也是错误的答案。

通过管道发送一个字节将需要至少3次系统调用(写入,轮询,读取)。使用内存中队列和pthread操作(mutex_lock,cond_signal)可以减少开销。开放文件描述符肯定会消耗内核资源;这就是为什么默认情况下进程通常限制为256个打开文件(不是在适当的情况下不能扩展限制)。

仍然,用于线程间通信的管道/轮询解决方案也有优势:特别是如果您需要等待来自组合源(网络+其他线程)的输入。

答案 1 :(得分:5)

在使用Linux时,您可以调查并将pipe效果与eventfd进行比较。它们在技术上更快,重量更轻,但实际上你会看到实际的收益,你会非常幸运。

http://www.kernel.org/doc/man-pages/online/pages/man2/eventfd.2.html

答案 2 :(得分:1)

衡量,你会知道。管道的完整流程对于许多应用来说都足够轻巧。其他应用程序需要更轻的重量,如OS线程(pthreads是许多Unix应用程序的流行选择),或超轻量级,如用户级线程包,除了处理I / O外永远不会进入内核模式。虽然唯一可以确定的方法是测量,但管道可能足以容纳几十个线程,而一旦达到数万个线程,您可能需要用户级线程。究竟应该使用今天的代码绘制边界,我不知道。如果我想知道,我会测量: - )

答案 3 :(得分:0)

你也可以使用 socketpair ,它比eventfd更便携,因为它是POSIX。