思维导图:定时器设计

news/2024/5/17 16:14:31/文章来源:https://blog.csdn.net/qq_39354847/article/details/126961406

思维导图:定时器设计

Linux 服务器经典定时器设计,根据网上的各种资料简单整理了个思维导图
请添加图片描述

单个思维导图估计也就个人看看,如果各位有兴趣可以从以下几个问题入手

  • 为啥要有专门的定时器模块
  • 定时器有啥用
  • 怎么定时
  • 关于定时器的设计与几种方案的讨论
  • 和其他模块的结合

下面是 Xmind 生成的 markdown 大纲,方便各位基于我的导图去修改

大纲

为什么需要

  • 定时事件应用
    • 心跳检测
    • 技能冷却
    • 武器冷却
    • 倒计时
    • 检测连接
  • 高效地组织并管理定时事件:把每个定时事件封装成定时器

Linux 定时机制

  • alarm/setitimer:设置超时时间,等待并捕获 SIGALARM 信号
  • 套接字超时选项
  • 多路复用超时参数 select/poll/epoll:看是否返回 0
  • timer_create:本质也是借助信号
  • timerfd_create:通过判断文件描述符来判,可以配合 IO 多路复用

和 IO 协程调度模块的结合(sylar)

  • 用 epoll_wait 来做的超时等待,毫秒级
  • IO协程调度器的idle协程会在调度器空闲时阻塞在epoll_wait上,等待IO事件发生。加入定时器功能后,epoll_wait的超时时间改用当前定时器的最小超时时间来代替。epoll_wait返回后,根据当前的绝对时间把已超时的所有定时器收集起来,执行它们的回调函数。
  • 由于epoll_wait的返回并不一定是超时引起的,也有可能是IO事件唤醒的。要再判断一下定时器有没有超时,用绝对时间就可以轻松判断啦

定时器设计与实现

成员

  • 超时时间
    • 相对时间:注册的时候一般是超时时间
    • 绝对时间:排序和确认超时的时候一般绝对时间
      • gettimeofday 获取绝对时间,依赖系统时间
      • 可能存在校时问题导致定时机制失效
        • 用小的超时步长 + 多次超时才触发 + 检测系统时间有没有往回调
        • 直接换个时间源如 clock_gettime(CLOCK_MONOTONIC_RAW) 获取系统单调时间
  • 任务回调函数

接口设计

  • 初始化
  • 添加定时器
  • 删除定时器
  • 找到最近要发生的定时任务
  • 更新检测定时器
  • 清除定时器

数据结构设计

  • 考虑:支持动态修改并维护有序,高效找到最近要发生的定时任务
  • 几种方案
    • 依赖一个固定周期触发的 tick 信号
      • 升序链表
        • 时间复杂度:添加 O(N),找最小,删除O(1)
          • tick 信号的周期对定时器性能影响比较大:周期小,精度高,CPU 负担高;周期大,精度低,CPU 负担小
          • 定时器数量比较多的时候,插入开销大
      • 时间轮:哈希思想,将定时器散列到不同的有序链表上
        • 每个链表的定时器数量的不会太常,这样插入效率也不会太拉跨;N 越大散列越均匀,插入效率越高。如果 N = 1 那就退化成升序链表了
        • 几种实现
          • 最简单的不带取模的直接一个槽为对应一个时间(纯哈希表)
            • 增删改查都O(1)
            • 可能要很多槽为,空间爆炸
          • 带取模的
            • 特征:同一条链表上每个定时器前后节点定时时间差 N * si 的整数倍(不一定是差 1 个 N);ts = (cs + (ti / si) %N
            • 先 O(1) 找到对应槽为,按有序链表操作
          • 多级时间轮(优雅)
            • 根据定时任务出发的紧急程度,分布到不同层级的时间轮中
            • 均衡了时间(简单的单时间轮差不了多少)和空间
    • 直接把超时时间当作 tick 周期
      • 基本思路:每次都取出所有定时器中超时时间最小的超时值作为一个tick,这样,一旦tick触发,超时时间最小的定时器必然到期。处理完已超时的定时器后,再从剩余的定时器中找出超时时间最小的一个,并将这个最小时间作为下一个tick,如此反复,就可以实现较为精确的定时。根据绝对时间去排序
      • 具体实现
        • 最小堆:增删O(log2N),删除O(n) 因为查找要O(n)可以配合 hash map 来辅助快速索引,查最小O(1)直接根节点
        • 红黑树:都 O(log2N),查最小就是查红黑树的最左节点
        • 其他:跳表

参考资料

《Linux高性能服务器编程》第 11 章
sylar 服务器 定时器模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_11400.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码阅读题-结构体大小

题目如下,小米23秋招-9.20-笔试首先这是一道C++的题,注意到的第一点是这个二维数组的初始化方式,他是给了一种一维数组的赋值方式,虽然没见过,但是想当然应该是逐层填充 经测试确实似乎这样的,而且给的初始值过多会报错,给少了打印默认值0int nums[3][5] = { 1,2,3,4,5,…

深入淺出 Spring Boot 多重設定檔管裡 (Spring Profiles)

在任何一套開發框架中, 多環境管裡 通常是重要的核心功能之一,當然在 Spring 框架中也不例外,這裡我們稱為 Spring Profiles 設定檔。這個功能說起來簡單,但實作起來卻很容易會不小心亂掉,這篇文章我打算來好好的梳理一…

AUTOSAR基础篇之StbM

AUTOSAR基础篇之StbM前言 首先,请问大家几个小小问题,你清楚: 基于AUTOSAR的应用层如何获取准确的时间戳吗?时间同步的具体过程包含哪些细节呢?如何正确的获取到全局时间戳呢? 今天,我们来一…

(Java数据结构)链表题

文章目录环形链表判断链表中是否有环找到链表开始入环的第一个节点链表分割环形链表 判断链表中是否有环 leetcode 141. 环形链表类似追及相遇问题,定义快慢指针,如果没有环,快指针会走到null;如果有环,快慢指针肯定…

QT5.15使用VISA接口连接GPIB设备和USB设备

本文是之前再外网找到的解决方法,本着分享目的共享出来。 1. 首先安装NI-VISA环境包:点击下载 如果使用GPIB还需要安装GPIB的环境包:点击下载(这个忘记了,似乎不安装也行) 2. 安装完成后,检查目…

Cent OS安装中文字体

文章目录前期准备拷贝字体拷贝Mac电脑的字体拷贝Windows的字体Centos上生成字体前期准备 添加字体需要先安装: sudo yum install -y fontconfig mkfontscale首先确认支持的字体: fc-list # 全部字体 fc-list :langzh-cn # 支持中文的字体然后开始添加…

SpringSecurity+JWT认证流程分析

对Spring SecurityJWT认证,对整体运行流程分析。 第一步先简单了解JWT是什么,生成规则。由于我们是JWT的认证模式,需要一个操作Token的工具类,能够创建token、验证token、反解析token中的信息。 WebSecurityConfigurer 1.引入S…

类——C++

C是面向过程的编程语言,重在过程,比如进行栈的操作,需要建立一个栈,初始化,push数据,pop数据,销毁栈等操作,这就是过程 C是面向对象的编程语言,重在处理对象与对象之间的…

vue打包项目版本号自加

原因 项目每次打包后都需要改动项目版本号,这个改动每次都需要在package.json中修改version,比较麻烦,到底有没有一种打包后版本号自加的办法。 方案 版本号自加其实可以使用fs修改文件来实现的。 具体思路是:在执行打包命令npm run build时,同时执行一段js代码,该代码通…

第六章 logstash学习(二)

一、ELK搭建 1.ES搭建 2.logstash搭建 1)安装java环境 2)安装logstash 3)配置环境变量 4)logstash的插件 INPUT:插件使Logstash能够读取特定的事件源。 OUTPUT:插件将事件数据发送到特定的目的地,OUTPUT是事件流水线中的最后阶段。INPUT支持事件源 OUTPUT支持输出源 COD…

【概率论与数理统计】【线性代数】计算机保研复习

我他妈写一上午了直接没了,这狗csdn,别在已发布的文章上改,辣鸡玩意儿。 复习概率论与数理统计1.基础2.贝叶斯公式3.大数定律(Law of the large numbers)4.中心极限定理5.最大似然估计6. 期望、方差和协方差面试题线性…

软件设计师2014上午题基础知识(易错整理)

软件设计师2014上午题基础知识&#xff08;易错整理&#xff09; 2014 上半年 木马程序的客户端运行在攻击者的机器上 海明码检验位计算&#xff1a;有效信息位 校验位个数 < 2^校验位个数 - 1 防火墙工作层次越低&#xff0c;工作效率越高&#xff0c;安全性越低 读音…

git 命令 简单介绍

爱无路&#xff0c;恨无情。相思无缘&#xff0c;相爱无份。曾相识&#xff0c;恨离别。无风雨&#xff0c;无同舟&#xff0c;何结果。情远天边&#xff0c;心无挂碍&#xff0c;唯爱你独一。 git简单介绍 三个区 工作区(working diretory) 用于修改文件 缓存区(stage) 是用…

zabbix的rpm包部署

1. 环境准备&#xff1a; 镜像版本虚拟机地址Rocky Linux release 8.6192.168.188.201 2. RockyLinux更换镜像源&#xff1a; [rootzabbix ~]# sed -i.bak \ -e s|^mirrorlist|#mirrorlist| \ -e s|^#baseurl|baseurl| \ -e s|dl.rockylinux.org/$contentdir|mirrors.nju.e…

计算机毕业设计之java+javaweb的新冠疫情下的校园出入系统

计算机毕业设计之javajavaweb的新冠疫情下的校园出入系统 项目介绍 随着信息化时代的到来,管理系统都趋向于智能化、系统化,新冠疫情下的校园出入系统也不例外,但目前国内的市场仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,而…

内核中oops 错误解析以及问题定位

目录 一、oops输出解析 二、工具 1、objdump 2、gdb 3、addr2line 4、decodecode 5、faddr2line 文档最后有完整的oops输出文件&#xff0c;此处将输出分成多个小块进行分析。 一、oops输出解析 [ 2620.950912] oops_tryv1:try_oops_init():37: Lets Oops!Now …

vue里使用虚拟列表处理element-ui的el-select选择器组件数据量大时卡顿问题

问题 当我们使用el-select选择器下拉数据很大的时候&#xff0c;会出现页面卡顿&#xff0c;甚至卡死的情况&#xff0c;用户体验很不好。我目前采取的方案是使用虚拟列表的方式去处理这个问题。 实现效果 数据获取完毕&#xff1a; 点击输入框&#xff1a;我们可以看到 2 万…

高频读写头CK-FA521-2M应用与选型注意事项

CK-FA521-2M为高频读写头&#xff0c;工作频率为13.56Mhz&#xff0c;通过同轴线缆与读卡器相连。使用ABS&#xff0b;铝合金作为读写头的外壳&#xff0c;适用于潮湿、粉尘、油污等恶劣环境&#xff0c;防护等级高。读写头具有识别标签距离远&#xff0c;抗干扰能力强&#xf…

Android移动应用开发之界面跳转

文章目录主要文件目录activity_main.xmldemo.xmlMainActivityActivity_Demo运行主要文件目录 主要实现的功能就是点击按钮能够实现界面的跳转。 activity_main.xml 主界面&#xff0c;包含一个按钮 <?xml version"1.0" encoding"utf-8"?> <a…

pdf转ppt的简单方法,包你一学就会

每个职场人的必备技能就是要能做一个“完美”的PPT&#xff0c;在做PPT之前肯定也少不了资料收集的过程。有的人收集资料时找到的是PDF格式的文档&#xff0c;这时候你可能就会想&#xff0c;如果能把PDF的内容直接就转还成一个PPT文档就好了。事实上这的确能办到&#xff0c;而…