掌桥专利:专业的专利平台
掌桥专利
首页

一种定时任务的执行方法及计算设备

文献发布时间:2023-06-19 18:37:28


一种定时任务的执行方法及计算设备

技术领域

本发明涉及计算机数据处理技术领域,尤其涉及一种定时任务的执行方法及计算设备。

背景技术

在计算机软件系统中,定时任务是一种非常常见的任务形态,例如:声称该月度统计报表、会员积分结算、邮件推送等,其本质都是定时任务。在计算机软件系统中,定时任务的触发一般都是有各种类型的定时器来完成。其中,时间轮定时器是一种简单、不依赖第三方组件,且能高效进行任务触发的定时。但是,由于时间轮定时器中划分的存储空间的数量有限,在大量延时任务的场景下,会导致不同延时长度的任务会被分配到同一个存储空间中。导致时间轮触发时,需要遍历同一个存储空间中的每一个任务,降低了定时器任务触发的性能。

发明内容

本申请提供了一种定时任务的执行方法及计算设备,通过任务分层机制,提升了时间定时器任务触发性能,使得时间轮定时器可以支持更大量的定时任务。

第一方面,本申请提供了一种定时任务的执行方法,包括:确定时间轮定时器的循环指针指向第一时间槽的第一时间,第一时间槽为循环指针当前指向的时间槽的下一个时间槽;在当前时间大于等于第一时间的情况下,将时间轮定时器的循环指针指向第一时间槽;获取时间轮定时器的触发轮次;根据时间轮定时器的触发轮次,触发第一时间槽中的第一任务列表中的定时任务执行,其中,第一任务列表中的各个定时任务的触发轮次与时间轮定时器的触发轮次相同。

也就是说,在触发时间轮定时器中存储的定时任务执行时,在确定时间轮定时器的循环指针指向的时间槽(比如第一时间槽)以后,可以根据时间轮定时器的触发轮次,从第一时间槽中的多个任务队列中确定与时间轮定时器的触发轮次具有相同触发轮次的任务队列(比如第一任务队列)。在确定第一任务队列以后,可以触发第一任务队列中的定时任务执行。即在时间轮定时器中的定时任务按照触发轮次,进行分层存储。当需要触发时间轮定时器的某一个时间槽中的定时任务执行时,只需要遍历与时间轮定时器具有相同触发轮次的定时任务,而不需要遍历时间槽中存储的所有定时任务,有效提升了时间轮定时器的触发性能。

在一个可能的实现方式中,触发第一任务列表中的定时任务执行,包括:遍历第一任务列表,若第一任务列表中存在至少一个定时任务的触发时间小于当前时间,触发至少一个定时任务执行。

也就是说,由于时间轮定时器是存在误差的,为了保证可以更加准确的触发时间轮定时器中存储的定时任务,在触发第一任务列表中的定时任务执行之前,可以对第一任务列表中存储的定时任务的进行进一步的判定,以保证执行的定时任务都已经达到触发时间。

在一个可能的实现方式中,遍历第一任务列表,触发执行目标定时任务后,该方法还包括:确定时间轮定时器的循环指针指向第二时间槽的第二时间,其中,第二时间槽为第一时间槽的下一个时间槽;在当前时间小于第二时间的情况下,确定时间轮定时器需要休眠的第三时间,第三时间为毫秒级别的时间;在第三时间大于等于1的情况下,使用系统函数sleep触发时间轮定时器休眠第三时间;在第三时间小于1的情况下,使用Pause指令触发时间轮定时器进行休眠。

也就是说,可以通过时间轮定时器休眠的方式,来模拟时钟轮定时器转动。其中,通过pause指令配合sleep函数的方式推动时间轮定时器进行转动,可以在性能不变的情况下更好的利用系统的CPU资源,并且降低了CPU功耗。

在一个可能的实现方式中,使用Pause指令触发时间轮定时器进行休眠,包括:等待固定的时间间隔后,若当前时间小于第二时间,继续触发时间轮定时器进行休眠。

也就是说,当时间轮定时器的进程调用Pause指令以后,时间轮定时器的进程会进行休眠,但是时间轮定时器的进程不会释放CPU。时间轮定时器的进程会在一定的时间间隔(比如10个钟周期)后自动唤醒,并检查当前时间是否大于等于第二时间。在当前时间小于第二时间的情况下,时间轮定时器的进程会继续休眠,等待下一次唤醒。

在一个可能的实现方式中,触发第一时间槽中的第一任务列表中的定时任务执行之前,该方法还包括:接收定时任务,定时任务中包含定时任务的延时执行时间;根据定时任务的延时执行时间,确定定时任务的触发时间;根据定时任务的触发时间,确定定时任务的触发轮次、定时任务对应的第一时间槽;根据定时任务的触发轮次,将定时任务存储到第一时间槽中的第一任务列表中。

也就是说,在将定时任务存储到时间轮定时器中对应的时间槽时,可以在对应的时间槽中,按照定时任务的触发轮次,对定时任务进行分层存储。即在对应的时间槽中包括多个任务列表,每一个任务列表用于存储相同触发轮次的定时任务。当时间轮定时器的循环指针,指向某一个时间槽时,只需要根据时间轮定时器的当前触发轮次,快速检索(时间复杂度O(1))对应的延时任务列表,快速触发任务执行。

在一个可能的实现方式中,根据定时任务的触发轮次,将定时任务存储到第一时间槽中的第一任务列表中,包括:根据定时任务的触发轮次,从第一时间槽中的至少一个任务列表中确定第一任务列表;在第一时间槽中存在第一任务列表的情况下,将定时任务存储到第一任务列表中;在第一时间槽中不存在第一任务列表的情况下,在第一时间槽中增加第一任务列表,将定时任务存储到第一任务列表中。

也就是说,当时间轮定时器的第一时间槽中,已经与接收的定时任务的触发轮次相同的任务列表时,可以直接将接收的定时任务存储到该任务列表中。当时间轮定时的第一时间槽中,不存在与接收的定时任务的触发轮次相同的任务列表时,可以先在第一时间槽中创建与接收的定时任务的触发轮次相同的任务列表,然后再将接收的定时任务存储到该任务列表中。

在一个可能的实现方式中,触发第一任务列表中的定时任务执行以后,该方法还包括:遍历第一时间槽中的第二任务列表,第二任务列表中的各个定时任务的触发轮次与时间轮定时器的上一个触发轮次相同;若第二任务列表中存在剩余定时任务,触发执行第二任务列表中的剩余定时任务;删除第一时间槽中的第二任务列表。

也就是说,在触发第一时间槽中的第一任务列表中的定时任务执行以后,还需要遍历时间轮定时器的当前触发轮次的上一个触发轮次对应的任务列表,并触发该任务列表中未触发的定时任务执行,以保证存储在时间轮定时器中的定时任务都能够被触发。进一步地,为了减少时间轮定时器占用的存储空间,时间轮定时器在遍历完时间轮定时器的当前触发轮次的上一个触发轮次对应的任务列表后,还需要将该任务列表从第一时间槽中删除。

在一个可能的实现方式中,确定时间轮定时器的循环指针指向第一时间槽的第一时间,包括:确定时间轮定时器的循环指针指向第一时间槽时,循环指针的转动次数;根据循环指针的转动次数和时间轮定时器的单位时间,确定第一时间;其中,时间轮定时器的单位时间为循环指针转动一次需要的时间。

在一个可能的实现方式中,第一任务列表为双向链表。

第二方面,本申请提供了一种计算设备,其特征在于,包括:

至少一个存储器,用于存储程序;

至少一个处理器,用于执行存储器存储的程序,当存储器存储的程序被执行时,处理器用于执行第一方面的任一种可能的实现方式所描述的方法。

第三方面,本申请提供了一种计算机可读介质,计算机存储介质中存储有指令,当指令在计算机上运行时,使得计算机执行第一方面任一种可能的实现方式所描述的方法。

第四方面,本申请提供了一种包含指令的计算机程序产品,当指令在计算机上运行时,使得计算机执行第一方面的任一种可能的实现方式所描述的方法。

可以理解的是,上述第二方面至第四方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。

图1为本申请实施例提供的一种时间轮定时器结构示意图;

图2为本申请实施例提供的一种时间轮定时器触发执行延时任务的过程示意图;

图3为本申请实施例中提供的一种应用场景示意图;

图4为本申请实施例提供的一种时间轮定时器的结构示意图;

图5为本申请实施例提供的一种计算设备的硬件结构示意图;

图6为本申请实施例提供的一种延时任务的执行方法的流程图;

图7为本申请实施例提供的一种时间轮定时器触发执行延时任务的过程示意图;

图8为本申请实施例提供的一种触发时间轮定时器进行休眠的方法流程图;

图9为本申请实施例提供的又一种延时任务的执行方法的流程图;

图10为本申请实施例提供的一种延时任务的存储方法流程示意图;

图11a为本申请实施例提供的一种时间轮定时器的结构示意图;

图11b为本申请实施例提供的一种时间轮定时器的结构示意图;

图12为本申请实施例提供的一种芯片的结构示意图。

具体实施方式

为了使本申请实施例的目的、技术方案和优点更加清楚,下面将结合附图,对本申请实施例中的技术方案进行描述。

在本申请实施例中的描述中,“示例性的”、“例如”或者“举例来说”的任何实施例或设计方案不应该被理解为比其他实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”、“例如”或者“举例来说”等词旨在以具体方式呈现相关概念。

此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。

在介绍本发明申请的方案之前,首先对本发明申请实施例中需要用到的关键术语进行解释。

1、pause指令,是指32位系统(X86)中的指令集中的指令,pause指令会向处理器提供一种提示,指示处理器所执行的代码是一个自旋循环等待(spin-wait loop)。处理器会根据这个提示而避开内存序列冲突(memory order violation),也就是说对spin-waitloop不做缓存,不做指令重新排序等动作,从而可以提高处理器的性能。

2、Socket连接,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API)对TCP/IP的封装。

3、sleep函数,sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。当函数设定的计时器到期,或者接收到信号、程序发生中断都会导致程序继续执行。其中,时间是sleep函数的参数,单位为毫秒。

接着,对本申请涉及的技术方案进行介绍。

定时任务按任务的触发方式可以分为:周期任务、延时任务、指定时间点任务。其中,周期任务是指以某种时间为周期,重复执行的任务;比如,每月1号0点启动月度财务报表生成;每天凌晨0点生成当天的销售报表。延时任务是指以某个时间点为基点,延迟一段时间再执行的任务;比如,电商购物生成订单后,30分钟未支付自动取消订单;红包24小时未被查收,需要执行退还业务。指定时间点任务是指给定任务的执行时间,到时间执行;比如,会议通知短信,在会议开始前30分钟发送。其中,本发明申请实施例中的定时任务主要指延时任务。

在计算机软件系统中定时任务的触发执行,一般都由各种类型的定时器来完成。其中,依靠时间轮定时器来触发定时任务,是一种简单、不依赖第三方组件且高效的实现方法。时间轮定时器由时间数组和计数器(tick)组成。其中,时间轮数组为首尾相连的环形数组,该环形数组中包括多个槽位(也可以称之为时间槽),每一个时间槽内都保存有一个bucket数据结构。整个时间轮数据可以模拟时钟的表盘,计数器可以模拟时钟的时针走动。

示例性的,图1示出的一种时间轮定时器的实现原理图。接下来,参照图1所示的时间轮定时器,对时间轮定时器的中的数据结构以及术语进行解释。

1、时间轮数组:首尾相连的环形数组,其中每个槽位都保存了一个bucket数据结构,整个时间轮数组模拟时钟的表盘;如图1所示,该时间轮数组由8个时间槽组成,每一个时间槽内都保存了一个bucket数据结构。

2、Bucket:时间槽内保存的一个数据结构,bucket内包含一个双向链表,该链表内保存的是待触发的延时任务。其中,双向链表的结构可以如图1所示,双向链表中除头结点以外每一个节点都由三部分构成,即前置节点指针pre、数据域data、后置节点指针next。其中,在双向链表中最后一个节点的后置节点指针next指向头结点的后置节点next,头节点的前置节点指针指向双向循环链表中最后一个节点的data域。data域用于存储用户提交的延时任务的任务信息。比如,延时任务的触发轮次、延时任务的触发时间。

3、Tick:时间轮定时器的计数器,可以用来模拟时钟的时针走动,通常情况下从0开始计数。

4、TickDuration:表示时间轮定时器的单位时间,即表示tick计数器每次加1后走过的时间;TickDuration类似时钟上的秒针在表盘上每走一格表示时间逝去了一秒。

5、WheelSize:表示时间轮数据数组的长度;如图1所示,该时间轮定时器的WheelSize为8.

6、触发时间:延时任务期望被触发执行的时间;比如,用户提交延时任务的时间为凌晨0点,任务期望的延时执行时间为5分钟,则延时任务触发执行的时间为00:05:00。

7、触发轮次:触发轮次也是一个计数器,用来模拟时针在表盘上走过的圈数,从0开始计数。如图1所示,图1所示的时间轮定时器的WheelSize为8,TickDuration为1秒,则整个时间轮可以表示的时间范围仅仅为8秒。如果提交一个延迟10秒执行的任务,就需要触发轮次来辅助确定延时任务真正的触发时间。

时间轮定时器的本质是模拟时钟运行,使用一个固定长度的数据结构模拟时钟表盘,表盘上的每一个Bucket都是一个双向链表数据结构,该双向链表中保存着待执行的延时任务。时间轮定时器启动以后,记录启动时间,并使用操作系统提供的线程休眠函数驱动时针转动,每次时针指向下一个Bucket时,开始遍历双向链表内的延时任务是否满足触发条件,如果有满足触发条件的任务,则从双向链表中移除此任务并触发执行。当线程遍历完毕当前时针指向的bucket后,执行线程休眠,等待操作系统唤醒后,执行时针指向下一个bucket;此过程循环往复。基于时间轮定时器的运行过程,可以把用户通过时间轮定时器执行定时任务的过程分为三个阶段,即延时任务提交阶段、延时任务触发阶段以及推动时间轮定时器转动。

延时任务提交阶段:用户把需要执行的延时任务、需要执行的延时任务的延时时间提交给时间轮定时器。时间轮定时器以自身的启动时间为基准时间,使用延时任务的提交时间、时间轮定时器的WheelSize、时间轮定时器的tick、时间轮定时器的TickDuration,计算出用户提交的延时任务归属的目标Bucket的标识号、用户提交的延时任务的触发时间以及触发轮次。然后,时间轮定时器将用户提交的延时任务追加到目标Bucket中的双向链表的尾部,等待时间轮触发器进行触发执行。其中,时间轮定时器在将用户提交的延时任务追加到目标Bucket中的双向链表时,需要将延时任务的触发时间、触发轮次保存到Bucket中的双向链表中。

延时任务触发阶段:时间轮定时器启动以后,整个运行过程都是在模拟时钟转动。Tick每次+1之前,都需要调用操作系统函数sleep等待一段时间,每次等待的时长为TickDuration。在每次Tick+1后,都可以认为Tick指向了一个新的Bucket。Tick每指向一个新的Bucket,时间轮定时器都需要根据当前时间轮定时器的触发轮次的触发时间,遍历Tick指向的Bucket内的任务列表中的任务,确定在当前时间轮定时器的触发轮次下需要被触发执行的延时任务。

推动时间轮定时器转动:推动时钟轮定时器转动即推动时钟轮定时器中的Tick转动。其中,推动Tick转动是指时间轮定时器在运行过程中的一个动作,其目的是等待时间流逝,使得现实时间与Tick表示的值可以映射起来,从而实现Tick转动的效果。

接下来,以一个具体的实施例对时间轮定时器触发执行延时任务的过程进行说明。如图2所示,时间轮定时器的WheelSize为8,TickDuration为1秒,Tick为0,时间轮定时器的启动时间为00:00:00。

当时间来到00:00:01时,由于时间流逝了1秒,所以在00:00:01时,tick为1。此时,时间轮定时器需要遍历Bucket1中的双向链表中存储的延时任务,将任务触发时间小于等于00:00:01,且触发轮次等于0的延时任务从Bucket1中的双向链表中删除,并触发删除的从双向链表中删除的延时任务执行。

若用户在此时(00:00:01)提交了一个延时任务A和一个延时任务B。任务A的延迟执行时间为1秒,任务B的延迟执行时间为9秒。时间轮定时器可以根据任务提交时时间轮定时器的时间(00:00:01)以及任务A的延迟执行时间(1秒),得到任务的延时任务A的触发时间为00:00:02。然后,时间轮定时器根据任务A的触发时间、时间轮定时器的TickDuration、时间轮定时器的WheelSize,得到任务A归属的时间轮定时器的Bucket的标识号为2(即任务A需要被存储在Bucket2中的双向链表中)。以及时间轮定时器根据任务A的触发时间、时间轮定时器的TickDuration、时间轮定时器的WheelSize,得到任务A的触发轮次为0。其中,延时任务A的触发时间=任务提交时时间轮定时器的内部时间+任务A的延迟执行时间。任务A归属的时间轮定时器的Bucket的标识号=延时任务A的触发时间/TickDuration%WheelSize。任务

时间轮定时器可以根据任务提交时时间轮定时器的时间(00:00:01)以及任务B的延迟执行时间(9秒),得到任务的延时任务B的触发时间为00:00:10。然后,时间轮定时器根据任务B的触发时间、时间轮定时器的TickDuration、时间轮定时器的WheelSize,得到任务B归属的时间轮定时器的Bucket的标识号为2。以及时间轮定时器根据任务B的触发时间、时间轮定时器的TickDuration、时间轮定时器的WheelSize,得到任务B的触发轮次为1。

可以理解的是,在本申请实施例中,在计算任务A、任务B的触发时间时,计算的是任务A、任务B的触发时间在时间轮定时器内部表示的时间(是一个相对时间而非绝对时间)。在理想情况下,时间轮定时器的内部时间和时间轮定时器所处的计算设备的系统的时间是相同的。在一些异常情况下,比如人为修改时间轮定时器的所处的计算设备的系统时间,或者时间轮定时器所处的计算设备的系统发生故障,会造成时间轮定时器的内部时间与时间轮定时器的系统时间不相同。

时间轮定时器在遍历完Bucket1中的延时任务或者在将用户提交的延时任务存储到相应的Bucket中以后,时间轮定时器需要循环休眠等待,直到当前时间大于等于Tick指向Bucket2的时间。时间轮定时器每次休眠结束以后,都需要判断当前时间是否大于等于Tick指向Bucket2的时间。具体地,时间轮定时器可以计算Tick指向Bucket2相对于时间轮定时器启动时间需要等待的时间nextTick。其中,nextTick=(Tick+1)*TickDuration=2s。然后,时间轮定时器计算当前时间与时间轮定时器启动时间之差dt。时间轮定时器将dt与nextTick进行比较。若dt<nextTick,则将时间轮定时器需要继续休眠。时间轮定时器计算休眠时间st,其中st=nextTick-dt。时间轮定时器调用函数sleep(st)进行休眠。若dt≥nextTick,则将时间轮定时器的Tick加1,Tick指向Bucket2。时间轮定时器需要遍历Bucket2中的双向链表中存储的延时任务。

可以理解的是,在本申请实施例中,当前时间指的是时间轮定时器在执行相应操作时的系统时间。

当时间来到00:00:02时,时间轮定时器计算得到当前时间与时间轮定时器的启动时间之差dt为2秒。在00:00:02时,时间轮定时器确定dt=nextTick。此时,时间轮定时器需要遍历Bucket2中存储的延时任务。参照图2可知,在00:00:02时,Bucket2中存储了任务A和任务B,时间轮定时器需要将任务A和任务B的触发时间和触发轮次,分别与时间轮定时器的当前时间(00:00:02)和当前触发轮次(0)进行比较。由于任务A的触发时间等于时间轮定时器的当前时间,任务A的触发轮次等于时钟轮定时器的触发轮次,所以可以确定任务A需要被触发,时间轮定时器将任务A从Bucket2中的双向循环链表中删除,并触发任务A执行。

当时间来到00:00:09时,时间轮定时器的Tick指向Bucket1,时间轮的触发轮次为1。此时,可以确定Tick指向Bucket2相对于时间轮定时器启动时间需要等待的时间nextTick为10秒。

当时间来到00:00:10时,时间轮定时器计算得到当前时间与时间轮定时器的启动时间之差dt为10秒。在00:00:10时,时间轮定时器确定dt=nextTick。此时,时间轮定时器需要遍历Bucket2中存储的延时任务。参照图2可以知,在00:00:10时,Bucket2中存储了任务B,时间轮定时器需要将任务B的触发时间和触发轮次,分别与时间轮定时器的当前时间(00:00:10)和当前触发轮次(1)进行比较。由于任务B的触发时间等于时间轮定时器的当前时间,任务B的触发轮次等于时钟轮定时器的触发轮次,所以可以确定任务B需要被触发,时间轮定时器将任务B从Bucket2中的双向循环链表中删除,并触发任务B执行。

虽然,图2所示的时间轮定时器能够对用户提供的延时任务进行按时调度。但是在大量延时任务的场景下,不同延时长度的任务可能会被分配到相同的Bucket中。比如,延时一小时执行的任务可能和延时10分钟执行的任务在同一个Bucket链表中,这就导致在时间轮触发时需要遍历链表中的每一个任务,检查任务触发轮次,触发时间,从而会影响任务触发时的遍历效率。进一步地,在上述实施例中,时间轮定时器转动时,依赖操作系统函数sleep进行休眠,等待时间流逝。sleep函数最小仅支持毫秒单位,而系统时间精度为最小为纳秒,由于时间单位的差异,在时间轮转动时经常会出现sleep(0)毫秒的情况,sleep(0)对操作系统而言是一个耗时十几个指令周期的操作,时间轮在转动时本质上就是等待,此时操作系统应该把CPU时间片更多的分配给其他进程或线程,以达到整个系统CPU资源利用率最佳。如果频繁sleep(0)会导致操作系统会频繁唤醒时间轮运行线程,检查当前时间是否满足等待要求,从整个系统的角度看浪费了CPU资源。

有鉴于此,本申请实施例提供了一种延时任务的执行方法,主要通过时间轮定时进行延时任务的触发。当时间轮定时器接收到用户提交的延时任务以后,在将用户提交的延时任务存储到时间轮定时器中的Bucket中时,根据延时任务的触发轮次进行分层存储,即每一个Bucket中,具有相同触发轮次的延时任务被存储到同一个任务链表中,减少了时间轮定时器在进行任务触发时,需要遍历的任务的数量,提升了时间轮定时器任务触发性能,使得时间轮定时器可以支持更大量的延时任务。进一步地,时间轮定时器通过调用x86指令pause配合sleep系统函数推动时间轮转动,可以在性能不变的情况下更好的利用系统CPU资源,降低CPU功耗。

示例性的,图3示出了本发明申请的一种应用场景。如图3所示,该场景下可以包括服务器和客户端(Client),多个客户端可以和服务器建立Socket连接。多个客户端与服务器进行连接时,服务器需要定时的检查客户端与高效能服务器之间的连接是否有效。具体地,服务器可以通过服务器上的时间轮定时器,来实现对服务器与客户端之间的连接的有效性进行检测。

需要说明的是,图3所示的应用场景并不构成对本申请实施例的限定。本发明申请可以应用到需要大量使用延时任务的业务场景。比如,电商订单确认、红包退款检查、游戏中的道具有效性的确定等。

示例性的,本发明申请实施例提供了一种时间轮定时器的结构示意图。如图4所示,时间轮定时器由时间数组和计数器(tick)组成。其中,时间轮数据为首尾相连的环形数组,该环形数组中包括多个槽位(也可以称之为时间槽),每一个时间槽内都保存有一个bucket数据结构。整个时间轮数据可以模拟时钟的表盘,计数器可以模拟时钟的时针走动。在每一个时间槽内都由至少一个任务列表组成,其中每一个任务列表中存储的延时任务都具有相同的时钟触发轮次。如图4所示,在时间槽Bucket1中,包括多个双向链表,每一个双向链表构成了一个任务列表,每一个任务列表存储具有相同触发轮次的延时任务。即在本发明申请实施例中,对时间轮定时器中的存储的延时任务按照触发轮次进行分层管理,使得时间轮定时器在随某一个Bucket中的延时任务进行触发时,只需要根据时间轮定时器的运行轮次,遍历该Bucket中的一个任务列表中的延时任务,而不需要遍历Bucket中的所有延时任务。把时间轮定时器任务触发性能从O(n)提升至O(1),提升了任务的触发性能。

示例性的,图5示出了一种计算设备的硬件结构,该计算设备上部署有图4所示的时间轮定时器,该计算设备可以是图3中的服务器。如图5所示,该计算设备包括:处理器510、网络接口520、存储器530。其中,处理器510、网络接口520以及存储器530可以通过总线或者其他方式连接。

本申请实施例中,处理器510(或称为中央处理器(central processing unit,CPU))是计算设备的计算核心及控制核心。例如,处理器510可以驱动时间轮定时器转动,以及触发时间轮定时器中存储的延时任务执行。

网络接口520可以包括标准的有线接口,无线接口(如WI-FI,移动通信接口等),受处理器510的控制用于收发数据,例如,接收用户发送的延时任务或者换其他终端设备建立连接。

存储器530(memory)是计算设备的记忆设备,用于存放程序和数据,例如,存放延时任务等。可以理解的是,存储器530可以是高速RAM存储器,也可以是非易失性存储器(non-volatile memory),例如至少一个磁盘存储器;可选地还可以是至少一个位于远离前述处理器510的存储装置。存储器530提供存储空间,该存储空间存储了服务器的操作系统和可执行程序代码,可包括但不限于:Windows系统(一种操作系统),Linux系统(一种操作系统),鸿蒙系统(一种操作系统)等等,在此不做限定。

可以理解的是,本申请实施例图5示意的结构并不构成对计算设备的具体限定。计算设备可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。

接下来,基于上文所描述的内容,在图5所示的计算设备中对本申请实施例提供的一种延时任务的执行方法进行介绍。

参阅图6,图6为本申请实施例提供的一种延时任务的执行方法的流程图。该方法可以由图5所示的计算设备中的处理器执行。参见图6,该方法包括:S601-S609。

S601,确定时间轮定时器的循环指针指向第一时间槽的时间nextTick;其中,第一时间槽为循环指针当前指向的时间槽的下一个时间槽。

在本实施例中,在通过时间轮定时器来触发延时任务执行时,需要确定时间轮定时器的初始化状态。其中,时间轮定时器的初始化状态包括:时间轮定时器的启动时间、时间轮定时器具有的时间槽(即Bucket)的个数、时间轮定时器的单位时间TickDuration。

在一个可能的示例中,如图7所示,该时间轮定时器具有12个时间槽(Bucket0-Bucket11)、时间轮定时器的单位时间TickDuration为1min、时间轮定时器的启动时间为8:00。在8:31的时候,可以确定时间轮定时器的循环指针指向Bucket7,时间轮定时器的循环指针转动的次数tick为31,时间轮定时器的转动轮数为2。此时,可以计算时间轮定时器指向Bucket8的时间nextTick。

nextTick=(Tick+1)*TickDuration=32min。其中,时间轮定时器指向Bucket8的时间nextTick表示时间轮内部的相对时间,即时间轮定时器指向Bucket8的时间相对于时间轮定时器的启动时间需要等待的时间。

可以理解的是,在理想情况下,时间轮定时器的内部时间(相对时间)和时间轮定时器所处的计算设备的系统的时间(绝对时间)是相同的。在一些异常情况下,比如人为修改时间轮定时器的所处的计算设备的系统时间,或者时间轮定时器所处的计算设备的系统发生故障,会造成时间轮定时器的内部时间与时间轮定时器的系统时间不相同。而时间轮定时器的内部时间是无法更改的,即时间轮定时器的内部时间是绝对正确的。因此,为了保证任务触发的准确性,在本发明申请实施例中,可以参照时间轮定时器的内部时间,进行延时任务触发。

S602,确定当前时间与时间轮定时器的启动时间之差dt。

在本实施例中,当前时间是指当前时刻时间轮定时器所处的计算设备的系统显示时间,当前时间是随着时间的流逝而不断更新的。以图7为例,随着时间的流逝,当系统时间来到8:32时(即当前时间变为了8:32),时间轮定时器的启动时间为8:00。则dt=当前时间-时间轮定时器的启动时间=32min。

S603,将nextTick与dt进行比较,若dt≥nextTick,则执行S605,否则执行S604。

在本实施例中,通过将nextTick与dt进行比较,来确定是否需要转动时间轮定时器的循环指针。若dt≥nextTick则表示绝对时间已经流逝了至少一个时间轮定时器的单位时间,此时需要转动时间轮定时的器循环指针。若dt<nextTick则表示流逝的时间不足有时间轮定时的一个单位时间,此时时间轮定时器的循环指针不需要转动,时间轮定时器进行休眠。

可以理解的是,在本发明申请中,时间轮定时器只是模拟时钟转动,并不是时间轮定时器在真的转动。时间轮定时器挺多增加循环指针的转动次数,来达到循环指针在时间轮定时器上转动的效果。

S604,触发时间轮定时器进行休眠。

在本实施例中,计算设备的系统时间精度最小为纳秒,而系统函数sleep最小仅支持毫秒单位。由于时间单位的差异,会使得时间轮定时器在转动过程中会出现sleep 0毫秒的情况。为了避免在时间轮定时器在转动过程中会出现sleep 0毫秒的情况,在触发时间轮定时器进行休眠的过程中,可以使用pause指令配合sleep函数的方式来触发时间轮定时器进行休眠,即优化时间轮定时器循环指针的推动。

在一个可能的示例中,触发时间轮定时器进行休眠的过程如图8所示,包括S6041-S6044。S6041,计算时间轮定时器需要休眠的时间st=(nextTick-dt)/1000000,其中,计算的时间轮定时器需要休眠的时间st为毫秒级别的时间。S6042,确定时间轮定时器需要休眠的时间st是否大于等于,若st≥1执行S6043,否则执行S6044。S6043,调用函数sleep(st)进行休眠。S6044,执行pause指令进行休眠。

在上述示例中,由于计算设备系统时间精度最小为纳秒,系统函数sleep最小仅支持毫秒单位。因此,在确定时间轮定时器的休眠时间时,需要把纳秒级别的休眠时间换算成毫秒,即“nextTick-dt”为纳秒级别的休眠时间,“(nextTick-dt)/1000000”为毫秒级别的休眠时间。当时间轮定时器确定需要休眠的时间小于1毫秒时,则采用pause指令来触发时间轮定时器的休眠。因此,当st≥1毫秒时,可以调用函数sleep(st)进行休眠触发时间轮定时器进行休眠,当st<1毫秒时,可以通过执行pause指令触发时间轮定时器进行休眠。

具体为,当时间轮定时器的进程调用Pause指令以后,时间轮定时器的进程会进行休眠,但是时间轮定时器的进程不会释放CPU。时间轮定时器的进程会在一定的时间间隔(比如10个钟周期)后自动唤醒,并检查当前时间是否大于时间轮定时器的指针指向当前时间槽的下一个时间槽的时间。若当前时间是否大于时间轮定时器的指针指向当前时间槽的下一个时间槽(第一时间槽)的时间,则令时间轮定时器的指针指向第一时间槽,否则时间轮定时器的进程会继续休眠,等待下一次唤醒。通过pause指令配合sleep函数的方式推动时间轮定时器进行转动,可以在性能不变的情况下更好的利用系统的CPU资源,并且降低了CPU功耗。

S605,将时间轮定时器的循环指针指向第一时间槽,并确定第一时间槽的索引号。

在本实施例中,若dt≥nextTick则表示绝对时间已经流逝了至少一个时间轮定时器的单位时间。此时可以将时间轮定时器的循环指针指向下一个时间槽,即将循环执行tick的转动次数加1。以图7为例,当时间来到8:32时,计算得到dt=nextTick。此时tick=31+1=32,tick指向Bucket8。

S606,根据时间轮定时器的循环指针的转动次数,确定时间轮定时器需要触发的任务轮次。

在本实施例中,当时间轮定时器的循环指针指向一个新的Bucket,还需要确定在时间轮定时器启动以后,时间轮定时器的循环指针第多少次指向该Bucket,即时间轮定时器需要触发的任务轮次。

在一个可能的示例中,参见图7,当前时间为8:32,tick为32,时间轮定时器具有12个时间槽,即wheelSize为12。此时,可以得到时间轮定时器的任务触发轮次为2。

S607,根据时间轮定时器需要触发的任务轮次,从第一时间槽中的至少一个任务列表中确定第一任务列表,其中第一任务列表对应的任务轮次为时间轮定时器需要触发的任务轮次。

在本实施例中,参见图7,当当前时间为8:32时,时间轮定时器的循环指针指向Bucket8,时间轮定时器的触发轮次为2。此时,时间轮定时器需要对Bucket8中的触发轮次为2的任务列表中的延时任务进行遍历,并对满足要求的延时任务进行触发。

S608,将第一任务列表中的延时任务从第一任务列表中移除,并触发被移除的延时任务进行执行。

在本实施例中,时间轮定时器从第一时间槽中确定出第一任务列表以后,时间轮定时器可以将第一任务列表中的延时任务移出第一任务列表进行执行。其中,移出第一任务列表的延时任务可以由时间轮定时器执行,也可由其他进程进行执行。

S609,删除第一时间槽中的第一任务列表。

在本实施例中,为了减少时间轮定时器占用的存储空间,时间轮定时器在将第一任务列表中的延时任务移除以后,时间轮定时器还可以删除第一时间槽中的第一任务列表。

在一个可能的实施例中,由于时间轮定时器的时间精度有限。为了使得时间轮定时器触发延时任务的时间更加精确。在执行完S607,确定第一时间槽中需要触发的第一任务列表以后,时间轮定时器在触发第一任务列表中的延时任务执行之前,将第一任务列表中的延时任务与时间轮定时器的当前时间进行比较,根据比较结果确定是否触发第一任务列表中的延时任务。参照图9,时间轮定时器在执行完S607以后,还包括:S608-S613。

S608,根据时间轮定时器所属计算设备的系统时间和时间轮定时器的启动时间,确定时间轮定时器的当前时间。

在本实施例中,为了保证任务触发的准确性,在触发第一任务列表中的延时任务之前,还需要确定时间轮定时器的当前时间,即时间轮定时器的内部计时器值。具体地,参照图7,时间轮定时器的启动时间为8:00,时间轮定时器的内部计时器的值为0。当时间轮定时器所述计算设备的系统时间为8:32时,可以确定时间轮定时器的内部计时器的值为:0+32*60000000000=1,920,000,000,000纳秒。

S609,遍历第一任务列表中的延时任务,当第一任务列表中存在有延时任务的触发时间小于时间轮定时器的当前时间时,执行S610,否则执行S611。

在本实施例中,时间轮定时器在确定时间轮定时器的当前时间以后,可以将时间轮定时器的当前时间与第一任务列表中的延时任务的触发时间进行比较。其中,第一任务列表中延时任务的触发时间是指相对与时间轮定时器的启动时间的触发时间,是一个相对时间。在一个可能的示例中,参照图7,以Bucket8中的延时任务5为例,对延时任务5的触发时间进行说明,假设,延时任务5是在8:00提交的,延时任务5的延时执行时间为32min,可以确定延时任务5在时间轮定时器的内部触发时间为:0+32*60000000000=1,920,000,000,000纳秒。

S610,将触发时间小于时间轮定时器的当前时间的延时任务从第一任务列表中移除,并触发被移除的延时任务进行执行。

在本实施例中,时间轮定时器从第一时间槽中确定出第一任务列表以后,时间轮定时器可以将第一任务列表中延时任务的触发时间小于时间轮定时器当前时间的延时任务,从所述第一任务列表中移除。其中,移出第一任务列表的延时任务可以由时间轮定时器执行,也可由其他进程进行执行。当第一任务列表中存在延时任务的触发时间大于时间轮定时器的当前时间时,时间轮定时器不对该延时任务进行处理。

在一个可能的示例中,参照图7,当系统时间为8:32时,若延时任务5的触发时间大于时间轮定时器的当前时间,而延时任务7的触发时间小于时间轮定时器的当前时间。那么时间轮定时器,将按时任务7从对应的任务列表中移除,并触发执行,而不需要对延时任务5进行处理。

S611,遍历第一时间槽中的第二任务列表,确定第二任务列表中是否存在有延时任务,若第二任务列表中存在延时任务,执行S612,否则执行S613;其中,第二任务列表对应的任务轮次为时间轮定时器需要触发的任务轮次的上一个轮次。

在本实施例中,时间轮定时器在遍历完第一时间槽中,时间轮定时器当前触发轮次对应的任务列表以后。时间轮定时器还需要对第一时间槽中,上一触发轮次对应的任务列表进行处理。

S612,从第二任务列表中移除延时任务,并触发被移除的延时任务进行执行。

在本实施例中,若第二任务列表中存在延时任务,时间轮定时器将该延时任务移出对应的任务列表,并触发该延时任务执行。

S613,从第一时间槽中删除第二任务列表,并执行S601。

在本实施例中,为了减少时间轮定时器对存储空间的占用,时间轮定时器需要从第一时间槽中删除上一触发轮次对应的任务列表。

可以理解的是,S612为可选步骤,时间轮定时器在删除上一触发轮次对应的任务列表时,可以直接进行删除。可以在上一触发轮次中存在未执行的延时任务的情况下,触发上一触发轮次中未执行的延时任务执行以后,再删除该任务列表。

可以理解的是,在上述实施例中涉及的相对时间也可以用绝对时间进行替换。本发明申请实施例并不对此做限定。

在本申请实施例中,时间轮定时器对每一个Bucket中的延时任务按照触发轮次,进行分层存储。使得时间轮定时器在进行任务触发时,只需要遍历对应Bucket中的与当前触发轮次对应的任务列表中的延时任务,而不需要遍历Bucket中的所有延时任务。通过任务分层的机制,有效提升了时间轮定时器的任务触发性能,使得时间轮定时器可以支持更大量的延时任务。

在一个可能的实施例中,在执行图6或者图8所示的方法之前,还需要将延时任务存储到时间轮定时的时间槽中的任务列表中。示例性的,本申请实施例提供了一种延时任务的存储方法。该方法可以由图5所示的计算设备中的处理器执行。参见图10,该方法包括:

S1001,确定目标延时任务的提交时间和延时执行时间。

在本实施例中,时间轮定时器接收到目标延时任务以后,需要确定目标延时任务的提交时间和延时执行时间。其中目标延时任务可以为用户提交的目标延时任务,也可以是时间轮定时器所属的计算设备生成的延时任务。

S1002,根据目标延时任务的提交时间、延时执行时间和时间轮定时器的启动时间,确定目标延时任务的触发时间。

在本实施例中,时间轮定时器在将接收到的目标延时任务存储到时间轮定时器的存储空间之前,时间轮定时器还需要确定目标延时任务的触发时间。

在一个可能的示例中,目标延时任务的触发时间可以是指目标延时任务相对于时间轮定时器内部时间的触发时间。具体地,在确定目标延时任务的触发时间t1时,可以先根据时间轮定时器的启动时间和目标延时任务的提交时间,确定目标延时任务的提交时间相对于时间轮定时器的内部时间t2。然后,根据目标延时任务的延时执行时间t3和目标延时任务的提交时间相对于时间轮定时器的内部时间t2,确定目标延时任务的触发时间t1。其中,t1=t2+t3。

可以理解的是,通常情况下,计算设备的系统时间精度最小为纳秒。所以在计算时间轮定时器的内部时间时,可以将时间轮定时器的内部时间换算纳秒。

S1003,根据目标延时任务的触发时间、时间轮定时器的单位时间以及时间轮定时器具有的时间槽的个数,确定目标延时任务的触发轮次。

在本实施例中,由于时间轮定时器的时间槽的个数有限,在将目标延时任务存储到时间轮定时器的存储空间之前,时间轮定时器还需要确定目标延时任务的触发轮次。

在一个可能的示例中,时间轮定时器可以根据目标延时任务的触发时间t1、时间轮定时器的单位时间TickDuration、时间轮定时器的时间槽的个数wheelsize确定目标延时任务的触发轮次。具体地,目标延时任务的触发轮次=t1/TickDuration/wheelsize。

S1004,根据目标延时任务的触发时间、时间轮定时器的单位时间以及时间轮定时器的循环指针转动的次数确定存储目标延时任务的时间槽的索引号。

在本实施例中,时间轮定时器可以根据目标任务的触发时间t1、时间轮定时器的单位时间TickDuration、时间轮定时器的时间槽的个数wheelsize,确定存储目标延时任务的时间槽的索引号。具体地,存储目标延时任务的时间槽的索引号=t1/TickDuration%wheelsize。

S1005,根据目标延时任务的触发轮次,从存储目标延时任务的时间槽中的至少一个任务列表中确定目标任务列表。

在本实施例中,时间轮定时器在确定好存储目标延时任务的时间槽的索引号以后,时间轮定时器可以根据存储目标延时任务的时间槽的索引号,将目标延时任务存储到时间轮定时器对应的时间槽中。参照图7所示的时间轮定时器可知,每一个时间槽中的延时任务是分层存储的,即属于同一个触发轮次的延时任务存储到同一个任务列表中。因此,时间轮定时器在确定好存储目标延时任务的时间槽以后,还需要根据目标延时任务的触发轮次从时间槽中选取存储目标延时任务目标任务列表。然后,时间轮定时器将目标延时任务添加到目标任务列表中。当存储目标延时任务的时间槽中存在与目标延时任务的触发轮次对应的任务列表时,可以直接将该任务列表作为目标任务列表。当存储目标延时任务的时间槽中不存在与目标延时任务的触发轮次对应的任务列表时,时间轮定时器可以在存储目标延时任务的时间槽中,创建一个与目标延时任务触发轮次对应的任务列表,作为目标任务列表。

S1006,将目标延时任务存储到目标队列中。

在本实施例中,若存储目标延时任务的时间槽中存在与目标延时任务的触发轮次相匹配的任务列表,时间轮定时器可以直接将该延时任务添加到对应的任务列表中。参照图7所示时间轮定时器,目标延时任务为任务15,存储目标延时任务的时间槽为Bucket8,目标延时任务的触发轮次为4,时间轮定时器可以直接将目标延时任务存储在存储轮次为4的任务列表中。其中,在将目标延时任务存储到图7所示的时间轮定时器以后,时间轮定时器的结构示意图如图11a所示。

若存储目标延时任务的时间槽中不存在与目标延时任务的触发轮次相匹配的任务列表。时间轮定时器可以在对应的时间槽中创建一个新的任务列表,并将目标延时任务存储到新人的任务列表中。具体地,参照图7所示的时间轮定时器,目标延时任务为任务15,存储目标延时任务的时间槽为Bucket8,目标延时任务的触发轮次为4。但是,在Bucket8中不存在触发轮次为5的任务列表。此时,时间轮定时器可以在Bucket8中创一个触发轮次为5的任务列表,并将目标延时任务存储到该任务列表中。其中,在将目标延时任务存储到图7所示的时间轮定时器以后,时间轮定时器的结构示意图如图11b所示。

接下来,以以图7所示时间轮定时器为例,对图10所示的延时任务的存储过程进行介绍。参见图7,时间轮定时器的wheelsize为12,即时间轮定时器具有12个时间槽(Bucket0-Bucket11)、时间轮定时器的单位时间TickDuration为1min、时间轮定时器的启动时间为8:00。在8:31时,用户提交的任务A、任务A的延迟执行时间为30min。

在接收到用户提交的任务A以后,首先需要计算任务A的触发时间。其中,为了保证延时任务触发的准确性,在计算任务A的触发时间时,可以计算任务A触发时时间轮定时器的内部表示时间。

由于时间轮定时器所属的计算设备的系统时间精度为最小为纳秒,所以在计算任务A的触发时间时,可以以纳秒为单位进行计算。其中,1分钟=60000000000纳秒。

时间轮定时器在8:00启动,定时器内部不使用绝对时间(即时间轮定时器所属的计算设备的系统时间),而是以一个内部计时器表示。为了方便计算,可以假设时间轮定时器的内部计时器在启动时为0(任意值都可以,不影响计算结果)。

接下来,分别计算任务A的触发时间、任务A的触发轮次、时间轮定时器中存储任务A的时间槽的索引号。

时间轮定时器在8:31接收到任务A,在8:31时,时间轮定时器的内部计时器值为:0+31*60000000000=1,860,000,000,000纳秒。

任务A触发时,时间轮定时器的每部计时器值(即任务A的触发时间)为:

任务A的触发时间=任务提交时时间轮定时器的内部计时器值+任务A的延迟执行时间=1,860,000,000,000+30*60000000000=3,660,000,000,000纳秒。

任务A的触发轮次为:

任务

时间轮定时器中存储任务A的时间槽的索引号:

Bucket索引=任务A的触发时间/TickDuration%wheelsize=(3,660,000,000,000/60000000000)%12=1。

即时间轮定时器在8:31接收到任务A以后,需要将任务A存储到时间轮定时器的Bucket1中触发轮次为5的任务列表中。当Bucket1中存在触发轮次为5的任务列表时,时间轮定时器可以直接将任务A存储到该任务列表中。当Bucket2中不存储在触发轮次为5的任务列表时,时间轮定时器需要先在Bucket1中创建一个触发轮次为5的任务列表,然后再将任务A存储到该任务列表中。

可以理解的是,在上述实施例中,虽然在计算延时任务的触发时间、延时任务的触发轮次时,以及存储延时任务的时间槽的索引号时,为了方便计算将计算的各个时间的时间单位统一为纳秒,以纳秒为单位进行计算仅仅是一个示例性的说明,不应对本申请实施例的实方式程构成任何限定。时间轮定时器的实际运行过程中,也可以以其他时间单位进行计算,比如,毫秒。

可以理解的是,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。此外,在一些可能的实现方式中,上述实施例中的各步骤可以根据实际情况选择性执行,可以部分执行,也可以全部执行,此处不做限定。另外,上述实施例中的任意特征的全部或部分在不矛盾的前提下,可以自由地、任何地组合。组合后的技术方案也在本申请的范围之内。

基于上述实施例中的方法,本申请实施例提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,当计算机程序在处理器上运行时,使得处理器执行上述实施例中的方法。

基于上述实施例中的方法,本申请实施例提供了一种计算机程序产品,其特征在于,当计算机程序产品在处理器上运行时,使得处理器执行上述实施例中的方法。

基于上述实施例中的方法,本申请实施例提供了一种计算设备,计算设备包括主板和芯片。其中,芯片集成在主板上,芯片包括至少一个存储器,用于存储程序;至少一个处理器,用于执行存储器存储的程序,当存储器存储的程序被执行时,处理器用于执行上述实施例中的方法。在本申请实施例中,计算设备可以是服务器、主机等网络设备。

基于上述实施例中的方法,本申请实施例还提供了一种芯片。请参阅图12,图12为本申请实施例提供的一种芯片的结构示意图。如图12所示,芯片1200包括一个或多个处理器1201以及接口电路1202。可选的,芯片1200还可以包含总线1203,处理器1201还可以包括业务核和安全核,安全核中还可以包括OTP寄存器(图12中未示出)。

处理器1201可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器1201中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器1201可以是通用处理器、数字通信器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

接口电路1202可以用于数据、指令或者信息的发送或者接收,处理器1201可以利用接口电路1202接收的数据、指令或者其它信息,进行加工,可以将加工完成信息通过接口电路1202发送出去。

可选的,芯片1200还包括存储器,存储器可以包括只读存储器和随机存取存储器,并向处理器提供操作指令和数据。存储器的一部分还可以包括非易失性随机存取存储器(NVRAM)。

可选的,存储器存储了可执行软件模块或者数据结构,处理器可以通过调用存储器存储的操作指令(该操作指令可存储在操作系统中),执行相应的操作。

可选的,接口电路1202可用于输出处理器1201的执行结果。

需要说明的,处理器1201、接口电路1202各自对应的功能既可以通过硬件设计实现,也可以通过软件设计来实现,还可以通过软硬件结合的方式来实现,这里不作限制。

应理解,上述方法实施例的各步骤可以通过处理器中的硬件形式的逻辑电路或者软件形式的指令完成。

本申请的实施例中的方法步骤可以通过硬件的方式来实现,也可以由处理器执行软件指令的方式来实现。软件指令可以由相应的软件模块组成,软件模块可以被存放于随机存取存储器(random access memory,RAM)、闪存、只读存储器(read-only memory,ROM)、可编程只读存储器(programmable rom,PROM)、可擦除可编程只读存储器(erasable PROM,EPROM)、电可擦除可编程只读存储器(electrically EPROM,EEPROM)、寄存器、硬盘、移动硬盘、CD-ROM或者本领域熟知的任何其它形式的存储介质中。一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于ASIC中。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者通过所述计算机可读存储介质进行传输。所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。

可以理解的是,在本申请的实施例中涉及的各种数字编号仅为描述方便进行的区分,并不用来限制本申请的实施例的范围。

技术分类

06120115637384