1

我需要创建很多管道,我想将它们用作同一进程中线程之间的先进先出队列,然后对它们进行选择/轮询。

我的问题是,如果我创建了很多队列,这会对程序的性能产生很大影响吗?比如管道数量限制、资源消耗等

谢谢!

4

2 回答 2

5

每个进程可以保持打开的文件数量有一个限制,管道是文件,所以你消耗了这个限制。

于 2013-05-19T23:26:55.210 回答
2

select只能处理值高达(1024 是典型值)的文件描述符FD_SETSIZE,所以你绝对应该使用poll并忘记select你是否会有很多。但是请注意,ulimit进程中打开文件的默认值通常与 相同FD_SETSIZE,因此如果您需要更多,您还需要增加它。此外,管道在内核空间内存使用(每个打开的管道至少一页或两页,可能更多)和性能(发送/接收数据需要多个副本以及用户和内核空间之间的转换)方面稍显昂贵。

只要每个线程只有一个管道,您可能会花费比管道更多的资源来设置线程,因此您的设计看起来并不那么糟糕。但是,如果您使用线程,则基于条件变量使用您自己的仅限用户空间的队列可能会更有效。这在 POSIX 线程方案中更为惯用,但在受过 Linux 培训的应用程序开发人员倾向于工作的方式中却不那么惯用。它也可以做到这一点,因此您可以拥有的队列数量基本上没有限制(可用内存除外)。

如果可能的话,我不会关注成本和限制,而是关注接口要求。您是否有充分的理由要使用pollor select,例如让您的线程同时等待您的队列和其他基于文件描述符的事件?还是您只是倾向于管道,因为这是您所知道的?在前一种情况下,我认为管道可能有意义,但在后一种情况下,我会花一点时间研究其他选项,看看哪个对你的问题更有意义。

于 2013-05-20T02:04:34.553 回答