select
最早出现的多路复用io接口,解决了非阻塞io的资源浪费问题,将所有的网络io请求放在select,然后对其进行遍历,筛选出可以处理的事件,缺点是连接有上限。32位操作系统下是1024个,64位为2048个。对于资源储存模块(bytebuff)不可使用重复利用,每次都轮询所有的连接,时间复杂度为o(n),会进行内核态和用户态之间的拷贝,增大了开销。
poll
select的改进版本,采用了链表的形势,使连接理论上不存在上限,并且是的资源储存模块可以重复利用。其他的和select一样。
epoll
epoll技术做了很大的改进,首先连接没有上限,资源存储模块可以重复利用,然后,epoll使用了函数回调的方式,如果发现有可以处理的连接就把这个连接放在前段,记录有点多少个可以处理的事件,在处理的时候直接获得所有可以处理的事件,时间复杂度为o(1),并且使用了零拷贝技术(mmap,我也不知道为什么不使用sendfile),直接将内核模块的数据映射给用户模块,降低开销。