• 【Nginx】epoll事件驱动模块


    事件处理框架通过事件驱动机制来处理事件

    ngx_event_module 事件模块

    ngx_event_core_module 决定使用哪个事件驱动机制即事件驱动模块

    每个事件驱动模块都要实现ngx_event_module_t接口

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    当某个进程调用epoll_create方法时,linux内核会创建一个eventpoll结构体,这个结构体中有两个成员与epoll的使用方式密切相关。

    struct eventpoll

    {

      struct rb_root rbr;//红黑树的根结点,这棵树中存储着所有添加到epoll中的事件,也就是这个epoll监控的事件

      struct list_head rdllist;//双向链表rdllist保存着将要通过epoll_wait返回给用户的满足条件的事件

    };

    每一个epoll对象都有一个独立的eventpoll结构体,这个结构体会在内核空间中创造独立的内存,用于存储使用epoll_ctl方法向epoll对象中添加进来的事件。这些事件都会挂到rbr红黑树中,这样,重复添加的事件就可以通过红黑树高效地识别出来。

    当相应的事件发生时会调用这里的回调方法,这个回调方法在内核中叫做ep_poll_callback,它会把这样的事件放到上面的rdllist双向链表中。当调用epoll_wait检查是否有发生事件的连接时,只是检查eventepoll对象中的rdllist双向链表是否有epitem元素而已,如果rdllist链表不为空,则把这里的事件复制到用户态内存中,同时将事件数量返回给用户。

    ngx_epoll_module模块的实现

    static ngx_command_t ngx_epoll_commands[]=

    {

    //该配置项表示调用一次epoll_wait时最多可以返回的事件数,预分配对应epoll_event结构体用于存储事件

    {

    ngx_string("epoll_events"),

    NGX_EVENT_CONF|NGX_CONF_TANKE1,

    ngx_conf_set_num_slot,

    0,

    offsetof(ngx_epoll_conf_t,events),

    NULL

    },

    //指明在开启异步I/O且使用io_setup系统调用初始化异步I/O上下文环境时,初步分配的异步I/O事件个数

    {

    ngx_string("worker_aio_requests"),

    NGX_EVENT_CONF|NGX_CONF_TAKE1,

    ngx_conf_set_num_slot,

    0,

    offsetof(ngx_epoll_conf_t,aio_requests),

    NULL

    },

    ngx_null_command

    };

    存储配置项的结构体ngx_epoll_conf_t

    typedef struct

    {

      ngx_uint_t events;

      ngx_uint aio_requests;

    }ngx_epoll_conf_t;

    ngx_event_module_t事件模块接口

    static ngx_str_t epoll_name=ngx_string("epoll");

    ngx_event_module_t ngx_epoll_module_ctx=

    {

      &epoll_name,

      ngx_epoll_create_conf,

      ngx_epoll_init_conf,

      {

        ngx_epoll_add_event;

        ngx_epoll_del_event;

        ngx_epoll_add_event;

        ngx_epoll_del_event;

        ngx_epoll_add_connection,

        ngx_epoll_del_connection,

        NULL,

        ngx_epoll_process_events,

        ngx_epoll_init,

        ngx_epoll_done,

      }

    };

  • 相关阅读:
    虚拟机LUN扩大后,重新分区
    rm: cannot remove `/home/cn0000/log/formlog.20140417': Read-only file system
    sybase 备份和恢复
    全表扫描计算成本
    标量子查询 子查询执行次数计算公式
    left join 关联条件位置
    动态SQL使用绑定变量
    如何在SQLServer中处理每天四亿三千万记录的
    移动端UI一致性解决方案
    工业互联网中MES系统的重要性
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3865740.html
Copyright © 2020-2023  润新知