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 发生了变化
实现细节(数据结构)
就绪队列需要快速插入和删除,因此选用双向链表
索引结构方便添加、删除、搜索 -> 红黑树
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。