Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111313
  • 博文数量: 22
  • 博客积分: 596
  • 博客等级: 中士
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-17 15:32
文章分类

全部博文(22)

文章存档

2012年(1)

2011年(20)

2010年(1)

分类: 系统运维

2011-07-17 00:21:54

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。。。感谢浪湾先生
阅读(3165) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~