select/poll/epoll
select
select的执行逻辑是收集传入的所有文件描述符创建一个bitmap,把这个bitmap拷贝到内核态让内核去判断哪个文件描述符可以被读写
缺点:
- bitmap只能使用一次,再次判断需要重新创建新的bitmap
- 用户态拷贝到内核态的开销较大
- 函数返回后还需要判断所有文件描述符是否被置位,复杂度为O(n)
- bitmap大小不能太大
poll
poll的逻辑是通过fds结构体来减少4个缺点的1,4
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
//nfds表示一共有几个fd,timeout表示超时时间struct pollfd {int fd; /* file descriptor */short events; /* requested events */short revents; /* returned events */};
通过给revents来判断文件描述符是否准备好,如果revents==events则poll返回,在处理的时候需要把revents手动置为0来实现重复利用
epoll
epoll把这个bitmap或者是说revents放到内核态和用户态共享来实现减少缺点2,同时他会把可以操作的文件描述符放到整个位图的前几位实现解决缺点3
