Nginx源代码分析-connection处理
2014-03-24 22:34
148 查看
转载自:http://hi.baidu.com/langwan
很久没有更新博客了,发现
NginxCodeReview 更新了一些新的内容。用wiki方法展现的确感觉更清晰,看到RainX他们自己写了一个ep_server的demo,突然想到除了event处理以外,对connection的处理也是其中一个关键。
最近也尝试了用java写server服务器,用其自带的ExecutorService的确很轻松可以写一个很不错的server。因此未来对server的研究也不局限什么语言,算法上其实大同小异,而且也可以借鉴java中的一些成熟算法。毕竟java的算法也是很考究的。
connection的处理办法各server系统不同,nginx使用的是最简单的单向链表,写的不太好的server其connection结构总是不断的申请释放。nginx通过链表的方式对connection是重用的。这一点是很不错的。
nginx当中有关于connection的设置worker_connections,例如:
worker_connections 1024;
用于设置connection的数量,先看一下nginx对connection处理的过程,如图
首先nginx依据worker_connections的设置,一次性在pool当中初始化一定数量的ngx_connection_t结构,例如8个,我只是举例子。这个过程是在ngx_event_process_init()函数中完成的。初始化的时候令所有的c->data指向下一个connection直到最后一个指向NULL。
当我们需要获取一个连接的时候会调用ngx_get_connection()函数获取一个未被使用的ngx_connection_t结构,实际上就是调用一个特别的指针ngx_cylcle->free_connections所指向的位置。
第一次申请的时候被指向位置0,这样位置0被取出使用。连续3次使用ngx_get_connection()方法3个connction被使用ngx_cycle->free_connections指向下一个connection。
我们假设1位置的connection首先调用ngx_free_connection()获得释放,这时候位置1的data指针跳过位置2指向位置3。自己成为free_connections。如果这时候需要继续分配connection,会分配1,在分配3,后面的顺序如果还没有被打乱过。那么继续分配。
如果继续释放,那么data指针会根据释放的顺序,重新分配指针,但总保证这是一个完全连接着的单向链表结构。
ngx_get_connection()函数实际上是根据,free_connections来获取连接,因此并不需要实际释放这些内存,而通过指针的方式重复利用这些结构体。
很久没有更新博客了,发现
NginxCodeReview 更新了一些新的内容。用wiki方法展现的确感觉更清晰,看到RainX他们自己写了一个ep_server的demo,突然想到除了event处理以外,对connection的处理也是其中一个关键。
最近也尝试了用java写server服务器,用其自带的ExecutorService的确很轻松可以写一个很不错的server。因此未来对server的研究也不局限什么语言,算法上其实大同小异,而且也可以借鉴java中的一些成熟算法。毕竟java的算法也是很考究的。
connection的处理办法各server系统不同,nginx使用的是最简单的单向链表,写的不太好的server其connection结构总是不断的申请释放。nginx通过链表的方式对connection是重用的。这一点是很不错的。
nginx当中有关于connection的设置worker_connections,例如:
worker_connections 1024;
用于设置connection的数量,先看一下nginx对connection处理的过程,如图
首先nginx依据worker_connections的设置,一次性在pool当中初始化一定数量的ngx_connection_t结构,例如8个,我只是举例子。这个过程是在ngx_event_process_init()函数中完成的。初始化的时候令所有的c->data指向下一个connection直到最后一个指向NULL。
当我们需要获取一个连接的时候会调用ngx_get_connection()函数获取一个未被使用的ngx_connection_t结构,实际上就是调用一个特别的指针ngx_cylcle->free_connections所指向的位置。
第一次申请的时候被指向位置0,这样位置0被取出使用。连续3次使用ngx_get_connection()方法3个connction被使用ngx_cycle->free_connections指向下一个connection。
我们假设1位置的connection首先调用ngx_free_connection()获得释放,这时候位置1的data指针跳过位置2指向位置3。自己成为free_connections。如果这时候需要继续分配connection,会分配1,在分配3,后面的顺序如果还没有被打乱过。那么继续分配。
如果继续释放,那么data指针会根据释放的顺序,重新分配指针,但总保证这是一个完全连接着的单向链表结构。
ngx_get_connection()函数实际上是根据,free_connections来获取连接,因此并不需要实际释放这些内存,而通过指针的方式重复利用这些结构体。
相关文章推荐
- Nginx源代码分析-connection处理 【转】
- nginx源代码分析 - 收到请求(一) accept处理事件
- Nginx源代码分析 - 日志处理
- Nginx源代码分析 - 日志处理
- MATLAB图像处理_Bayer图像处理 & RGB Bayer Color分析
- x86 kernel 中断分析三——中断处理流程
- 病毒SoftUpdate.exe、37211.dll的分析与处理
- jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween
- ViewPager源码分析(2):滑动及冲突处理
- Android异步消息处理机制详解及源码分析
- 【redis】常见JedisConnectionException异常分析
- 处理、分析iOS App的Crash Reports
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Tomcat处理HTTP请求源码分析
- Oracle_12c_RAC_service_died问题分析处理
- (M)Android消息处理机制分析之Looper类解析
- Android应用程序消息处理机制(Looper、Handler)源码分析
- 关于springmvc执行的流程和处理过程分析
- (转)android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 深入理解Spark 2.1 Core (四):运算结果处理和容错的原理与源码分析