文
章
目
录
章
目
录
Java面试题:请你谈谈对IO多路复用的理解
得分点
- 多线程的特点(单线程可以处理多个客户端请求)
- I/O多路复用的优势(系统开销小)
标准回答
在I/O编程过程中,当需要同时处理多个客户端接入请求时,有两种主要的方法可以选择:多线程或者I/O多路复用技术。
多线程的特点
- 多线程模型允许在单个进程中创建多个线程,每个线程可以独立处理一个客户端的请求。
- 这意味着单线程可以同时处理多个客户端请求,每个线程负责处理一个连接,从而实现并发处理。
I/O多路复用的优势
- I/O多路复用技术通过将多个I/O的阻塞操作复用到同一个select或者epoll的阻塞上,使得系统在单线程的情况下可以同时处理多个客户端请求。
- 与传统的多线程/多进程模型相比,I/O多路复用的最大优势在于系统开销小。
- 在多线程模型中,每个线程都需要独立的资源(内存、CPU等),并且线程的创建和销毁都需要一定的开销。而I/O多路复用模型只需要一个线程来管理多个I/O操作,不需要创建额外的进程或线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源。
加分回答
目前支持I/O多路复用的系统调用有select、pselect、poll、epoll,在Linux网络编程过程中,长时间使用select做轮询和网络事件通知,但select的一些固有缺陷导致了它的应用受到了很大的限制,最终Linux选择了epoll作为替代方案。
为了克服select的一些限制,epoll作了很多重大改进:
支持的FD数不受限制
- select的一个缺点是单个进程所打开的FD是有一定限制的,而epoll支持的FD上限是操作系统的最大文件句柄数,通常远大于1024,例如可以达到数十万个。
I/O效率不随FD数目增加而线性下降
- 传统的select/poll会在每次调用时线性扫描全部的FD,导致效率随FD数目的增加而下降,而epoll只对活跃的FD进行操作,避免了这个问题。
使用mmap加速内核与用户空间的消息传递
- epoll通过内核和用户空间mmap同一块内存实现,避免了不必要的内存复制。
epoll的API更加简单
- epoll提供了简单的API,包括创建一个epoll描述符、添加监听事件、阻塞等待所监听的事件发生、关闭epoll描述符等,相对于select/poll更加简洁。