Epoll and Kqueue: How Operating Systems Learned to Wait Efficiently
4 hours ago
- I/O 最难的部分是知道何时停止等待,而不是读取数据,早期的操作系统对等待的处理很糟糕。
- select 和 poll 每次调用都需要扫描所有文件描述符,使得开销与连接数呈线性关系。
- epoll 和 kqueue 使用注册模型:只需告诉内核一次,内核在事件发生时通知,使得等待时间与活动量成比例。
- epoll(Linux)支持水平触发和边缘触发模式;kqueue(BSD)更通用,可监控文件、信号、定时器等。
- 这些 API 从用户空间轮询转向内核驱动通知,使得能够处理成千上万的连接。
- Go 的运行时代理使用 epoll/kqueue 来阻塞 goroutine 而不阻塞操作系统线程,透明地实现了大规模并发。