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

本文对比了Linux的epoll和Windows的IOCP两种高效网络模型,阐述了它们在事件通知方式、数据访问方式、修改监听事件等方面的异同。epoll在事件通知时表明IO可操作,而IOCP则通知IO操作已完成。IOCP编程更复杂,需要关注缓冲区管理,而epoll相对简单。两者在实现技术上有显著差异,适应不同平台的高性能需求。
2150

被折叠的 条评论
为什么被折叠?



