← 中文资源

简体中文版本

就绪 API:epoll 与 kqueue

就绪 API 只报告哪些文件描述符已可读写而不阻塞,让单线程监管成千上万套接字——是事件驱动服务器的内核基石。

阅读英文原文

概念定义

阻塞 I/O 每连接一条线程。就绪 API 反转模型:一次性注册全部套接字,询问哪些就绪,只对就绪者行动。内核维护兴趣集,应用循环处理紧凑的就绪列表。

工作机制

epoll_ctl 把描述符加入兴趣集,epoll_wait 返回带事件标志的就绪子集。水平触发在消费前持续报告;边缘触发每次状态跳变只通知一次,应用必须读写到 EAGAIN。EPOLLONESHOT 按事件重新武装,服务于多线程 worker。

使用场景

理解事件循环机制、诊断多慢客户端下的饥饿、选择循环库。多数人经由运行时间接使用它,但它的语义解释了公平性缺陷与 CPU 空转行为。

常见误区

epoll 做的是“就绪驱动”不是“异步完成”——就绪意味着“现在可以试”,调用仍可能部分读写或返回 EAGAIN。边缘触发不排干到 EAGAIN 会永久丢事件;跨 fork 继承的描述符与描述符耗尽在规模上咬人;多线程事件循环必须 ONESHOT 或显式交接,避免两个 worker 同时操作一个套接字。单线程能“监管”全部套接字,工作仍需线程池并行。