概述
在 Nginx 中定时器事件的实现与内核无关。在事件模块中,当等待的事件不能在指定的时间内到达,则会触发 Nginx 的超时机制,超时机制会对发生超时的事件进行管理,并对这些超时事件作出处理。对于定时事件的管理包括两方面:定时事件对象的组织形式 和 定时事件对象的超时检测。
定时事件的组织
Nginx 的定时器由红黑树实现的。在保存事件的结构体 ngx_event_t 中有三个关于时间管理的成员,如下所示:
struct ngx_event_s{
...
/* 标志位,为1表示当前事件已超时 */
unsigned timedout:1;
/* 标志位,为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,则该红黑树中最左边的节点代表最可能超时的事件。
定时器事件初始化实际上调用红黑树的初始化,其在文件