首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux定时器时间算法

时间实现 Linux定时器分为低精度定时器和高精度定时器两种类型,内核对其均有实现。本文讨论的是我们在应用程序开发中比较常见的低精度定时器。...作为常用的基础组件,定时器常用的几种实现方法包括:基于排序链表实现、基于小根堆实现、基于红黑树实现、基于时间实现。本文讲解的是时间复杂度最优,也是linux内核采用的基于时间的实现方式。...时间算法的核心思路是将定时器散列到多条链上,是典型的空间换时间的策略。下文从单个时间出发讲解,逐步扩展至linux实现定时器所采用的多级时间算法。...Linux时间定时器算法的关键在于添加定时器操作和时间进位迁移链表操作。先来说添加定时器。添加定时器的关键又在于知道每个时间每一个刻度所能表示的到期时间的范围。...对比 最后比较一下多级时间和单个简单时间时间复杂度及空间复杂度:linux使用了总计256+64+64+64+64=512个bucket,即可实现[0,2^32) jiffies的超时范围。

3.3K20

简单描述时间_rocketmq 时间

时间 作用 也是用来作定时器触发任务,只是他更高效,时间复杂度为O(1)。...– 42200(6060*12)秒 时间与每层的索引关系 举个简单的4层时间例子(如左上图),假设最小计时单位为1(姑且理解为秒) 时间初始为0,那么给定任意时间time,求time落在每层时间的索引...从数据结构设计 时间是由多个定长数组组成的,我们只需要把事件接在数组中就可以了,由于同一时刻会有多个事件,考虑先添加的事件先执行,使用链表来把事件连接起来,因此时间是一个 定长的包含链表的数组 事件添加过程...数据结构: 1、定义任务节点,组成任务链,节点应该包含需要执行的任务和任务执行的时间(以时间轮为起始点的时间) 2、定长链表数组,组成多层轮子,链表的节点为1定义的节点 3、定义时间变量,记录时间从起始时刻到当前的时间...,并且时间涉及到了很多乘法和除法和取余,所以可以考虑使用位运算来替代运行。

42410
您找到你想要的搜索结果了吗?
是的
没有找到

浅析时间

因为时间算法的精度取决于,时间段“指针”单元的最小粒度大小,比如时间的格子是一秒跳一次,那么调度精度小于一秒的任务就无法被时间所调度。...2.2.带圈数的时间 ​ 第一种最基础的时间中其实缺陷还是挺明显的。例如我设置一个间隔为1分钟,环形队列节点数为60个节点的时间。...2.3.多层时间 ​ 再回头看一下2.2。如果任务的跨度时间很长,那么时间将会空转,只有round为0才会进行任务的执行,这个无疑是很消耗cpu的。...三.应用 ​ 时间的使用在各大框架与中间件中有使用,xxl-job,netty,kafka都对时间都自己的实现。思路基本上与删除的时间策略一致。 ​...四.参考 时间在 Kafka 的实践

1.9K30

1、时间

一、什么是时间?...当然是可以的,假设我有一个任务E是在某点某分某秒执行,那么我们可以定义三个时间, 分别是秒时间,分时间,小时时间时间:总共60个格子,每格1s 分时间:总共60个格子,每格1分钟...计算方式如下: //计算任务执行点相对于时间启动时间的差值 duration = 任务执行时间点 - 时间启动时间点startTime //计算从时间启动点到达执行点需要走多少格子...E计算出来的duration为24小时30分20秒,那么首先这个任务E会存放在时时间的第24个格子上,等时时间走到第24个格子 后,会将这个任务E降级存放到分时间的第30个格子上,等分时间也走到第...30个格子之后,又会把任务E存放到秒时间的第20个格子上,等秒时间走到第20个格子上之后 就会执行任务,我们管这种时间叫做层级时间

52640

Netty时间

如下图所示: 中间的圆代表一个时间周期,轮子上的每个节点关联的链表代表该时间点要触发的任务。...常用的有MpscArrayQueue和MpscChunkedArrayQueue,jdk的juc包下的相关并发实现也参考了Mpsc无锁队列. 2.多重时间时间跨度很大时,提升单层时间的 tickDuration...可以减少空转次数,但会导致时间精度变低,层级时间既可以避免精度降低,又避免了指针空转的次数。...如果有时间跨度较长的定时任务,则可以交给层级时间去调度。...: 原生时间是单机的,在分布式和多实例部署的场景中乏力 宕机重新恢复执行,原生时间的存储是Mpsc队列,毫无疑问是内存存储,如果出现宕机或者重启,数据是不可恢复的 对于类似订单超时取消的场景,可以考虑时间

2.3K72

C时间

看完了《linux高性能服务器编程》对里面的定时器很感兴趣。书中提到三种定时器,分别是:基于升序链表的定时器,基于时间的定时器,基于时间堆的定时器。...说一下时间,下面是截的书中的图片 时间,像轮子一样滚动定时,每滚一个刻度,指针就走一个滴答,滚完一圈,就进入下一圈。...因此有了这个概念,时间的结构也就出来了:1.齿轮(槽slot),用来标识一个滴答;2.槽间隔(slot interval ),当前槽经过多长时间到下一个槽;3.一圈的槽数量(N);4.当前指针,走一个滴答加一...,即时间轮转多少转 //此定时器可以处于当前转,若再加上槽 //即可确定此定时器所处时间位置 int rotation; //处于当前时间轮转的第几个槽 int slot; //定时器到时执行的回调函数...,每经过一个间隔时间,加一实现轮转动, //超过总槽数即归零表示当前轮转完 int cur_slot; //时间一转的总槽数,总槽数越大槽链表越短,效率越高 int slot_num_r; //相邻时间槽间隔时间

60620

时间算法

时间算法 最近工作中使用了Xxl-Job框架来做分布式调度,内部采用了时间做整体调度,顺便学习并总结一下。 绝对时间和相对时间 定时任务一般有两种: 1. 约定一段时间后执行。 2....最简单的办法就是增大时间的长度,可以从12个加到168 (一天24小时,一周就是168小时),那么下周一上午九点就是时间的第9个刻度,这周三上午九点就是时间的第57个刻度。...但是这样带来的问题时,每次移动刻度的耗时会增加,当时间刻度很小(秒级甚至毫秒级),任务列表有很长,这种方案是不能接受的。 分层时间 分层时间是这样一种思想:   1....针对空间复杂度的问题:分层,每个时间粒度对应一个时间,多个时间之间进行级联协作。 假设现在有3个定时任务: 1. 任务一每天上午9点执行 2. 任务二每周2上午9点执行 3....根据这三个任务的调度粒度,可以划分为3个时间,月轮、周和天,初始添加任务时,任务一被添加到天轮上,任务二被添加到周,任务三被添加到月轮上。

51530

再谈时间_时间谈忘

时间是一种高性能定时器。 时间,顾名思义,就是一个基于时间的轮子,轮子划分为多个槽,每个槽代表一个时间跨度,槽的数量*时间跨度等于时间可以支持的最大延迟时间。...我们可以把时间分级,n+1层时间的槽时间跨度为n层时间的一圈的总时间跨度,所以当n层时间推进一圈时,n+1层时间推进一个槽,并且只有第一层时间实际处理定时任务,其余n+1层时间轮转动后,都是把当前槽的任务降级挂载到第...例如,我们如图有三级时间,一级时间每个槽1秒时间跨度,3600槽,即一圈总时间跨度1小时。二级时间每个槽1小时时间跨度,24个槽,即一圈总时间跨度1天。...但是也产生了另外一个问题,即n级时间推进一圈后,需要等待n+1级时间降级后才可以继续推进,如果n+1级时间的降级操作很耗时,则会影响n级时间的正常推进。...所以一般会采用预热的方式,提前触发n+1级时间的降级,解耦多级时间之间推进的强关联,保证一级时间推进的连续性。

74230

浅谈时间算法

时间算法思想 无论通过何种方式实现定时任务队列,最终需要向上层提供如下接口: 添加定时任务; 删除(取走)定时任务; 执行定时任务; 2.1 简单时间算法 时间算法的核心是:轮询线程不再负责遍历所有任务...如果要将时间精度设为秒,那么整个时间将需要 86400 个单位的时间刻度,此时时间算法的遍历线程将遇到更大的运行效率低的问题。下面两个小节将着力解决此问题。...2.2 带有 round 的时间算法 我们发现,时间时间刻度随着时间精度而增加并不是一个好的问题解决思路。现在,我们将时间的精度设置为秒,时间刻度个数固定为 60。...此时时间算法的数据结构如下图所示: 这种方式虽然简化了时间的刻度个数,但是并没有简化轮询线程运行效率不高的问题。时间每次处理一个时间刻度,就需要处理其上任务队列的所有任务。...2.3 分层时间算法 分层的时间算法在生活中有对应的模型(艺术来源于生活~),那就是水表: 此时,我们有秒、分钟、小时级别的三个时间,每一个时间分别有 60、60、24 个刻度。

1.2K10

什么是时间

任务执行: 任务在其对应的时间槽到达时被执行。执行完毕后,任务可以选择从时间中删除,或者如果需要周期性执行,可以重新计算其下次执行的时间并再次添加到时间中。...时间的优点高效性:时间避免了使用最小堆或其他数据结构频繁地插入和删除操作,这些操作通常是对数时间复杂度。时间的插入和删除操作可以视为常数时间复杂度,因为它们只涉及到数组索引的操作。...简单:时间的结构简单,使得时间的前进和任务的调度非常直接,只涉及数组的索引操作和链表操作。层级时间轮对于处理更长时间范围或更高精度的需求,可以使用多层时间。...层级时间由多个时间组成,每个时间负责不同的时间粒度和范围。例如,第一层时间可能每个槽代表1毫秒,而第二层时间的每个槽可能代表1秒。这种结构可以有效地扩展时间处理的时间范围和精度。...对于时间的实现,我们可以利用第三方库,如netty中的HashedWheelTimer,它是一个用于处理超时事件的高性能时间实现。

13710

多级时间定时器_时间与哈希表定时

时间 简述 顾名思义,时间就像一个轮子,在转动的时候外界会指向轮子不同的区域,该区域就可以被使用。...因此只要将不同时间的定时器按照一定的方法散列到时间的不同槽(即时间划分的区域)之中,就可以实现在运转到某个槽时,进行判断该定时器是否已经到达运行时间(需要判断是由于有的定时器并非在这一圈就需要运行,...至于在每转到一个槽时都要检查是否到达运行时间,可以这样理解:时间进行散列的方法就是取余运算,假设每个槽的间隔为1s,共有n个槽,当前转到了第cur个槽,那么一个定时在 t s以后运行的定时器就要放在第...对实现时间轮来说,最主要的还是链表的操作是否熟练,当然也主要是双向链表的添加与删除。 代码分析 记录定时器的时间信息,从而获取在时间中槽的位置,以及在多少圈之后被触发。...class TwTimer { public: int rotation; // 定时器转多少圈后生效 int time_slot; // 记录定时器属于时间的哪个时间槽 client_data

1.1K20

Netty时间_java netty

如下图所示: 中间的圆代表一个时间周期,轮子上的每个节点关联的链表代表该时间点要触发的任务。...Q:为什么在添加任务的时候启动时间? A:避免没有任务的情况下时间轮空转,造成cpu损耗 Q:为什么没有把任务添加到时间格里,而是放入了队列?...常用的有MpscArrayQueue和MpscChunkedArrayQueue,jdk的juc包下的相关并发实现也参考了Mpsc无锁队列. 2.多重时间时间跨度很大时,提升单层时间的...如果有时间跨度较长的定时任务,则可以交给层级时间去调度。...: 原生时间是单机的,在分布式和多实例部署的场景中乏力 宕机重新恢复执行,原生时间的存储是Mpsc队列,毫无疑问是内存存储,如果出现宕机或者重启,数据是不可恢复的 对于类似订单超时取消的场景,可以考虑时间

56730

基于Linux内核的时间算法设计实现【附代码】

因此需要一种更高效地管理定时器的数据结构和算法,这里结合Linux内核中基于时间的定时器管理器的具体实现,介绍一种基于时间的定时器管理算法。图1为时间的基本结构: ?...增加N的值更聪明的办法是采用多级时间,即在图1所示的时间外面再环绕一个时间,假设外面时间的刻度为8,即外轮的时间槽也是8个,每个时间槽也对应一个链表。...以上面的例子为例,如果二级时间都是3位二进制编码(8个时间槽),那么总共可以管理的时间范围为0 ~ 63,即64种Timeout的定时器。 Linux内核采用多级时间。...事实上,它的实现是一个很好的空间换时间软件算法。参考Linux的实现,具体代码如下: 首先定义如下宏: ? 2....基于Linux内核的时间实现代码,可以在应用程序层面实现一个基于时间的管理器。部分代码如下所示: ? ? ? ? TimerManager 类的定义如下: ? ?

3.4K10

Netty中的时间

时间是一种可以执行定时任务的数据结构和算法.这篇文章,讲解一下它在Netty 3.x系列中如何实现的,它在4.x系列将在后面的文章中讲解....首先说明一点的是,时间是按照顺时针的方向'转动',也就是按照顺时针的方向执行时间轮上的任务....时间在开始'转动'的时候会记录下开始时间startTime.每个格子表示一个tick值,第一个格子的tick值等于1,第二个格子的tick值等于2,以此类推....* n 时间初始化之后,它的结构如下图 假如此时时间正在执行下图中S格子中的任务,这时向时间中添加一个延时delay的任务,时间会根据当前所处的位置和时刻,计算新添加的任务应该放在哪个格子位置...任务在提交到时间的时候,它何时被执行,已经被确定了.

64920

vppinfra --- Timer Wheels(时间)

关于时间的实现原理详细介绍可以参考文章: https://blog.csdn.net/u013256816/article/details/80697456。是介绍kafka时间的实现。...vpp 中实现细节时间也是一样的。这里不再讲解了。 tw_timer_template.h的实例化生成命名结构来实现特定的计时器时间。...以tw_timer_2t_1w_2048sl.h模版为例子,时间的数量是1,时间的ring槽数量是2048,每个对象的句柄的占用的bit数量是2.通过make_internal_timer_handle...函数可以了解到用户时间句柄user_handle是由2部分组成的。...1、时间初始化 初始化一个间隔1s的的时间。每秒时间轮转一个槽位,最多支持2048s。timer interval也可以设置成0.1s,那么每秒ticks就是10。

76310

Kafka中的时间算法

将任务添加到时间中十分简单,对于每个时间轮来说,比如说秒级时间,和分级时间,都有它自己的过期槽。也就是delayMs < tickMs的时候。...比如说有一个任务要在 16:41:25 执行,从分级时间中来看,当我们的当前时间走到 16:41的时候(分级时间没有秒针!...当然我们的时间还需要一个指针的推进机制,总不能让时间永远停留在当前吧?推进的时候,同时类似递归,去推进一下上一层的时间。...1秒的会被扔到秒级时间的下一个执行槽中,而59秒的会被扔到秒级时间的后59个时间槽中。 细心的同学会发现,我们的添加任务方法,返回的是一个bool ?...再倒回去好好看看,添加到最底层时间失败的(我们只能直接操作最底层的时间,不能直接操作上层的时间),是不是会直接返回flase?对于再入失败的任务,我们直接执行即可。 ?

1.2K30

kafka时间源码_flume kafka

时间由多个时间格组成,每个时间格代表当前时间的基本时间跨度(tickMs)。...Kafka为此引入了层级时间的概念,当任务的到期时间超过了当前时间所表示的时间范围时,就会尝试添加到上层时间中。...对于之前所说的350ms的定时任务,显然第一层时间不能满足条件,所以就升级到第二层时间中,最终被插入到第二层时间时间格17所对应的TimerTaskList中。...这里就有一个时间降级的操作,会将这个剩余时间为50ms的定时任务重新提交到层级时间中,此时第一层时间的总体时间跨度不够,而第二层足够,所以该任务被放到第二层时间轮到期时间为[40ms,60ms)的时间格中...除了第一层时间,其余高层时间的起始时间(startMs)都设置为创建此层时间时前面第一的currentTime。

40120
领券