本发明涉及定时器技术领域,尤其涉及一种定时器的处理方法和装置。
背景技术:
分布式存储系统需要处理大量的io以及其他策略任务,其中定时器是一个必不可少的组件。但使用场景的不同,对定时器的实现考虑也不尽相同。不同定时器的时间中,区别在于定时器的复杂度和时间精度。
复杂度在于任务队列排序的实现,如何排序和快速获取当下第一个待开始的任务。精度在于任务开始时间的时间精度。不同实现主要在于不同复杂度的实现,当前技术大部分使用堆栈、红黑树、时间轮、列表。
现有技术中,算法均比较复杂,处理的速度比较慢。
技术实现要素:
本发明的实施例提供了一种定时器的处理方法和装置,能够提供一种实现相对简单、操作快速的定时器。
为了实现上述目的,本发明采取了如下技术方案。
一种定时器的处理方法,包括:
获取系统中每个任务的预定发生时间;
将每个任务的预定发生时间对应一个第一节点;
按照所述每个第一节点对应的预定发生时间的顺序,将所述第一节点组成至少两层的跳表结构的任务队列。
一种定时器的处理装置,包括:
第一获取单元,获取系统中每个任务的预定发生时间;
第一对应单元,将每个任务的预定发生时间对应一个第一节点;
组建单元,按照所述每个第一节点对应的预定发生时间的顺序,将所述第一节点组成至少两层的跳表结构的任务队列。
由上述本发明的实施例提供的技术方案可以看出,本发明实施例中,通过构建跳表结构的任务队列,能够提高系统的操作速度。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例一提供的一种定时器的处理方法的处理流程图;
图2为本发明实施例提供的跳表结构的任务队列的示意图。
图3为本发明实施例提供的任务队列的处理方法的处理流程图;
图4为本发明实施例二提供的一种定时器的处理装置的连接示意图。
具体实施方式
下面详细描述本发明的实施方式,所述实施方式的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
如图1所示,本发明提供一种定时器的处理方法,包括:
步骤11,获取系统中每个任务的预定发生时间;
步骤12,将每个任务的预定发生时间对应一个第一节点;
步骤13,按照所述每个第一节点对应的预定发生时间的顺序,将所述第一节点组成至少两层的跳表结构的任务队列。如图2所示,为本发明所述的跳表结构的任务队列的示意图。
本发明组建任务队列时,采用跳表结构;后续处理时,需要按时间顺序查找新任务的插入位置,从而将新任务插入任务队列。采用跳表结构的查找方式,能够加快查找的处理速度。
其中,步骤13包括:
步骤131,按照所述预订发生时间的顺序,将所述第一节点组成第一层链表。该步骤中,所述第一节点可以包括第一指针,所述第一指针指向所述第一层链表中的下一个节点的地址。
步骤132,从所述第一层链表的第一节点中提取部分节点,作为第二节点;
步骤133,按照所述第二节点对应的预订发生时间的顺序,将所述第二节点组成第二层链表。该步骤中,第二节点包括:第二指针和第三指针,所述第二指针用于指向所述第二层链表中的下一个节点的地址,所述第三指针用于指向与所述第二节点的预订发生时间相同的所述第一节点的地址。
上述实施例中,可以设置多层链表,链表的层数可以根据任务节点的多少来进行设置。
可选的,所述方法还包括:
步骤14,获取系统中新任务的预定发生时间;
步骤15,将所述新任务的预定发生时间对应一个第三节点;
步骤16,根据所述第三节点对应的新任务的预定发生时间,查找所述第三节点在所述任务队列中的位置;
步骤17,按照查找到的所述位置,将所述第三节点插入到所述跳表结构的任务队列中。
步骤17具体包括:
步骤171,将所述第三节点的预定发生时间,与所述第二层链表中的第二节点对应的预定发生时间进行比较,获取所述第三节点在第二层链表的最小区间;所述最小区间的两个边界由第二层链表中的两个第四节点界定;
步骤172,获取所述第二层链表的所述两个第四节点对应的所述第一层链表中的两个第五节点;
步骤173,在所述两个第五节点组成的区间里,查找所述新任务对应的第三节点在所述第一层链表中的位置。
上述实施例中,在组建任务队列时,采用跳表结构;后续处理时,需要按时间顺序查找新任务的插入位置,从而将新任务插入任务队列。采用跳表结构的查找方式,能够加快查找速度。
可选的,所述方法还包括:
步骤18,定期获取当前时间;
步骤19,从所述任务队列中获取第一个任务的计划执行时间;
步骤110,根据所述第一个任务的计划执行时间和所述当前时间,判断是否需要启动所述第一个任务;步骤110具体为:判断所述当前时间是否晚于或者等于所述第一个任务对应的预定发生时间,判断是否需要启动所述第一个任务;
步骤111,如果为是,则启动所述第一个任务,并从所述任务队列中删除所述第一个任务对应的节点。
所述方法还包括:
步骤112,判断所述第一个任务是否下次执行;
步骤113,如果为是,则根据所述第一个任务的下次执行时间,将所述第一个任务对应的节点插入所述跳表结构的任务队列。
如图3所示,为本发明所示的任务队列的处理示意图。本发明可以用于分布式存储系统。分布式存储系统需要处理大量的io以及其他策略任务,其中定时器是一个必不可少的组件。对于定时器实现,不同实现之间的差异在于时间精度和任务队列的实现。本实施例中,可以采用纳秒为精度,基于跳表实现一种实现相对简单,操作快速的定时器。
基于跳表的定时器具体实现为:任何时间产生新任务,都及时插入任务队列。
当定时器任务检查循环开始,检查判断任务队列中第一个任务是否需要开始执行;如不需要,任务检查循环进入等待,直到检查的第一个任务的开始时间的时刻再做检查判断是否要执行;如需要执行,从任务队列中删除该任务,执行该任务,并获得下次执行时间。然后判断该任务是否需要再次执行,如不需要下次执行,那么循环回到检查任务队列的第二个任务是否需要执行;如需要再次执行,就将该任务id和下次执行时间插入任务队列。然后再次循环检查任务队列中第一个任务是否需要当前时间执行。
本发明的任务队列的实现是基于跳表的,基于跳表的特性,实现简单,操作快速,使得基于跳表的定时器实现简单,操作快速。
如图4所示,为本发明所述的一种定时器的处理装置,包括:
第一获取单元21,获取系统中每个任务的预定发生时间;
第一对应单元22,将每个任务的预定发生时间对应一个第一节点;
组建单元23,按照所述每个第一节点对应的预定发生时间的顺序,将所述第一节点组成至少两层的跳表结构的任务队列。
所述组建单元包括:
第一组建子单元231,按照所述预订发生时间的顺序,将所述第一节点组成第一层链表;
提取子单元232,从所述第一层链表的第一节点中提取部分节点,作为第二节点;
第二组建子单元233,按照所述第二节点对应的预订发生时间的顺序,将所述第二节点组成第二层链表。
可选的,所述装置还包括:
第二获取单元24,获取系统中新任务的预定发生时间;
第二对应单元25,将所述新任务的预定发生时间对应一个第三节点;
查找单元26,根据所述第三节点对应的新任务的预定发生时间,查找所述第三节点在所述任务队列中的位置;
插入单元27,按照查找到的所述位置,将所述第三节点插入到所述跳表结构的任务队列中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。