Linux 的 epoll 与 Windows 的 IOCP 详解
如果你在搞网络编程或者高性能服务器,一定要搞懂这两个模型——它们都是用来解决“多路复用”问题的工具,让你同时处理大量的网络连接变得高效又可控。
一、什么是“多路复用”?
简单说,就是你手里有很多任务(比如很多客户端的请求),但系统的核心(线程或者进程)资源有限,你怎么快速、同时处理这些请求?这个问题就属于“多路复用”范畴。
就像你在吃饭,有很多盘菜(请求)摆在桌子上,你想用一只筷子(单个线程)快速夹起来吃掉,并且处理所有盘子里的菜。
如果每个请求都用单独的线程跑,效率低,资源浪费严重。而“多路复用”技术,就是让一只或者少数几只“筷子”可以轮流“夹”住多个“盘子”,高效处理。
二、epoll(Linux)和IOCP(Windows)做了什么?
1. epoll(Linux)
1. 核心功能
epoll
是 Linux 下高效的 I/O 多路复用模型,用于监控多个文件描述符(如 Socket)的 I/O 事件(如可读、可写、异常)。
适用场景:高并发连接(如 Web 服务器、即时通讯服务),单线程/单进程管理大量 Socket。
2. 工作原理
-
三种模式:
-
水平触发(LT):只要文件描述符就绪(有数据可读/可写),就会持续通知应用。
-
边缘触发(ET):仅在状态变化时通知一次(如从不可读变为可读),需一次处理完所有数据。
-
一次性触发(EPOLLONESHOT):事件被处理后需重新注册才能继续监听。
-
-
核心 API:
c
复制
下载
int epoll_create(int size); // 创建 epoll 实例 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); // 注册/修改监听事件 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); // 等待事件
3. 优势与局限
-
优点:
-
高效管理数十万并发连接(时间复杂度 O(1)
-