C++面试题更新 2026-08-05

请解释 socket 多路复用的概念,并说明 epoll 相比其他方案有哪些优势?

技术原理方案权衡Linux

考察说明

考查对 I/O 多路复用机制的理解及 epoll 特性的掌握。

回答思路

  1. 【回答框架 1】I/O 多路复用指单个线程通过监视多个文件描述符,当其中任一就绪时通知程序处理,避免阻塞等待,常见方案有 select、poll 和 epoll。
  2. 【回答框架 2】epoll 的优势包括:支持大量连接时性能稳定,使用红黑树管理监听集合,通过事件驱动回调避免遍历全部 fd;支持水平触发和边缘触发模式,边缘触发可减少重复通知;使用 mmap 加速内核与用户空间数据传递。
  3. 【回答框架 3】epoll 通过 epoll_ctl 注册、epoll_wait 等待事件,返回就绪列表,复杂度为 O(就绪数),而 select/poll 需遍历全部 fd,复杂度 O(n)。
  4. 【回答框架 4】适用场景:高并发、长连接、活跃连接少的服务器,如 Web 服务器、聊天系统。
  5. 【回答框架 5】注意 epoll 是 Linux 特有,跨平台需考虑 kqueue 或 IOCP。
  6. 【关键点 1】epoll 使用事件驱动,复杂度 O(就绪数),优于 select/poll 的 O(n)。
  7. 【关键点 2】支持边缘触发模式,减少系统调用次数。
  8. 【关键点 3】通过 mmap 共享内存,减少数据拷贝。
  9. 【关键点 4】仅适用于 Linux,跨平台需其他方案。
  10. 【易错点 1】边缘触发模式下需循环读取直到 EAGAIN,否则可能漏掉数据。
  11. 【易错点 2】epoll 不能用于普通文件,仅支持 socket 等可轮询设备。
  12. 【易错点 3】不要误以为 epoll 一定比 select 快,连接数少时 select 可能更简单高效。