前言
epoll
和 IOCP(IO Completion Ports)
分别是 Linux 和 Windows 系统上的高效网络模型。相比其他网络模型,同样是 polling
方式,这两种模型有如下特点:
- 在系统资源允许下,监控的文件描述符没有上限。
- 多线程同时监视和修改文件描述符是可行的,少量的线程即可实现支持大量连接的服务端程序。
- 相比其他网络模型,这两种模型的事件通知会有一定开销。如果应用程序不需要太多的客户端连接,
select
和poll
是更合适的模型。epoll
和IOCP
的设计目的是应付成千上万(C10K、C10M)的连接并发。
那 epoll
和 IOCP
技术上有什么不同呢?
事件通知方式
第一个不同点是二者的事件通知方式,主要体现在内核帮用户做了多少工作。具体而言:
- 当应用程序收到
epoll
的事件通知时,表示现在用就绪的 IO 可以操作,具体怎么操作由用户来执行(读、写、关闭fd等); - 当收到
IOCP
的通知时,表示在此之前的某个或多个 IO 请求操作已经完成,操作可能成功也可能失败。
使用 epoll
的关键步骤:
- 确定在指定的文件描述符上需要执行哪些操作