select、epoll 区别
select 和 epoll 都是用于 I/O 多路复用的机制。
select 的原理是通过一个 fd_set 结构体来存放需要监视的文件描述符集合。在调用 select 函数时,它会遍历这个集合,检查其中的文件描述符是否有可读、可写或异常事件发生。select 有几个比较明显的缺点。首先,它能够监视的文件描述符数量是有上限的,通常是 1024 个左右,这个限制由 FD_SETSIZE 决定。其次,select 每次调用都需要线性遍历文件描述符集合,当文件描述符数量较多时,效率会比较低。
epoll 则是在 Linux 内核 2.6 以后出现的一种更为高效的 I/O 多路复用机制。epoll 使用了事件驱动的方式,它在内核中有一个红黑树来存储要监视的文件描述符,这使得添加、删除和查找文件描述符的操作都非常高效,时间复杂度为 O (log n)。同时,epoll 还有一个就绪列表,当文件描述符有事件发生时,内核会将其对应的事件放入这个就绪列表中。在调用 epoll_wait 时,直接从这个就绪列表中获取有事件发生的文件描述符,而不需要像 select 那样遍历整个集合,这样大大提高了效率。而且 epoll 没有文件描述符数量的限制,它只受限于系统的内存大小。
从使用场景上来说,当并发连接数不是