Nginx 的 epoll 事件驱动模块
概述
在前面的文章中《Nginx 事件模块》介绍了Nginx 的事件驱动框架以及不同类型事件驱动模块的管理。本节基于前面的知识,简单介绍下在Linux 系统下的 epoll 事件驱动模块。关于 epoll 的使用与原理可以参照文章 《epoll 解析》。在这里直接介绍Nginx 服务器基于事件驱动框架实现的epoll 事件驱动模块。
ngx_epoll_module 事件驱动模块
ngx_epoll_conf_t 结构体
ngx_epoll_conf_t 结构体是保存ngx_epoll_module 事件驱动模块的配置项结构。该结构体在文件src/event/modules/ngx_epoll_module.c 中定义:
typedef struct {
ngx_uint_t events;
ngx_uint_t aio_requests;
} ngx_epoll_conf_t;
ngx_epoll_module 事件驱动模块的定义
所有模块的定义都是基于模块通用接口 ngx_module_t 结构,ngx_epoll_module 模块在文件src/event/modules/ngx_epoll_module.c 中定义如下:
ngx_module_t ngx_epoll_module = {
NGX_MODULE_V1,
&ngx_epoll_module_ctx,
ngx_epoll_commands,
NGX_EVENT_MODULE,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NGX_MODULE_V1_PADDING
};
在 ngx_epoll_module 模块的定义中,其中定义了该模块感兴趣的配置项ngx_epoll_commands 数组,该配置项数组在文件src/event/modules/ngx_epoll_module.c 中定义:
在 ngx_epoll_module 模块的定义中,定义了该模块的上下文结构ngx_epoll_module_ctx,该上下文结构是基于事件模块的通用接口ngx_event_module_t 结构来定义的。该上下文结构在文件src/event/modules/ngx_epoll_module.c 中定义:
在 ngx_epoll_module 模块的上下文事件接口结构中,重点定义了ngx_event_actions_t 结构中的接口回调方法。
ngx_epoll_module 事件驱动模块的操作
ngx_epoll_module 模块的操作由ngx_epoll_module 模块的上下文事件接口结构中成员actions 实现。该成员实现的方法如下所示:
ngx_epoll_module 模块的初始化
ngx_epoll_module 模块的初始化由函数ngx_epoll_init 实现。该函数主要做了两件事:创建epoll 对象 和 创建 event_list 数组(调用epoll_wait 函数时用于存储从内核复制的已就绪的事件);该函数在文件src/event/modules/ngx_epoll_module.c 中定义:
ngx_epoll_module 模块的事件处理
ngx_epoll_module 模块的事件处理由函数ngx_epoll_process_events 实现。ngx_epoll_process_events 函数是实现事件收集、事件发送的接口。该函数在文件src/event/modules/ngx_epoll_module.c 中定义:
ngx_epoll_module 模块的事件添加与删除
ngx_epoll_module 模块的事件添加与删除分别由函数ngx_epoll_add_event 与ngx_epoll_del_event 实现。这两个函数的实现都是通过调用epoll_ctl 函数。具体实现在文件 src/event/modules/ngx_epoll_module.c 中定义:
ngx_epoll_module 模块的连接添加与删除
ngx_epoll_module 模块的连接添加与删除分别由函数ngx_epoll_add_connection 与ngx_epoll_del_connection 实现。这两个函数的实现都是通过调用epoll_ctl 函数。具体实现在文件 src/event/modules/ngx_epoll_module.c 中定义:
ngx_epoll_module 模块的异步 I/O
在 Nginx 中,文件异步 I/O 事件完成后的通知是集成到 epoll 对象中。该模块的文件异步I/O 实现如下:
参考资料:
《深入理解Nginx》
Last updated
Was this helpful?