摘要

定时器、定时器容器、tick、时钟中断

介绍

描述:
机器一直定时发生时钟中断,改变内核的信号或描述符,通过捕捉内核某种机制的变化来执行心跳函数tick,tick中实现检测所有超时定时器,并执行其的超时动作即回调函数
图示

核心实现思路

  1. 如何捕获超时事件?
    1. 轮询,隔多久就去查看是否发生信号或描述符变化
    2. 通知,信号或描述符发生变化后通知定时器执行回调函数
  2. 如何设计定时器容器和定时器(配套)?

    1. 使添加、删除、修改、执行(查找)的效率更高

      实现

      核心

      定时器

  3. 超时时间(到期时间):绝对时间、相对时间,多数是绝对时间

  4. 超时回调函数+回调参数
  5. (可选)重置定时器

分类:单次 + 循环(单次执行后再注册)

定时器容器

用来组织管理定时器
功能:

  1. 初始化(构造函数)
  2. 销毁(析构函数),删除容器中所有定时器(delete内存)——最好放在定时器类中new和delete对应
  3. 注册,即添加定时器(在外部定时器类后再添加,而不是在内部构建一个定时器类,new)
  4. 注销,即删除定时器(删除定时器类时会自动析构,delete)
  5. (可选)调整,即根据超时时间来调整定时器在容器中的位置
  6. Tick(),即超时处理函数,处理所有超时定时器回调函数并删除该定时器——每个一段时间就会执行一次

如何选择容器来提高添加、删除、执行的效率

  1. 有序链表:超时时间按升序链接
  2. 最小堆
  3. 时间轮:即HashMap,数组+无序链表来实现,通过定时器中成员数据“轮数”来判断是否执行链表中的定时器,每经历一轮,每个定时器中“轮数”减1
  4. 红黑树

    有序链表定时器

最小堆定时器

应用:

时间轮定时器

应用:

红黑树定时器

应用:

跳表定时器

参考

  1. https://blog.csdn.net/thisinnocence/article/details/81073117?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
  2. 定时器的实现: 1.跳表 2.红黑树 3.时间轮_弄懂基本原理+良好代码功底=无敌-CSDN博客
  3. nginx 定时器实现详解_huzilinitachi的专栏-CSDN博客