-
Notifications
You must be signed in to change notification settings - Fork 40
Open
Description
目标
- 用go使用5级时间轮实现定时器
- 如有可能效率追求fast fast fast
参考资料
- https://blog.csdn.net/musicml/article/details/103878367 (good)
- https://www.zhihu.com/question/38427301 (good)
- https://www.cnblogs.com/newbeeyu/p/9022623.html(good)
论文
http://www.cs.columbia.edu/~nahum/w6998/papers/ton97-timing-wheels.pdf
参考项目
- linux kernel
https://github.com/torvalds/linux/blob/v4.7/kernel/time/timer.c (linux 2.6内核引入时间轮) - skynet
https://github.com/cloudwu/skynet/blob/master/skynet-src/skynet_timer.c - timingwheel (借鉴API名称)
https://github.com/RussellLuo/timingwheel
参考书本
-
书名
深入linux内核架构(Professional Linux Kernel Architecture)(第15章时间管理)
tv1 0-255 -
范围
tv2 2的8次方-2的14次方-1
tv3 2的14次方-2的20次方-1
tv4 2的20次方-2的26次方-1
tv5 2的26次方-2的32次方-1 -
移动
第一组的内容在最多256个时间周期之后就会耗尽,必须将后续各组的定时器依次前推,重新补足第一组。在第一组的索引位置恢复到初始位置0之后,会将第二组中一个数组项的所有定时器补充到第一组。这种做做法,解释了为什么各组选择了不同的时间间隔。因为第一组的各数组项可能有256个不同的到期时间,而第二组中一个数组项的数据就足以填充整个第一组的整个数组。该道理同样适用于后续各组。第三组的一个数组项的数据同样足以填充整修第二个组,第四组的一个数组项也足以填充整修第三组,而第五组的一个数组项也足以填充整个第四组。
后续各组的数组位置并非随机选择的,其中的索引项仍然发挥了作用。但索引项的值不再是每个时钟周期加1,而是第256的i-1次方
- cascade函数用于从指定组取得定时器补充到前一组
Metadata
Metadata
Assignees
Labels
No labels