高性能服务器--定时器

来源:互联网 发布:巩义共赢网络是什么 编辑:程序博客网 时间:2024/04/17 04:38

0x01 缘由

    最近在复习高性能服务器开发,有复习到了定时器这个技能,于是再次理解和复习下。

0x02 介绍

    概念:
    定时:指一段时间之后触发某段代码的机制,在这段代码中依次处理所有到期的定时器。
    定时器:封装定时相关操作和主要逻辑。
    定时器容器:上面管理很多定时器。

0x03 定时器容器

    时间轮:
        
        时间轮内,实线指向轮子的一个槽(slot),它以恒定的速度顺时针转动,每转动一步就指向下一个槽(虚线指向的槽),每次转动称为一个滴答(tick)。一个滴答的时间称为时间轮的槽间隔si(slot interval),它实际上就是心博时间。该时间轮共有N个槽,因此它运转一周的时间是N*si。每个槽指向一条定时器链表,每条链表上的定时器具有相同的特征:它们的定时时间相差N*si的整数倍。时间轮正式利用这个关系将定时器散列到不同的链表中。假如现在指针指向槽cs,我们要添加一个定时时间为ti的定时器,则该定时器将被插入槽ts(timer slot)对应的链表中:
        ts = (cs + (ti/si)) % N
    对于时间轮而言,要提高定时精度,就要使si值足够小;要提高执行效率,则要求N值足够大。
    时间堆:
    时间轮是以固定的频率调用心博函数tick,并在其中依次检测到期的定时器,然后执行到期定时器上的回调函数。另一种思路:将所有定时器中超时时间最小的一个定时器的超时值作为心博间隔。这样,一旦心博函数tick被调用,超时间最小的定时器必然到期,问就可以在tick函数中处理该定时器。然后,再次从剩余的定时器中找出超时时间最小的一个,并将这段最小时间设置为下一次心博间隔。如此反复,就被实现了较为精确的定时。  
    数据结构中最小堆非常适合这种方案。

0x04 使用场景

    使用在需要特殊处理的场景:
        如定时回收内存,定时删除超时流,定时销毁相关结构,游戏中相关物品有效期等。

0x05 总结

    此处不做源码说明,因为有大量的开源代码,不再次重复造轮子,仅掌握思路和方向。
原创粉丝点击