Java NIO分析(5): I/O多路复用之epoll系统调用
1. epoll概念
poll
系统调用相比于select
主要解决了文件描述符的数量限制,但是在高并发场景下没有解决根本问题:
- fd数组整体在内核空间和用户空间之间拷贝
- 遍历整个fd数组找事件浪费资源
这俩性能问题在Banga在1999年写了篇论文A Scalable and Explicit Event
Delivery Mechanism for UNIX,提出select
和poll
都是无状态的,需要用户空间的进程自行遍历查找事件, 一种改进方案是内核内部自己维护事件集合.通过一个类似declare_interest
的系统调用,内核能够增量得更新进程感兴趣的事件集合列表, 应用进程通过使用get_next_event
调用能派发新事件给内核。
根据论文的研究成果,LINUX
和FreeBSD
各自给出的解决方案:epoll
和kqueue
.我们主要讨论epoll, 毕竟日常服务端环境都是LINUX.
在LINUX内核2.6以上,epoll
才受到支持。