探讨epoll原理(红黑树、rdlist的实现)
再谈epoll
-
原理
- 关键概念:eventpoll结构体(fd管理器)、ep_poll_callback(回调)、rdlist(双向链表)、epitem(epoll管理的结点)
- 每个epoll对象都有一个独立的eventpoll结构体,通过eventpoll管理存放epoll_ctl添加的事件集合,这些事件以epitem为结点挂载到红黑树上。添加到epoll中的事件,都会与设备驱动建立回调关系,当相应事件发生时该回调将事件对应的epitem结点加入rdlist即可;
- 因此,当用户调用epoll_wait是指上内核只检查了rdlist是否为空,若非空将其拷贝到用户态并返回触发事件数量。
- 可以说:红黑树+rdlist+回调铸就了epoll的高效。
-
为何支持百万并发
- 不用重复传递事件集合
- epoll初始化时,内核开辟了epoll缓冲区,缓冲区内事件以epitem结点挂载到红黑树上,通过epoll_ctl的任何操作都是O(logN)
- epoll_wait调用仅需观察rdlist是否为空,若非空则拷贝rdlist到用户空间并返回触发事件数量,无需遍历
- 向内核中断处理注册回调,一旦关心的事件触发,回调自动将socket对应的epitem添加到rdlist中
-
ET和LT,来自电子的概念
- ET边沿触发:无论事件是否处理完毕,仅触发一次
- LT水平触发:只要事件没有处理完毕,每一次epoll_wait都触发该事件