褪尘矗心

epoll 可扩展 I/O 事件通知机制

学习 Go 实现支持百万连接的 websocket 服务器 1m-go-websockets 代码时,一处 fd, err := unix.EpollCreate1(0) 报错引起注意,原来是 Linux 专有的,epoll 是 Linux 内核的可扩展 I/O 事件通知机制,用于打造高性能服务器的 epoll 本质是怎样的呢!


原理

  • epoll 对象相当于是 socket 和进程之间的中介

  • 通过 epoll_ctl socket 添加到 eventpoll 的监听列表中(内核会将 eventpoll 添加到 socket 的等待队列中),当 socket 收到消息后,中断程序让 rdlist(eventpoll 的就绪列表)引用收到消息的 socket,当程序执行到 epol_wait 时,内核会将进程放入 eventpoll 的等待队列中,rdlist 不为空直接返回,否则阻塞进程。

  • 由于 rdlist 的存在,进程可以知道 socket 发生了变化

1

实现细节(数据结构)

  • 就绪队列需要快速插入和删除,因此选用双向链表

  • 索引结构方便添加、删除、搜索 -> 红黑树

    2

文章参考文献

如果这篇文章说不清 epoll 的本质,那就过来掐死我吧!(3)

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。