相同点:都是多路复用
不同点:
select是轮询所有的流,时间辅助度是0(n),处理的流越多,无差别轮询时间就越长;
单个进程可监控的fd数量是有限的,32位机默认是1024;64位的是2048,内核需要将消息传递到用户空间,都需要内核拷贝动作
epoll是基于事件驱动的,哪个流发生了怎么样的I/O事件通知我们,事件复杂度是o(1),没有最大并发连接的限制,epoll 对于1G的内存可以支持10万个,可以通过/proc/sys/fs/file-max可以查看到,对于内存的拷贝:使用mmap()文件映射加速和内核空间的消息传递,减少内存的复制开销。 ET (边缘触发)和 LT (水平触发) , LT:默认的发式,只要fd还有数据,每次epoll_wait都会返回它的事件,无论fd是否是可读还是可写。ET:它只会提示一次,知道下次有数据,所以一定要每次把数据读光
如果连接数较少并且连接十分活跃的情况下,select比epoll要好,毕竟epoll通知机制要很多回调函数