一、select的不足
-
最大监听数受限:`FD_SETSIZE` 默认 1024(Linux)
-
每次调用需重置 fd_set:内核会修改集合,必须每次重新 `FD_SET`
-
用户态与内核态拷贝开销大
-
返回后仍需遍历所有 fd 才能知道哪个就绪
-
效率随 fd 数量增长下降明显
二、poll
(一)
(二)改进与不足
相比 select 的改进:
-
无 1024 限制:只要系统允许打开足够多 fd
-
无需重置集合:`events` 和 `revents` 分离
-
更清晰的事件机制
-
效率更高:仅遍历传入的数组,不遍历整个 fd 范围
仍存在的问题:
1.每次调用仍需将整个 `fds[]` 拷贝到内核
2.返回后仍需遍历全部元素查找就绪 fd
3.时间复杂度仍是 O(n),连接数多时性能下降