I/O多路复用技术
在I/O编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程模型比,I/O多路复用技术的最大优势是系统开销小,系统不需要创建额外进程或者线程,也不需要维护这些进程或线程的运行。
支持的I/O多路复用技术
-
select
-
pseelct
-
poll
-
epoll
-
…
在Linux网络编程很长的一段时间内都是使用select做轮询和网络事件通知,然而select的一些固有缺陷导致它的应用受到很大限制,最终liux使用了epoll替代select,主要有以下方面的改进
-
支持一个进程打开的socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数)
-
I/O效率不会随着FD数目的增加而线性下降
传统select/poll有个致命的弱点就是当有一个很大的socket集合时,由于网络延时或者链路空闲,任意时刻只有很少部分的socket是活跃的,但select/poll每次调用都会线性扫描全部集合,导致效率呈现线性下降。而epoll不存在这个问题,它只对活跃的socket进行操作,这是因为在内核中实现的epoll是根据每个fd上面的callback函数实现的,那么只有活跃的socket才会主动调用callback函数,其他idle状态的socket则忽略,在这点上,epoll实现了一个伪AIO。
-
使用mmap加速内核与用户空间的消息传递
无论是select还是epoll,都需要内核把fd消息通知给用户空间,那么如何避免不必要的内存复制就显得非常重要,epoll是通过内核和用户空间mmap同一块内存实现。
-
epoll的API更加简单
从BIO到NIO是java通信类库的一小步,但却对java在高性能通信领域的发展起到关键性推动作用。