I/O 多路复用 (I/O Multiplexing) 允许单个线程同时监控多个连接。它是高性能服务器(如 Redis, Nginx)的核心基石。
核心逻辑
通过一次系统调用(如 select/epoll)将多个 文件描述符 (FD) 托管给内核监控,只有当连接真正“就绪”时才通知程序处理。
- 集中监控:不再是用户进程逐个轮询,而是内核批量监控。
- 事件驱动:当数据到达网卡,内核通过中断/回调机制识别就绪的 FD。
- 两阶段分离:
- 阶段一:阻塞在多路复用调用上,等待任一 FD 就绪。
- 阶段二:FD 就绪后,调用
read/recv拷贝数据(此阶段依然阻塞)。
执行流程 (Epoll)
sequenceDiagram participant U as 用户进程 participant K as 内核 (Kernel) U->>K: epoll_ctl (注册多个 FD) U->>K: epoll_wait (等待事件) Note over K: 监控红黑树中的所有 FD K-->>U: 返回就绪的 FD 列表 U->>K: recv (读取就绪数据) K->>U: 返回数据
机制演进
类比:去餐厅点餐,点完后回座位玩手机。前台有个大屏幕(多路复用器),哪份菜好了就会显示号码。你只需要盯着屏幕看一眼(一次调用),好了就去取。不用死等,也不用不停跑去问。