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来获取连接,因此并不需要实际释放这些内存,而通过指针的方式重复利用这些结构体。
本文转自:
http://hi.baidu.com/langwan/blog/item/c816b7355f575182a61e12bb.html。。。感谢浪湾先生
阅读(3225) | 评论(0) | 转发(0) |