本章我们介绍一下nginx epoll模块的实现。
1. NGX_TEST_BUILD_EPOLL测试
上面只是用于测试epoll能不能编译过,这里不做介绍。
2. ngx_epoll_conf_t数据结构
此数据结构用于保存epoll配置文件中相应的配置信息:
- events: 用于指示epoll_wait每次能处理的最大事件数。
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
- aio_requests: 当aio搭配epoll事件驱动机制一起使用时,单个worker进程最大的未完成异步IO操作数。(在v1.1.4和1.0.7中出现,当前我们并不使用aio)
3. 相关静态函数声明
4. 相关变量声明
下面我们简要介绍一下这些变量:
-
ep: 存放epoll_create创建的句柄对象
-
event_list: 存放epoll_wait()获取到的事件
-
nevents: event_list长度
-
notify_fd: 用于发送或接收通知的fd
-
notify_event: 通知事件
-
notify_conn: notify所关联的ngx_connection_t对象
-
ngx_eventfd: aio相关的fd,epoll监控此文件句柄。当前不支持NGX_HAVE_FILE_AIO
-
ngx_aio_ctx: aio所关联的上下文对象。当前不支持NGX_HAVE_FILE_AIO
-
ngx_eventfd_event: aio所关联的事件。当前不支持NGX_HAVE_FILE_AIO
-
ngx_eventfd_conn: aio所关联的ngx_connection_t对象。当前不支持NGX_HAVE_FILE_AIO
-
epoll_name: 只是epoll模块的名称
-
ngx_epoll_commands: epoll模块所支持的指令
-
ngx_epoll_module_ctx: epoll模块所关联的上下文对象
-
ngx_epoll_module: epoll模块对象
6. aio操作相关
我们当前不支持aio,这里不做介绍。
7. 函数ngx_epoll_init()
此函数会在epoll模块初始化时被调用。下面我们简要分析一下函数的实现:
8. 函数ngx_epoll_notify_init()
本函数用于初始化事件通知机制,用来实现多进程或多线程的之间的等待/通知通知机制(与pipe功能类似)。请参看eventfd 的分析与具体例子。本函数较为简单,这里不做介绍。
9. 函数ngx_epoll_notify_handler()
当接收到eventfd发送来的通知事件时,会调用此函数。每获取到一次通知,ev->index的值就会加1,当达到最大时就会调用read()函数一次读出。
10. 函数ngx_epoll_done()
当nginx epoll事件驱动机制退出时,调用此方法相应的系统资源。
11. 函数ngx_epoll_add_event()
本函数用于实现向epoll事件驱动机制中添加相应的事件。下面我们简要分析一下函数的实现:
12. 函数ngx_epoll_del_event()
本函数用于从epoll事件驱动机制中移除一个事件。下面我们简要分析一下函数的实现:
12. 函数
将一个connection(连接)添加到事件驱动机制中,连接上的读、写事件即被加入到了事件驱动机制中
13. 函数ngx_epoll_del_connection()
从事件驱动机制中删除一个连接的读、写事件。这里注意,如果关闭连接的话,则让操作系统自动的将相应的事件移除
14. 函数
使用eventfd向外发出通知。
15. 函数
此函数作为epoll事件驱动机制处理事件的主函数。下面我们简要分析一下函数的实现:
16. 函数ngx_epoll_eventfd_handler()
当前我们不支持aio,这里不做介绍。
17. 函数ngx_epoll_create_conf()
本函数用于创建epoll模块所需要的配置信息。
18. 函数ngx_epoll_init_conf()
本函数用于默认初始化epoll的配置。
[参看]
-
nginx events
-
nginx event 模块解析
-
Nginx学习笔记(十八):事件处理框架
-
事件和连接
-
eventfd 的分析与具体例子
-
EVENTFD
-
事件模块(二)ngx_epoll_module详解
-
Linux下的I/O复用与epoll详解
-
Nginx配置详解
-
linux下syscall函数 间接系统调用