什么是时间轮

简介: 什么是时间轮

前言

在上一篇文章中我们讲解了空闲检测机制的由来, Netty对应的心跳实现以及源码查看, 本次主要讲解什么是时间轮

这是我的Netty专栏 欢迎大家关注

时间轮

时间轮是一种实现延迟功能的算法, 它在Linux内核中使用广泛, 是Linux内核定时器的实现方法和基础之一.

时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型, 把大量的调度任务全部绑定到同一个调度器上, 利用这个调度器来进行所有任务的管理, 触发以及运行.

单层时间轮

网络异常,图片无法展示
|

图片来源于网络

时间轮的创意来自于生活中的时钟, 在时间轮机制中有时间槽和时间轮的概念, 对应的分别是时钟的刻度和时针跳动的一个周期,  当有新任务产生的时候, 会将任务放置到对应的时间槽内,  每过一个时间周期就会执行下一个时间槽内的任务

网络异常,图片无法展示
|

图片来源于网络

多层时间轮

但是在上述时间轮也有一些缺点, 假设每个时间周期是 1s, 时间轮共有六十个节点, 那么当我设置一个任务为 70s 之后执行的话会在 10s(70 % 60) 后执行, 这显然不符合我们的预期

所以在时间爱轮中还有一个参数 round, 用来记录几圈之后执行

当我们解决了时间轮圈数问题之后就会发现, 只有当一个任务的 round 为 0 才会执行该任务, 那么就会造成时间轮的空转问题, 还是上面刻度为 60 的时间轮, 假设一个任务在 600s 后执行, 则该任务的执行刻度为 0s, round 为 10, 时间轮空转 10 圈才会执行该任务, 造成了大量资源的浪费, 于是多层时间轮应运而生

网络异常,图片无法展示
|

图片来源于网络

如图所示, 第一层时间跨度为 1ms, 第二层时间跨度为 20ms, 第三层时间跨度为 400ms, 当任务为 501ms 执行的时候, 会先记录在 刻度为 1(501/4) 的地方, 当执行到 1 时, 余下的 401(501-400) 会进入第二层的 5(501/20) 刻度, 同时 round == 1, 代表一圈后的 5刻度, 执行完第二层之后, 还余 1 会进入第三层的 1 刻度, 至此才算是结束

使用场景

kafka , Netty, Zookeeper 等高并发的一般都有时间轮的实现

Netty系统为例, 在其中是会存在大量连接的, 在每个连接中都存在相应的事件任务, 而大量的事件任务如果每一个任务都启动一个timer调度器来管理任务的生命周期的话, 会造成CPU的资源浪费且低效, 于是HashedWheelTimer应运而生, HashedWheelTimer就是以时间轮为基础进行设计的

参考

浅析时间轮 - 掘金 (juejin.cn)



目录
相关文章
|
5月前
|
数据库 时序数据库
时间里的T和Z都是什么
【6月更文挑战第24天】时间里的T和Z都是什么
118 0
|
6月前
|
XML Java 调度
什么是时间轮?
时间轮是一种用于任务调度和时间管理的数据结构,尤其适合处理大量定时任务的场景,如网络服务器或实时系统。它由一个圆形数组构成,每个槽代表固定时间间隔,任务根据执行时间添加到相应槽。时间推进时,指针移动并执行到期任务。时间轮具有高效性和简单性,插入和删除操作接近常数时间复杂度。层级时间轮可扩展处理更大时间范围和精度。在Spring Boot中,可以使用Netty的`HashedWheelTimer`实现高效定时任务管理。
100 0
|
Unix Linux Android开发
时间问题
时间问题
146 0
建立时间与保持时间
建立时间(Set up time,简写为T s u T_{su}T su ​ )是指触发时钟沿(以上升沿为例)到达D触发器之前,要求输入信号必须已经达到稳定的时间。对应的,保持时间(Hold time,简写为T h T_hT h ​ )是指触发时钟沿到达D触发器之后,要求输入信号还需要保持必须稳定的时间。建立时间、保持时间相对于触发时钟沿的关系如图所示。输入信号在建立时间和保持时间不能发生变化,容易出现灾难。
278 0
建立时间与保持时间
别再用大小比较时间了
由于写代码习惯了基本数据类型(int/Integer、long等)大小的比较,很多人连Date的时间先后比较也用大小(>、<、>=、<=)了。
130 0
|
Unix
strtotime应用(案例:给未来时间添加对应的时间)
strtotime应用(案例:给未来时间添加对应的时间)
207 0
strtotime应用(案例:给未来时间添加对应的时间)
如果时间可以倒流
今天同事问阿粉一个问题,觉得挺有意义的,在这里也问问各位读者们:如果时间可以倒流,你最想做什么呢?为什么呢? 这个问题阿粉也问了问身边的一些朋友们,下面是他们的答案,或许可以给你一些启发 朋友 A :如果时间可以倒流,我特别想要回到高中的时候,好好学习,踏踏实实的去努力,好好读书。不是那种死板教条的读书,是有计划有效率的读书,希望自己能够死不要脸一些,多向老师和同学请教问题,我可能天资不够聪慧,但是如果能够有效率一些,死不要脸一些,最起码会比现在要好得多吧
如果时间可以倒流
|
SQL JavaScript
时间问题,你会吗?
【本题考点】 1)涉及到多条件分组问题,要想到使用case when条件表达式。 2)时间问题,要想到常用的日期函数(datediff和timestampdiff)来解决。
时间问题,你会吗?
一些时间的处理
let BGT = $(o.beginT).val(); let EDT = $(o.endT).val(); spanAddCls(3); // 获取点击日期, let date = statis.
836 0