为什么要使用select(),当我们有poll()和epoll()呢?

7

我研究了 pollepollselect 之间的区别。但我不明白的是,在什么情况下应该使用 select。鉴于 pollepoll 具有 select 所具备的所有功能,而且还有更多的功能,因此我并没有看到任何优势。


3
epoll()是Linux特有的,如果您需要可移植性,只能使用select()poll() - Ingo Leonhardt
根据您想要监控的套接字(FD)数量而定。如果不到10个,使用selectepoll更快。此外,epoll是Unix专用的。select有一个最大限制(我认为是1024),而epoll没有。 - ja_mesa
1
这是一个很好的总结poll vs select vs event-based,这个也不错The C10K problemselect是最可移植的,poll次之,而epoll仅适用于Linux。使用selectpollepoll更简单,但如果需要可扩展性,则应尽可能使用epoll - Shafik Yaghmour
应该查阅并阅读Beej的网络指南...它以非常有用的方式解释了所有内容。 - t0mm13b
你需要记住,select()poll() 先出现了很多年。 - user207421
2个回答

0

从历史上看,select 在1983年的BSD4.2中首先出现。作为第一个出现的系统调用,它具有最广泛和最可移植的特权。

尽管如此,selectpoll 都无法良好扩展。根据 LIBEV(3) 的说法,select 扩展到 O(highest_fd),而 poll 则扩展到 O(total_fds)。对于大量文件描述符,epoll 的扩展性要好得多,但它只适用于 Linux。

使用像 libeventlibevlibuv 这样的事件库会提供一个抽象层,并尝试在您的系统上使用最高效的方法,因此您不必担心选择 selectpollepollkqueue(适用于 MacOS 和 BSD)之间的区别。


1984年可能更接近,但它肯定早于那个时间,而且是BSD 4.2,而不是4.4。 - user207421
@user207421 对,我在想现代Linux符合的select()。我更新了答案来提到两者。 - Samuel Hunter
那么它既在1982年又在1994年的4.2和4.4中排名第一?如果不是来自BSD 4.2的“select()”,现代Linux遵循的是什么“select()”呢? - user207421
@user207421 man select(2) 读取的内容是:select() 符合...4.4BSD(select() 最初出现在 4.2BSD)。 - Samuel Hunter
1
所以它在1982年出现,Linux符合这一标准。在4.2和4.4之间没有发生改变。 - user207421
@user207421 哦,我明白了。我已经修复了历史错误。我误解了它提到BSD4.4在两个版本之间发生了变化。 - Samuel Hunter

-2

select() 监视的文件描述符比 poll() 少。此外,一些 select() 的实现只是使用了 poll()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接