I/O 多路复用 (I/O Multiplexing) 允许单个线程同时监控多个连接。它是高性能服务器(如 Redis, Nginx)的核心基石。

核心逻辑

通过一次系统调用(如 select/epoll)将多个 文件描述符 (FD) 托管给内核监控,只有当连接真正“就绪”时才通知程序处理。

  1. 集中监控:不再是用户进程逐个轮询,而是内核批量监控。
  2. 事件驱动:当数据到达网卡,内核通过中断/回调机制识别就绪的 FD。
  3. 两阶段分离
    • 阶段一:阻塞在多路复用调用上,等待任一 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: 返回数据

机制演进

机制数据结构效率限制
select位图 (Bitmap) 遍历1024 限制
poll结构体数组 遍历无限制
epoll红黑树 + 就绪链表 回调性能最强 (Linux)

类比:去餐厅点餐,点完后回座位玩手机。前台有个大屏幕(多路复用器),哪份菜好了就会显示号码。你只需要盯着屏幕看一眼(一次调用),好了就去取。不用死等,也不用不停跑去问。