我需要创建很多管道,我想在同一进程中的线程之间使用它们作为fifo队列,然后对它们进行选择/轮询。
我的问题是,如果我创建了很多队列,这会对程序的性能产生很大影响吗?像管道数量限制,资源消耗等
谢谢!
答案 0 :(得分:5)
您可以保持打开的文件数量按进程限制,管道是文件,因此您可以使用该限制。
答案 1 :(得分:2)
select
只能处理文件描述符,其值最高为FD_SETSIZE
(1024是典型值),因此如果您使用poll
,请务必使用select
会有很多。但请注意,进程中打开文件的默认ulimit
通常与FD_SETSIZE
相同,因此如果需要更多,您还需要增加该值。此外,在内核空间内存使用方面(每个开放管道至少有一两页,可能更多)和性能(发送/接收数据需要在用户和内核空间之间进行多次复制和转换),管道的成本相当昂贵。
只要每个线程只有一个管道,你可能会花费更多的资源来管理线程而不是管道,所以你的设计看起来并不那么糟糕。但是,如果您正在使用线程,那么基于条件变量使用您自己的仅用户空间的队列可以更高效。这在POSIX线程方案中更为惯用,但在Linux培训的应用程序开发人员倾向于工作的方式中更少惯用。它也可以使你的队列数量基本没有限制(可用内存除外)。
如果可能的话,我会关注接口要求,而不是关注成本和限制。您希望使用poll
或select
是否存在强烈的原因,例如你的线程在你的队列和其他基于文件描述符的事件上同时等待?或者你只是倾向于管道因为它是你所知道的?在前一种情况下,我认为管道可能有意义,但在后一种情况下,我会花一点时间研究其他选项,看看哪个对你的问题更有意义。