IO多路复用技术把多个IO的阻塞复用到同一个select的阻塞上,使得系统在单线程的情况下可以同时处理多个客户端请求。
与多线程相比,IO多路复用技术降低系统开销,不需要创建新的额外进程或者线程,节省了系统资源。
目前支持IO多路复用的系统调用有select、pselect、poll和epoll。
epoll相对于select的改进:
1.一个进程打开的socket描述符(fd)不受限制(受限于操作系统最大文件句柄数)。
select单进程打开的最大的fd是有限制的,默认是1024个,对于需要支持上万TCP连接的服务器来说太少了。
epoll没有这个限制,支持的最大fd上限是操作系统最大文件句柄数。1G内存的机器大约是10万个句柄。
2.IO效率不会随着FD增加而线性下降
select和poll缺点是当有很大的socket集合时,任意时刻只有少部分的socket是活跃的,select和poll每次调用都会扫描全部集合,导致效率下降。
epoll不存在以上问题。epoll根据每个fd上的callback实现。只有活跃的socket才会调用callback函数。
3.使用mmap加速内核与用户空间的消息传递
epoll通过内核和用户空间mmap同一块内存来实现消息传递。mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。
4.epoll的API更简单
创建epoll描述符、添加监听事件、阻塞等待监听事件的发生 、关闭epoll描述符等。
克服select和poll有很多。epoll是Linux系统的实现方案。在FreeBSD下游kqueue,Solaris的解决方案是dev/poll。