zoukankan      html  css  js  c++  java
  • 剖析epoll机制

    剖析epoll机制

    • Linux epoll机制;
    • 写这篇文章的原因是, 上次百度面试被问到一个事件怎么添加到epoll的双向链表中的; 这个问题比较深入, 涉及到内核的实现问题, 今天就来理解一下;
    • epoll和select/poll完全不同, epoll通过在Linux内核中申请一个简易的文件系统(文件系统一般用什么实现? B+树);
      • B+树, 相当于一个2-3的扩展, 一个节点可以有多个数据项, B+树而且它的叶子结点才有真正的数据, 并用一个单链表链接起来的;
    • epoll调用分成3个部分:
      • 调用epoll_create()建立一个epoll对象(在epoll文件系统中为这个句柄对象分配资源);
      • 调用epoll_ctl向epoll对象中添加或删除一些套接字;
      • 调用epoll_wait收集发生的事件的连接;
        • epoll_wait的调用非常高, 因为调用epoll_wait时, 并没有向操作系统复制连接的句柄数据, 内核不需要遍历全部的连接;
    • epoll_create会创建一个eventpoll结构体, 这个结构体中有两个成员与epoll的使用方式密切相关;
      • struct rb_root rbr; //红黑树的根节点, 这棵树中存储着所有添加到epoll中的需要监控的事件
      • epoll机制通过红黑树保存需要监控的事件;
      • struct list_head rdlist; // 双链表中存放着将要通过epoll_wait返回给用户的满足条件的活跃事件;
      • epoll机制通过一个双链表来保存活跃的事件;
    • 每一个epoll对象都有一个独立的eventpoll结构体, 用于存放通过epoll_ctl方法向epoll向epoll对象中添加进来的事件;
      • 这些事件都会被挂载在红黑树中, 重复添加的事件就可以通过红黑树而高效的识别出来(红黑树的插入时间效率是lgn, 其中n为树的高度);
      • 而所有添加到epoll中的事件都会与设备(网卡)驱动程序建立回调关系, 也就是说, 当相对应的事件发生时会调用这个回调方法;
      • 这个回调方法在内核中叫ep_poll_callback, 它将发生的事件添加到rdlist双链表中;
    • 在epoll中, 对于每一个事件, 都会建立一个epitem结构体;
        struct epitem{
            struct rb_node  rbn;            //红黑树节点
            struct list_head    rdllink;    //双向链表节点
            struct epoll_filefd  ffd;       //事件句柄信息
            struct eventpoll *ep;           //指向其所属的eventpoll对象
            struct epoll_event event;       //期待发生的事件类型
        }
    
    • 当调用epoll_wait检查是否有事件发生时, 只需要检查eventpoll对象中的rdlist双向链表中是否有epitem元素即可;
      • 如果红黑树不为空, 则把发生的事件复制到用户态, 同时把事件的数量返回给用户;
      • 双向链表的每个节点都是基于epitem结构中的rdlink成员;
      • 红黑树中的每个节点都是基于eptiem结构体中的rbn成员;
    • 通过红黑树和双向链表数据结构, 并结合回调机制, 照就了epoll的高效;
    • 怎么把事件添加到双向链表中?
      • 在调用epoll_ctl时, 如果增加socket句柄, 则检查在红黑树中是否存在, 如果存在则立即返回, 不存在则添加到树干上, 然后向内核注册回调函数, 回调函数用于当中断事件来临时向准备就绪链表中插入数据;
      • 那意思是中断函数会自动调用回调函数, 然后向准备就绪的双向链表中插入数据, 把就绪的事件加入到双向链表中;
    • nginx的epoll;
  • 相关阅读:
    Oracle 组件 系列 小结
    Oracle Data Mining 组件 说明
    GIS空间索引(有了思路代码还不是手到擒来)
    完成端口与高性能服务器程序开发(转)
    const? const ! 全解
    服务器架构
    SDL 源码分析(2)
    数据结构个算法学习笔记(2)
    高性能服务器架构 的几个注意点 (HighPerformance Server Architecture)
    GIS底层开发总结
  • 原文地址:https://www.cnblogs.com/longjiang-uestc/p/9658007.html
Copyright © 2011-2022 走看看