在二十一节中,提到过调用ngx_eventfind_timer()获取timer,然后传递给epoll模块,做等待时间,今天我们主要讲解下这个方法。
本文来自于:http://blog.csdn.net/lengzijian
nginx中的timer用红黑树的结构排序。ngx_event_timer_rbtree就是nginx中timer的红黑树。
1.下面我们来看一下ngx_event_timer_rbtree的结构:
src/core/ngx_rbtree.h
typedef struct ngx_rbtree_s ngx_rbtree_t;
typedef void (*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root,
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
struct ngx_rbtree_s {
ngx_rbtree_node_t *root; //根节点
ngx_rbtree_node_t *sentinel; //哨兵节点
ngx_rbtree_insert_pt insert; //插入方法指针
};
2.树中节点的结构:
src/core/ngx_rbtree.h
typedef ngx_uint_t ngx_rbtree_key_t;
typedef ngx_int_t ngx_rbtree_key_int_t;
typedef struct ngx_rbtree_node_s ngx_rbtree_node_t;
struct ngx_rbtree_node_s {
ngx_rbtree_key_t key;
ngx_rbtree_node_t *left; //左节点
ngx_rbtree_node_t *right; //右节点
ngx_rbtree_node_t *parent; //父节点
u_char color; //当前节点颜色
u_char data; //当前节点数据
};
3.ngx_event_find_timer函数:
src/event/ngx_event_timer.c
ngx_msec_t
ngx_event_find_timer(void)
{
ngx_msec_int_t timer;
ngx_rbtree_node_t *node, *root, *sentinel;
//如果根节点地址等于哨兵将节点地址,返回-1
if (ngx_event_timer_rbtree.root == &ngx_event_timer_sentinel) {
return NGX_TIMER_INFINITE;
}
//对ngx_event_timer_mutex上锁
ngx_mutex_lock(ngx_event_timer_mutex);
root = ngx_event_timer_rbtree.root;
sentinel = ngx_event_timer_rbtree.sentinel;
//获取最小的timer界定
node = ngx_rbtree_min(root, sentinel);
//解锁
ngx_mutex_unlock(ngx_event_timer_mutex);
//用最小值的timer节点的值减去ngx_current_mses值
timer = (ngx_msec_int_t) node->key - (ngx_msec_int_t) ngx_current_msec;
return (ngx_msec_t) (timer > 0 ? timer : 0);
}
nginx中,当前所有可能被触发的定时器被保存在红黑树这种数据结构中,通过红黑树,你可以很快的得到距离当前最快发生的定时器时间的时间差,将这个时间差作为select/poll/epoll等函数的参数,也就是说最多等待这么长时间就返回。得到函数调用总共花费了多少时间,根据这个时间取出红黑树的根节点比较查看是否应该触发该定时器时间,如果可以,则将定时器从红黑树中删除,然后继续查看新的成为树根的定时器的节点,这个过程一直进行下去,知道没有定时器满足被触发条件,也就是还没有被触发的事件。
nginx中,新接收了一个连接,就会保存这个连接上来的时间,并且以这个时间来加入红黑树定时器。
分享到:
相关推荐
Nginx 源码分析笔记 自己的源码分析笔记,未完。
自己的nginx源码学习资料,包含《Nginx模块开发指南》和《深入理解Nginx》等,方便初学者了解nginx设计思想以及源码
nginx学习笔记.zip
nginx源码nginx源码nginx源码nginx源码nginx源码nginx源码nginx源码nginx源码nginx源码nginx源码
nginx源码说明;其他下载即可,没下载分了,大家互相帮忙。其他情况大概就这些吧,其他也没什么好说的了,看文档即可
nginx笔记nginx笔记nginx笔记nginx笔记nginx笔记nginx笔记nginx笔记nginx笔记
Nginx学习笔记
收集的 nginx 源码 解析 ,非常全 architecture.png Emiller的Nginx模块开发指南.docx Nginx(en).pdf nginx@taobao.pdf nginx_internals.pdf nginx核心讲解(0.2).doc nginx核心讲解(0.4).doc Nginx模块开发指南中文...
Nginx模块源码 nginx-notice-2 一只小麻雀。 通过Post的方式取文件 Nginx 0.7 可编译。
mac无坑安装nginx(csdn)————程序
带有详细注释的nginx源码,能帮你有效地阅读和学习nginx源码
这是我自学nginx的学习笔记,上传只是为了更好的督促自己学习,如果你也有同感,加入一起学习吧。
nginx1.12.2源码、pcre-8.4.3源码、zlib-1.2.11源码包、openssl-1.0.2r源码包、echo-nginx-module-master模块源码、headers-more-nginx-module-master源码包、ngx_http_substitutions_filter_module源码包;...
Nginx教程
压缩包内有四个版本的nginx,可根据自己的需求安装相应的软件包。使用方法:下载资源包--->将需要的版本导入到linux主机中--->tar解压得到nginx源码包--->源码编译安装
Nginx配置文件——一级域名、二级域名
本人在银行工作,基于生产环境搭建方法编写的Nginx源码安装手册,生产环境可参考此手册。
在第二部分中,通过具体使用实例讲述了Nginx的模块(包括官方模块和第三方模块),并详细介绍了充分使用Nginx的方式方法。同时在这里使用了Heartbeat服务实现Nginx服务器的高可用。 本书的最后一部分是关于...
nginx源码,1.0版本的,适合学习nginx的工作原理,欢迎码农朋友们下载学习。
Windows下编译Nginx并添加模块,在项目中使用过的