Sunday面试指南

select、poll、epoll 有什么区别?I/O 多路复用到底在复用什么?

🧑‍💻 面试官:select、poll、epoll 有什么区别?

🙋‍♂️ 我:epoll 是 O(1),所以永远最快。

🧑‍💻 面试官:十条连接都持续活跃,和十万条连接只有少数活跃,是同一情况吗?

🙋‍♂️ 我:不是,负载特点也重要。

🧑‍💻 面试官:边缘触发只读了一半数据就继续等,为什么可能一直收不到新通知?

多路复用通知你哪些描述符可以操作;它不替你读数据,更不替你执行完业务。

面试速答(60 秒版)

select、poll 和 epoll 都能等待多个文件描述符的 I/O 状态。select 使用集合,常见 glibc fd_set 有大小限制;poll 使用描述符数组,没有同样的固定集合限制,但仍要处理扫描和传入的集合。

epoll 把关注集合保存在内核,并返回就绪事件,对大量连接、少量活跃的负载更合适,不能因此说任何操作和任何负载都 O(1)。

水平触发会在状态仍满足时继续通知;边缘触发强调状态变化,通常配合非阻塞 I/O,处理到 EAGAIN 再等待。否则残留数据可能被你漏在缓冲区里。

还要处理连接关闭、部分读写和公平性,业务中的阻塞工作应另行安排。

epoll 返回就绪描述符后,应用仍要完成读写和业务处理

知识点详解:从等待连接,到处理就绪事件

一个线程能等很多连接,不等于同时算很多任务

假设服务维护一万条连接,大多数时间没有新数据。为每条连接安排一个等待线程,会产生相应资源和调度成本。

多路复用让一个线程等一组描述符:哪些可读、可写或出现异常,就返回相关状态。之后仍由程序进行读取、解析和业务处理。

读就绪也可能表示对端关闭,不能认定一定拿到一条完整消息。网络协议的消息边界仍要自己处理。

区别不仅是一行复杂度

select 返回时会修改集合,循环中需要重新准备。常见 glibc 的 fd_set 还要求描述符编号小于 FD_SETSIZE;这不是整个操作系统最多只能开那么多文件。

poll 接收数组,避免同样的固定集合表示,但调用中仍涉及扫描。epoll 用注册、修改、等待分开管理兴趣集合,维护就绪事件。

选型要看连接规模、活跃比例、平台和实现成本。大量活跃连接对应的大量事件还是要处理,不能因为用了 epoll 就忽略吞吐和 CPU。

LT 和 ET 的差别,要用没读完的例子讲

假设连接缓冲里到了两 KB,你只读了一 KB。水平触发下,只要仍可读,后续等待仍会得到相应通知。

边缘触发下,不能指望剩余那一 KB 不变时必定产生新边沿。常见做法是使用非阻塞描述符,持续读到暂时无数据,也就是 EAGAIN,再回到等待。

但遇到一个一直有数据的连接,不能无限占着线程。公平性、待处理队列以及需要时的重新调度也要设计。

非阻塞是程序处理方式,不是业务自动异步

一次 read 或 write 可能只处理部分数据,要保存当前缓冲和进度。可写事件也不意味着任意大的内容能一次发送完。

如果事件循环里执行耗时压缩或阻塞数据库调用,其他连接依然会被拖住。多路复用改善等 I/O 的组织,不消除计算工作。

面试时把“等就绪”“读写数据”“处理业务”说成三步,就不会把 epoll 和完成型异步 I/O 混为一谈。

本题机制参考:select 手册、poll 手册、epoll 手册。

LT 会继续通知仍可读状态,ET 程序需要处理残留数据到 EAGAIN

面试官继续追问

epoll 是跨平台接口吗?

不是,本文讨论 Linux;其他系统有各自机制,跨平台框架会封装差异。

ET 下必须一次 read 读完吗?

不是一次调用,而是按非阻塞协议持续处理到 EAGAIN,并保留部分消息状态。

用了 epoll 就不阻塞了吗?

epoll_wait 本身可以阻塞等待;描述符和业务是否阻塞是另一个问题。

面试速记卡

  • 多路复用:等待多个描述符的就绪状态。
  • epoll:兴趣集合与就绪集合分开管理。
  • LT:满足条件继续通知;ET:注意状态变化。
  • ET 常规处理:非阻塞,处理到 EAGAIN。
  • 边界:就绪不等于读完,更不等于业务完成。

公司面试真题

真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。

  • 京东 · 数据开发 / 后端 · 校招

    I/O 多路复用怎样工作?(题意整理)

    京东数据开发工程师后端一面 ↗
    原帖发布于 2025-08-31(秋招记录)

  • 美团 · Java后端 · 实习

    Redis 的 I/O 多路复用机制如何工作?(题意整理)

    4.21美团Java实习一二面面经 ↗
    面试记录为 2020-04-21、2020-04-24;原帖编辑于 2020-11-14

  • 腾讯 · 开发(含 Agent 设计) · 原帖未明确批次

    I/O 多路复用怎样工作?(题意整理)

    腾讯一面面经 ↗
    页面显示 04-20 发布,未明确年份

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历