select / poll / epoll 全解析 · 内核数据结构 · 红黑树 · 就绪链表 · LT vs ET
| 维度 | select | poll | epoll |
|---|---|---|---|
| 监听 fd 数量 | ≤ 1024 | 无限制 | 无限制 |
| 内核遍历方式 | 全量轮询 | 全量轮询 | 回调驱动 |
| 用户↔内核 拷贝 | 每次全量 | 每次全量 | 只拷贝就绪 |
| 连接数增加时性能 | 线性下降 | 线性下降 | 基本不变 |
| 内存使用 | 极少 | 少 | 少(内核管理) |
| 典型使用场景 | 嵌入式/跨平台 | 少量连接场景 | 高并发服务器(Nginx/Redis) |
fd_set 本质是一个 1024 bit 的位图(128 字节),每一 bit 对应一个 fd。FD_ZERO(&rfds); // 清空
FD_SET(sockfd, &rfds); // 加入
select(sockfd+1, &rfds, NULL, NULL, &tv);
if(FD_ISSET(sockfd, &rfds)) { /* 可读 */ }
pollfd 结构体数组代替位图,解决了 fd 数量限制问题,但 仍需线性扫描。