select、poll 和 epoll 有什么区别?
先自己想一想,再看参考要点
参考要点
- select 每次调用都要把描述符集合复制到内核并逐个检查,开销与描述符数成正比,只能监听编号小于 1024 的描述符
- poll 用 pollfd 数组,没有 1024 限制,但同样每次复制和遍历
- epoll 用 epoll_ctl 把描述符注册到内核的红黑树中只复制一次,就绪时由回调加入就绪链表,epoll_wait 只返回就绪的事件
- 监听 1 万个描述符、只有 1 个就绪时,poll 每次约 1.6 ms,epoll_wait 约 0.21 µs,但 epoll 只能在 Linux 上使用