时间轮算法

时间轮是Linux中实现定时器的巧妙方式,也可以自己实现用于工程

可以参考http://www.ibm.com/developerworks/cn/linux/1308_liuming_linuxtime3/

和linux高性能服务器端编程的11.4.1


主要思想是构造一个轮->可以用循环列表实现,

插入:

新来一个定时事件,姑且视作包含定时时长和回调函数的类实例,算出还要转多少圈又多少step才转到,记录进实例

ticks = timeout / step
int pos = ( cur_slot + ( ticks % N ) ) % N
得到pos,即插入的位置(列表下标),ucr_slot为当前work的时间槽,step为时间轮的step,N为列表长度

把实例插入pos所在槽,每个槽对应一个链表

处理:

每次处理当前槽,遍历链表,检查时间是否超时,超时的则处理并删除,未超时的则圈数-1(圈数+step唯一确定一个定时事件)


只有一个时间轮则无法应付足够数量的定时事件,如有1~2^20个不同时间的,则一个时间轮就效率堪忧

这时可以考虑使用多个时间轮,模仿时钟进位的思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值