定时器的实现原理

这篇具有很好参考价值的文章主要介绍了定时器的实现原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.定时器的作用?

定时器的主要用途是执行定时任务。

定时任务在很多场景都需要用到,比如游戏的 Buff 实现,Redis 中的过期任务,Linux 中的定时任务,电商未支付订单的关闭等等。

2.数据结构要求

定时器需要支持如下几个操作:

  • 创建定时器
  • 添加定时任务
  • 取消定时任务
  • 执行到期任务(查找)

以下为常见实现定时器数据结构的时间复杂度:

  • 有序链表:插入O(n),删除 O(1),过期 expire 执行 O(1)
  • 最小堆:插入O(logn),删除 O(logn),过期 expire 执行 O(1)
  • 红黑树:插入O(logn),删除 O(logn),过期 expire 执行 O(logn)
  • 哈希表+链表(时间轮):插入 O(1),删除 O(1),过期 expire 平均执行 O(1)(最坏为O(n))

不同开源框架定时器实现方式不一,如 libuv 采用最小堆,nginx 采用红黑树,linux 内核和 skynet 采用时间轮算法等等。

3.时间轮

一个时间轮是一个环形结构,可以想象成时钟,分为很多格子,一个格子代表一段时间(越短 Timer 精度越高),并用一个 List 保存在该格子上到期要执行的所有任务。同时一个指针随着时间流逝一格一格移动,并执行对应 List 中所有到期的任务。任务通过取模决定应该放入哪个格子。
定时器的实现原理

以上图为例,假设一个格子是1秒,则整个 wheel 能表示的时间段为 8s。

假如当前指针指向 0。

此时需要调度一个 3s 后执行的任务,显然应该加入到(0+3=3)的方格中,指针再走3次就可以执行了。

如果任务要在10s后执行,应该等指针走完一个 round 零 2 格再执行,因此应放入2并将 round 标记为 2 表示第二轮时执行。

4.分级时间轮

如果任务的时间跨度很大,数量也多,传统的时间轮会造成任务的 round 很大,单个格子的任务 List 很长,并会维持很长一段时间。

这时可将 Wheel 按时间粒度分级:

定时器的实现原理

这种方式的优点在于能够保证任务链表的长度一直在比较短的状态,但缺点是需要更多的空间。

5.业界实现方案

业界对于定时器/延迟队列的工程实践,则通常使用以下几种方案。

  • 基于 Redis ZSet 实现。
  • 采用某些自带延迟选项的队列实现,如 RabbitMQ、Beanstalkd、腾讯 TDMQ 等。
  • 基于 Timing-Wheel 时间轮算法实现。

参考文献

如何快速实现一个定时器?- InfoQ文章来源地址https://www.toymoban.com/news/detail-500511.html

到了这里,关于定时器的实现原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32:基本定时器原理和定时程序

            定时器就是计数器,定时器的作用就是设置一个时间,然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能,还可以实现捕获脉冲宽度,计算PWM占空比,输出PWM波形,编码器计数等。 STM32共11个定时器,2个高级控制定时器T

    2024年02月01日
    浏览(46)
  • 12.通用定时器基本原理

    STM32F10x系列总共最多有8个定时器: STM32的通用TIMx(TIM2、TIM3、TIM4、TIM5)定时器功能特点包括: 位于低速的APB1总线上; 16位向上、向下、向上/向下(中心对齐)技术模式,自动装载计数器(TIMx_CNT); 16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535之间

    2024年02月11日
    浏览(40)
  • 555定时器的原理与应用(1.1)

    一。555定时器 1.1555定时器简介 555定时器是一种多用途的中等规模集成电路。它不仅能用于信号的产生和变换,也可以用于控制和检测电路中。自从Signetics公司于1972年推出这种产品以后,国际上个主要的电子器件公司也都相继的生产了各自的555定时器产品。虽然不同公司生产

    2024年02月07日
    浏览(91)
  • STM32—定时器原理及配置(入门详解)

    目录 一、定时器工作原理 二、定时器分类   1.基本定时器(TIM6~TIM7) 2.通用定时器(TIM2~TIM5) 3.高级定时器(TIM1和TIM8) 三、定时器计数模式 四、溢出时间计算 五、定时器配置 六、main.c代码         利用精准的时基,通过硬件的方式,实现定时功能。定时器核心就是计数

    2024年02月16日
    浏览(39)
  • STM32(7)-定时器输出PWM的原理分析

    概念+代码 OC(Output Compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的前3个通道额外拥有死区生成和互补输出的功

    2024年02月04日
    浏览(56)
  • STM32——高级定时器输出指定个数PWM波原理及实战

    相比于通用定时器特性: 1)重复计数器 2)死区时间带可编程的互补输出 3)断路输入,用于将定时器的输出信号置于用户可选的安全配置中 1,配置定时器基础工作参数 HAL_TIM_PWM_Init() 2,定时器PWM输出MSP初始化 HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等 3,配置PWM模式/比较值等

    2024年01月16日
    浏览(60)
  • 蓝桥杯单片机学习6——定时器/计数器&定时器实现秒表功能

    上一期我们学习了外部中断的相关内容,现在我接着来学习定时器。 定时器/计数器是一种能够对内部时钟信号或者外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断请求,从而实现定时或计数功能的外设。定时器的基本工作原理是进行计数。 举个栗子 :你可

    2024年02月04日
    浏览(49)
  • flink中使用外部定时器实现定时刷新

    我们经常会使用到比如数据库中的配置表信息,而我们不希望每次都去查询db,那么我们就想定时把db配置表的数据定时加载到flink的本地内存中,那么如何实现呢? 1.在open函数中进行定时器的创建和定时加载,这个方法对于所有的RichFunction富函数都适用,包括RichMap,RichFilter,

    2024年02月06日
    浏览(44)
  • js实现定时器

    用原生js实现一个倒计时效果.最下面有全部源码,需要自取 js语法 : setTimeout :定时器 document.getElementById :Document的方法 getElementById()返回一个匹配特定 ID的元素。由于元素的 ID 在大部分情况下要求是独一无二的,这个方法自然而然地成为了一个高效查找特定元素的方法。 remove

    2024年02月11日
    浏览(75)
  • C语言实现定时器

    代码解释: #include stdio.h #include windows.h 这两行是引入所需的标准库头文件。 void CALLBACK timer_handler(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {     printf(\\\"Timer expired!n\\\"); } 定义了一个回调函数 timer_handler,当定时器到期时会被调用。在此示例中,它只简单地打印一条消息表示定时

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包