Nginx 定时器事件
概述
在 Nginx 中定时器事件的实现与内核无关。在事件模块中,当等待的事件不能在指定的时间内到达,则会触发Nginx 的超时机制,超时机制会对发生超时的事件进行管理,并对这些超时事件作出处理。对于定时事件的管理包括两方面:定时事件对象的组织形式 和 定时事件对象的超时检测。
定时事件的组织
Nginx 的定时器由红黑树实现的。在保存事件的结构体ngx_event_t 中有三个关于时间管理的成员,如下所示:
struct ngx_event_s{
...
unsigned timedout:1;
unsigned timer_set:1;
ngx_rbtree_node_t timer;
...
};
Nginx 设置两个关于定时器的全局变量。在文件src/event/ngx_event_timer.c中定义:
ngx_thread_volatile ngx_rbtree_t ngx_event_timer_rbtree;
static ngx_rbtree_node_t ngx_event_timer_sentinel;
这棵红黑树的每一个节点代表一个事件 ngx_event_t 结构体中的成员timer,ngx_rbtree_node_t 节点代表事件的超时时间,以这个超时时间的大小组成的红黑树ngx_event_timer_rbtree,则该红黑树中最左边的节点代表最可能超时的事件。
定时器事件初始化实际上调用红黑树的初始化,其在文件 src/event/ngx_event_timer.c中定义:
定时事件的超时检测
当需要对某个事件进行超时检测时,只需要将该事件添加到定时器红黑树中即可,由函数 ngx_event_add_timer,将一个事件从定时器红黑树中删除由函数 ngx_event_del_timer 实现。以下的函数都在文件 src/event/ngx_event_timer.h中定义:
判断一个函数是否超时由函数 ngx_event_find_timer 实现,检查定时器所有事件由函数ngx_event_expire_timer 实现。以下的函数都在文件src/event/ngx_event_timer.c中定义:
参考资料
《深入剖析Nginx》
《深入理解Nginx》
Last updated
Was this helpful?