探讨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都触发该事件
posted @ 2020-07-31 16:58  阿龙233  阅读(5115)  评论(0编辑  收藏  举报