一句话定义
poll 是对 select 机制的改进实现,它通过 pollfd 结构体数组取代了位图限制。虽然它突破了文件描述符数量的硬上限,但在内核层面仍需通过线性遍历整个数组来确定就绪状态,其时间复杂度仍为 O(n)。
核心原理
poll 的核心逻辑与 select 类似,但数据结构发生了变化:
- 结构化存储:使用
pollfd结构体数组,每个结构体包含 FD、关注事件(events)和实际发生事件(revents)。 - 动态扩容:因为底层是链表或动态数组,所以理论上可以监控无限数量的 FD(受限于内存)。
- 输入输出分离:由于
revents字段专门用于存放结果,用户程序不需要像select那样在每次调用前重新初始化整个集合。
为什么它依然不够快?虽然解决了“数量限制”,但
poll依然没有摆脱 O(n) 轮询 的命运。内核仍然需要遍历整个数组来检查状态,且每次调用仍需在用户态和内核态之间拷贝大量数据。
应用场景
- 中等并发规模:在 FD 数量超过 1024 但又没达到万级并发(C10K)的场景下,
poll是一个比select更灵活的选择。 - 非 Linux 系统:在某些不支持
epoll的类 Unix 系统中作为替代方案。