posix管道是轻量级的吗?

Nil*_*nck 12 c linux posix pipe

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

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

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

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

Dav*_*har 8

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

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

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

  • OP明确表示他正在使用poll()等待来自一个消费者线程的多个管道. (2认同)

Ste*_*e-o 5

当您使用Linux时,您可以调查并比较pipe性能eventfd.它们在技术上更快,重量更轻,但你会非常幸运地看到实践中的收益.

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