Nginx源代码分析-connection处理 【转】

来源:互联网 发布:权威的时尚杂志 知乎 编辑:程序博客网 时间:2024/05/17 23:50
很久没有更新博客了,发现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的人越来越多,朋友也会越来越多,挺好。

原创粉丝点击