select,poll和epoll都是IO多路复用技术。多路指的是多个网络连接,复用是指复用一个线程。
目前epoll是性能最高的多路复用技术,nginx就是基于epoll技术。但是,在网络连接数不多的情况下,IO多路复用的效率不如多线程+阻塞IO。
1 select
每次调用,都需要将文件描述符集合(数组结构)从用户空间复制到内核空间,且在内核空间需要遍历每个文件描述符的处理情况,最终返回处理结果。复制和遍历文件描述符集合需要耗费时间,因此,select对每次请求的文件描述符是有限制的。
2 poll
poll与select的区别在于,不限制每次请求的文件描述符数量。且集合采用链表结构。
3 epoll
与select和poll都不同,不仅不限制每次请求的文件描述符数量,且采用事件回调的机制,不需要遍历全部文件描述符,每次通过事件回调将处理好的文件加入到就绪列表中,最后直接返回就绪列表中的数据。
数据结构采用的是红黑树。