接口区别
select接口
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
epoll接口
#include <sys/epoll.h>
int epoll_create(int size);
int epoll_create1(int flags);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);
int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);
- select接口最大支持1024个fd,工作模式是水平触发(LT),支持跨平台
- epoll接口没有文件描述符数量限制(根据内存大小决定),工作模式支持水平触发(LT)和边缘触发(ET), 仅支持Linux平台
- epoll和select都属于同步IO
时间复杂度
- select函数时间复杂度
O(n)
- epoll接口中
epoll_wait
时间复杂度为O(1)
,epoll_ctl
时间复杂度为O(logn)
fd剧增IO效率影响
- select函数每次调用时需要对连接进行全局遍历操作,fd增加遍历速度缓慢(线性下降性能)
- epoll实现根据每个fd上的callback实现,只有活跃的socket才会主动调用callback(所有socket全部活跃可能会影响性能)