1 本质上都是同步I/O

  三者都是I/O复用,本质上都属于同步I/O。因为三者只是负责通知应用程序什么时候数据准备好了,实际的I/O操作还是在由应用程序处理;如果是异步I/O的话,实际I/O由内核处理,然后再通知应用程序。这一点要搞清楚。

2 相比select、poll,epoll的缺点:

  (1)Linux系统独有:epoll函数并不是Unix系统通用,所以不适合开发兼容性强的程序;

  (2)select、poll都只有一个函数,而epoll有三个(epoll_create,epoll_ctl和epoll_wait),操作起来更复杂,并且由于要实现回调机制,epoll的内部实现也更加复杂。如果并发量小且连接不频繁的话,最好使用select和poll,性能可能更好。

3 相比select、poll,epoll的优点  

  (1)每次调用select、poll,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大,而epoll函数只有使用epoll_ctl函数时才会进行fd的拷备,并且只拷备增加的fd;

  (2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大,而epoll函数只传递所有新注册事件的fd;

  (3)select支持的文件描述符数量太小了,默认是1024,而epoll函数所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048。