Nginx定时器事件是由自身实现的,与内核无关,它的底层维护着一颗红黑树。红黑树所有的节点都是有序的,只需要判断最小的那个节点(最左边的节点)是否超时,如果没有超时,那么意味着所有节点都没有超时。反之,调用回调函数,再从红黑树中删除该节点。
定时器的整体流程
定时器会每隔一定的时间调用ngx_event_expire_timers函数,该函数会处理所有已触发的事件。而调用该函数的频率可以通过ngx_event_find_timer函数计算。
ngx_rbtree_min
ngx_rbtree_min函数是用来找到最小的节点,其实就是遍历最左边的节点。
static ngx_inline ngx_rbtree_node_t *
ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
{
while (node->left != sentinel) {
node = node->left;
}
return node;
}
ngx_event_find_timer
ngx_event_find_timer函数调用了ngx_rbtree_min,查看最小节点是否超时,超时了返回0,否则返回剩余时间。
ngx_event_expire_timers
ngx_event_expire_timers函数用来检查所有已触发的事件,调用他们的回调函数,然后再从红黑树中删掉。以下是该函数的流程图。