0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

定时器实现原理——时间轮

xCb1_yikoulinux 来源:一口Linux 作者:一口Linux 2022-08-22 11:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

时间轮

时间轮算法是通过一个时间轮去维护定时任务,按照一定的时间单位对时间轮进行划分刻度。然后根据任务延时计算任务落在该时间轮的第几个刻度上,如果任务时长超出了刻度数量,则需要增加一个参数记录时间轮需要转动的圈数。

简单时间轮

时间轮类似于我们的钟表,当指针指到刻度上,我们就去执行对应的任务列表。例如,我们需要统计每个小时的登录用户数。

c513f47e-21c6-11ed-ba43-dac502259ad0.jpg

时间轮算法中,轮询线程遍历到某一个时间刻度后,总是执行对应刻度上任务队列中的所有任务(通常是将任务扔给异步线程池来处理),而不再需要遍历检查所有任务的时间戳是否达到要求(不用每次从小顶堆堆顶,取数据来和时间比较,然后堆化这些操作)。

现在我们即使有n个任务,轮询线程也没有必要,每轮遍历n次,我们只需要按照时间刻度来轮训即可。

不过,小时作为时间单位粒度太大,我们有时候往往会希望基于分钟、秒等作为时间刻度。最直接的方式是增加时间刻度,通过增加时间刻度,我们可以基于更精细的时间单位(分钟)来进行定时任务的执行。但是,这种实现方式有如下的缺陷:

当我们刻度增多时,而任务相对较少,效率就会下降,假如我们只有以秒为刻度,一天 24 * 60 * 60 = 86400秒,我们可能只占用几十或几百个刻度,大部分时间刻度所占用的内存空间是没有任何意义的。

round时间轮算法

我们发现,时间轮的时间刻度随着时间精度而增加并不是一个好的问题解决思路。现在,我们将时间轮的精度设置为秒,时间刻度个数固定为 60。每一个任务拥有一个 round 字段。

轮询线程的执行逻辑是:每隔一秒处理一个时间刻度上任务队列中的所有任务,任务的 round 字段减 1,接着判断如果 round 字段的值变为 0,那么将任务移出任务队列,交给异步线程池来执行对应任务。如果是重复执行任务,那么再将任务添加到任务队列中。

轮询线程遍历一次时间轮需要 60 秒。如果一个任务需要间隔 x 秒执行一次,那么其 round 字段的值为 x/60(整除),任务位于第 (x%60)(取余)个刻度对应的任务队列中。例如任务需要间隔 130 秒执行一次,那么 round 字段的值为 2,此任务位于第 10 号时间刻度的任务队列中。

c529e996-21c6-11ed-ba43-dac502259ad0.jpg

这种方式虽然简化了时间轮的刻度个数,但是并没有减少轮询次数,效率还是相对较低。时间轮每次处理一个时间刻度,就需要处理其上任务队列的所有任务。其运行效率甚至与基于普通任务队列实现的定时任务框架没有区别。

分层时间轮

分层的时间轮算法在生活中有对应的模型,那就是水表:

c52f8810-21c6-11ed-ba43-dac502259ad0.jpg

我们可以将一天类似水表一样,分为多个轮,时、分和秒三个级别的时间轮,每一个轮的刻度分别为24、60、60个刻度。分层时间轮如下:

c5399ae4-21c6-11ed-ba43-dac502259ad0.jpg

假设我们有2个任务是每天的100执行一次,任务首先添加到时轮第1刻度上,当时轮到达第1刻度时,任务转移到分轮上的第0刻度,当分轮达到第0刻度,任务转移到秒轮,当秒轮达到第0刻度,任务一次执行。

优点:

轮询效率变高:不需要计算round值,其次任务队列中的任务一旦被遍历,就是需要被处理的(没有空轮询问题);

线程并发好:虽然引入了并发线程,但是线程数仅仅和时钟轮的级数有关,并不会随着任务的增长而变多

分层时间轮的任务从一个时间轮转移到另一个时间轮,有点像水表中小单位的表转一圈进位到大单位一样(但是分层时间轮是从大到小,因为从小到大的话,小单位的表轮询判断次数过多)

应用:

时间轮的使用在各大框架与中间件中有使用,xxl-job,netty都对时间轮都自己的实现。思路基本上与分层的时间轮策略一致。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4805

    浏览量

    98561
  • 定时器
    +关注

    关注

    23

    文章

    3373

    浏览量

    124552

原文标题:定时器实现原理——时间轮

文章出处:【微信号:yikoulinux,微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LM555QML定时器:功能特性、应用及设计要点

    LM555QML定时器:功能特性、应用及设计要点 在电子设计领域,定时器是一种常用的器件,可用于生成精确的时间延迟或振荡。TI公司的LM555QML定时器就是这样一款高度稳定的器件,下
    的头像 发表于 02-10 15:40 311次阅读

    深入解析xx555系列精密定时器:功能、应用与设计要点

    深入解析xx555系列精密定时器:功能、应用与设计要点 在电子工程师的工具箱中,定时器是一种至关重要的组件,它广泛应用于各种电子设备中,用于实现精确的时间控制。今天,我们将深入探讨xx
    的头像 发表于 02-10 15:40 939次阅读

    探索xx555系列精密定时器:特性、应用与设计要点

    探索xx555系列精密定时器:特性、应用与设计要点 在电子设计领域,定时器实现精确时间控制和信号处理的重要元件。今天,我们将深入探讨NA555、NE555、SA555、SE555这一
    的头像 发表于 02-10 14:45 270次阅读

    如何算定时器的溢出时间

    怎么样算定时器的溢出时间
    发表于 01-13 07:09

    LAT1173高精度定时器的同步功能应用笔记

    STM32G474 所含的高精度定时器(HRTIMER)其实包含了多个定时器,多个定时器之间可以单独工作,也可以进行同步,且高精度定时器还能与片上的其他
    发表于 01-11 17:32 0次下载

    实现一个嵌入式的软件定时器

    操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器中断到,就对一个全局的时间
    发表于 12-10 08:29

    CW32定时器及中断介绍

    可以由硬件自 动执行触发信号的滤波操作,还能令触发事件产生中断和 DMA 请求。 低功耗定时器:CW32L083 内部集成 1 个 16 位低功耗定时器(LPTIM),可以以很低的功耗实现
    发表于 12-01 07:08

    使用系统定时器SysTick来实现精确延时微秒和毫秒函数

    到 0 时,将从RELOAD 寄存中自动重装载定时初值,开始新一计数。使用内核的SysTick定时器实现延时,可以不占用系统
    发表于 11-20 07:12

    PWM、定时器、SysTick 区别及应用场景

    。下面我们来梳理清楚。一、基本概念定时器(Timer)MCU内最基础的计数外设,通过计数时钟周期实现定时、计数功能。多数MCU内部有多个通用定时器,可配置为
    的头像 发表于 11-17 10:53 694次阅读
    PWM、<b class='flag-5'>定时器</b>、SysTick 区别及应用场景

    硬件定时器如何配置固定频率?

    ,非整数。 请教如果直接配置相应频率,不用换算时间。 另外“HWTIMER 设备”里面的计数频率没能理解有何作用,是否可以通过配置这个频率来实现我要的频率呢? 该如何换算,我尝试修改好像对定时器
    发表于 09-26 07:12

    ‌TLC551 LinCMOS™ 定时器芯片技术文档总结

    TLC551 是使用 TI LinCMOS 制造的单片定时电路^TM的^过程。这定时器与 CMOS、TTL 和 MOS 逻辑完全兼容,工作频率高达 2 MHz。与 NE555 定时器相比,该器件由于输入阻抗高,因此使用更小的
    的头像 发表于 09-24 09:16 1042次阅读
    ‌TLC551 LinCMOS™ <b class='flag-5'>定时器</b>芯片技术文档总结

    SysTick系统滴答定时器简介

    SysTick—系统定时器是属于CM33内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数,计数每计数一次的时间
    的头像 发表于 09-23 09:50 1817次阅读
    SysTick系统滴答<b class='flag-5'>定时器</b>简介

    大彩讲堂:VisualHMI-LUA教程-定时器的使用指南

    定时器的使用
    的头像 发表于 08-31 16:59 1375次阅读
    大彩讲堂:VisualHMI-LUA教程-<b class='flag-5'>定时器</b>的使用指南

    stm32H743定时器溢出的原因?怎么解决?

    我利用定时器更新中断实现软件计时,定时时间是固定的按照{10ms, 20ms,650ms, 50ms,50ms}周期性进行的。由于下一次的计时时间是需要在
    发表于 06-23 08:26

    MCU定时器/计数

    RISC-V核低功耗MCU通过灵活的定时器架构、低功耗模式适配及硬件级中断优化,在工业控制、智能家居等场景中实现高精度计时与能耗控制的协同设计,满足复杂任务调度与实时响应的双重需求‌。 一、‌硬件
    的头像 发表于 04-27 13:54 938次阅读