Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1004262
  • 博文数量: 87
  • 博客积分: 3324
  • 博客等级: 中校
  • 技术积分: 1003
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-17 11:37
文章分类

全部博文(87)

文章存档

2014年(3)

2013年(5)

2012年(21)

2011年(13)

2010年(7)

2009年(9)

2008年(4)

2007年(14)

2006年(11)

分类: C/C++

2012-08-14 10:47:59

在任何应用服务器中,处理会话的过程中,总是会涉及到超时管理,因为不能保证所有的会话都正常工作,没有由于网络错误,程序错误、恶意攻击引起的不正常情况。

对于超时管理一般有2中处理方式:
(1)每个会话有一个时间记录,定期统一进行检查和处理。
(2)为每个会话设立一个定时器,每个会话的定时器到期以后,处理自己的。

处理方式(1)的优点是对系统资源的消耗(CPU)比较低,缺点是超时误差比较大,不能最及时的处理超时的会话。处理方式(2)的有点是处理超时会话比较及时,但是CPU计算消耗比较多。

在Nginx中,使用哪种方式来管理超时,是可以配置的. 配置项 timer_resolution为0时,Nginx使用方式(2),非0时,Nginx使用方式(1)。

对这些超时信息进行管理需要选择合适的数据结构。但无论选择什么数据结构,任务都是能够完成的,无非是效率高低的问题。管理超时信息主要是要满足这几个操作,找到距离当前时间最近的超时项,插入新的超时项,删除指定的超时项。

对于这个数据结构,Nginx使用的是RB-Tree. 这令人有点费解,实际上这并不是最优的,最适合这里的应该是heap。

插入,删除操作,RB-Tree和Heap的时间复杂度都是O(logN). 但是查找最小,最大节点的时间复杂度RB-Tree是O(logN), 而heap只有O(1)。




阅读(4350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~