任务队列的处理方法和装置以及存储介质
技术领域
本申请涉及计算机技术领域,尤其涉及任务队列的处理方法和装置以及非瞬时性计算机可读存储介质。
背景技术
在计算机***中,经常会用到多线程或者多进程编程,多线程和多进程编程过程中一个很重要的模式就是任务队列。任务队列是一种数据结构,该数据结构一般具有一个或者若干个任务的生产方(即,任务的生产者)和任务的处理方(即,任务的消费者),生产方会向任务队列中添加任务,处理方从任务队列中获取任务,在任务完成后,处理方可通过相关接口通知生产方该任务已经完成。
例如,***中的一个功能的完成会需要若干任务,而多个任务一般很难在一个线程或者一个进程中完成,多个线程或多个进程之间往往需要通过任务队列来通信。上游线程或进程(生产方)在需要的时候向任务队列中添加一个任务,下游线程或进程(处理方)不断从任务队列中获取任务。在任务完成后,任务的处理方可通过特定接口通知任务的生产方该任务已完成。可见,如何实现任务队列并适当地对其进行处理显得尤为重要。
数据平面开发套件(DPDK:Data Plane Development Kit)是用于快速数据包处理的函数库与驱动集合的套件,其可提高数据处理性能和吞吐量,并提高数据平面应用程序的工作效率。DPDK中的ring是基于循环队列的实现,它提供了对任务队列的管理,并且具有两组变量head/tail变量,其中prod_head和prod_tail表示任务的生产方的状态,cons_head和cons_tail表示任务的处理方的状态。
图1示出了DPDK中的ring所实现的任务队列的示例。如图1所示,在向任务队列中添加一个任务对象时,首先把prod_head向前移动,然后将任务对象添加到prod_head之前指向的位置,最后将prod_tail向前移动。在消费一个任务对象(即,处理该任务)时,首先把cons_head向前移动,然后获取之前cons_head指向的任务对象,最后将cons_tail向前移动。prod_tail和cons_tail之间的任务对象,就是在ring中待消费的任务对象。如果有多个线程或进程同时操作该任务队列,一般***会通过锁或者原子指令来保证线程或进程安全。
由于现代计算机***具有复杂的存储层次(memory hierarchy)结构,因此例如图1中的一个prod_head向前移动操作(prod_head=prod_head+1)其实由多条指令完成。同时,由于ring中变量较多,所以很难做到在任一时间点重置该任务队列都不丢任务。而且多个线程或进程同时操作ring时,ring的状态会很多。如果在任务的一个生产方向任务队列中添加任务时,需要对该生产方进行热升级(即,杀掉该生产方并重新拉起),那么该生产方的重启可能发生在向任务队列中添加任务的任意时刻,由于ring的状态很多,所以很难对该生产方做热升级。
发明内容
本申请提供了任务队列的处理方法和装置以及非瞬时性计算机可读存储介质。
根据本申请的第一方面,提供了一种任务队列的处理方法,包括:
任务的生产方向任务队列中添加任务,并且在任务状态位图中记录所述生产方向所述任务队列添加任务的操作;
任务的处理方从所述任务队列取出任务进行处理,并且在所述任务状态位图中记录所述处理方从所述任务队列取出任务的操作;
所述处理方完成对任务的处理,并且在所述任务状态位图中记录所述处理方完成对任务的处理的操作。
根据本申请的第二方面,提供了一种任务队列的处理装置,包括:
任务生产单元,用于向任务队列中添加任务;
任务处理单元,用于从所述任务队列取出并处理任务;
位图记录单元,用于在任务状态位图中记录向所述任务队列添加任务的操作、从所述任务队列取出任务的操作以及完成对任务的处理的操作。
根据本申请的第三方面,提供了一种装置,包括:
处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述处理器执行时,使得所述处理器实现如上所述的任一种方法。
根据本申请的第四方面,提供了一种非瞬时性计算机可读存储介质,其上存储有计算机程序,所述计算机程序在被处理器执行时,使得所述处理器实现如上所述的任一种方法。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本申请的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了DPDK中的ring所实现的任务队列的示例;
图2示出了根据本申请一个实施方式的任务队列的处理方法的流程图;
图3示出了根据本申请另一实施方式的任务队列的处理方法的流程图;
图4示出了根据本申请一个实施方式根据任务状态位图中的记录确认任务队列中的任务的状态的流程图;
图5示出了根据本申请一个实施方式在任务状态位图中记录生产方向任务队列添加任务的操作的流程图;
图6示出了根据本申请一个实施方式在任务状态位图中记录处理方从任务队列取出任务的操作的流程图;
图7示出了根据本申请一个实施方式在任务状态位图中记录处理方完成对任务的处理的操作的流程图;
图8示出了根据本申请一个实施例的任务状态位图的示意图;
图9示出了根据本申请一个实施方式的任务队列的处理装置的示意图;
图10示出了根据本申请另一实施方式的任务队列的处理装置的示意图;
图11示出了根据本申请一个实施方式的状态确认单元的示意图;
图12示出了根据本申请一个实施方式的位图记录单元的示意图。
具体实施方式
以下参照附图对本申请的实施方式进行详细描述。应注意,以下描述仅仅是示例性的,而并不旨在限制本申请。此外,在以下描述中,将采用相同的附图标号表示不同附图中的相同或相似的部件。在以下描述的不同实施方式中的不同特征,可彼此结合,以形成本申请范围内的其他实施方式。
图2示出了根据本申请一个实施方式的任务队列的处理方法的流程图。如图2所示,该方法100可包括步骤S110至S130。在步骤S110中,任务的生产方向任务队列中添加任务,并且在任务状态位图中记录生产方向任务队列添加任务的操作。如上所述,在计算机***中完成一个功能需要处理若干个任务,***中的上游线程或进程在需要的时候会向任务队列中添加任务,下游线程或进程会不断从任务队列中获取任务进行处理。任务可以是例如输入/输出、网络请求等。根据本实施方式,在任务的生产方向任务队列中添加任务时,也就是在任务入队时,在任务状态位图中记录下该操作。任务状态位图(bitmap)是包含若干个位(bit)的数据集合,其中的每个位可具有0和1两个数值,即两种状态。可通过改变任务状态位图中的位的数值来记录操作,例如将某位从0变为1或从1变为0。
在步骤S120中,任务的处理方从任务队列取出任务进行处理,并且在任务状态位图中记录处理方从任务队列取出任务的操作。由此,在任务的处理方从任务队列取出任务进行处理时,也就是在任务出队时,可在任务状态位图中记录下该操作。随后,在步骤S130中,任务的处理方完成对任务的处理,并且在任务状态位图中记录处理方完成对任务的处理的操作。由此,在任务的处理方完成对任务的处理时,也就是在任务完成时,可在任务状态位图中记录下该操作。如上所述,可通过改变任务状态位图中的位的数值来记录诸如添加任务的操作、取出任务的操作和完成任务的操作,例如将某位从0变为1或从1变为0。
由此,通过设置任务状态位图来记录任务队列中的任务的入队、出队和完成操作,从而无论在任何时刻,均可通过查询该任务状态位图来获知任务队列中所有任务的当前状态,并且即便对于复杂度较高的***,也可以很方便地通过任务状态位图来完整地记录任务队列中所有任务的状态,从而可以很好地支持线程或进程的热升级需求。而且,任务的生产方和处理方不需要彼此进行通信,就可以通过任务状态位图来获知任务的状态。因此,生产方和处理方基本不需要引入其他逻辑就可以进行热升级。
图3示出了根据本申请另一实施方式的任务队列的处理方法的流程图。如图3所示,除了步骤S110至S130之外,该方法100还可包括步骤S140。为了简要起见,以下将仅描述图3所示的实施方式与图2的不同之处,并将略去其相同之处的详细描述。
在步骤S140中,根据任务状态位图中的记录,确认任务队列中的任务的状态。当***需要获知任务队列中任意任务的当前状态时,可方便地通过查询任务状态位图中的记录来获知。任务状态位图中包含多个位,对于任务队列中的任一任务而言,通过任务状态位图中与其对应的多个位的数值(0或1)的组合,即可判断出该任务处于什么状态。
图4示出了根据本申请一个实施方式根据任务状态位图中的记录确认任务队列中的任务的状态的流程图。如图4所示,上述步骤S140可包括子步骤S141和S142。在子步骤S141中,对任务状态位图中与任务队列中的任务相对应的多个位做异或运算。在任务状态位图中,可有多个位与一个任务相对应。例如,任务状态位图中的一个位可对应于该任务的入队操作,另一个位可对应于该任务的出队操作,还有一个位可对应于该任务的完成操作。在初始时,即该任务还未添加到任务队列中时,可将任务状态位图中的三个位分配给该任务,三个位上的数值可均预设为0(或者也可均为1)。当任务添加到任务队列中时,可将与该任务的入队操作相对应的位修改为1,与该任务的其他两个位的数值还保持为0。当任务被从任务队列中取出进行处理时,可将与该任务的出队操作相对应的位修改为1,此时与该任务的入队操作相对应的位的数值也已是1,但与该任务的完成操作相对应的位的数值仍为0。当任务完成时,可将与该任务的完成操作相对应的位修改为1,此时与该任务对应的三个三个位上的数值均为1。也就是说,在任务状态位图中与该任务对应的三个位上的数值经历了000→100→110→111的变化。
随后,在子步骤S142中,根据异或运算的结果,确认任务队列中的任务的状态。如上例中所述,在任务状态位图中与该任务对应的三个位上的数值经历了000→100→110→111的变化,因此可通过异或运算的结果来判断该任务当前正处于哪个状态。例如,当异或运算的结果显示三个位的数值均相同,则表示该任务不在队列中(还未添加入队列或已处理完成);如果前两个位的数值不同,则说明该任务已添加到任务队列中,但还未进行处理;如果后两个位的数值不同,则说明该任务已被取出进行处理,但还未处理完成。
由此,可在任意时刻通过查询任务状态位图,方便地获知任务队列中的任务的当前状态。在任务状态位图中由多个位记录任务队列中一个任务的状态,这些位可完整地记录该任务在任务队列中整个生命周期过程中的所有状态。并且,由于异或操作的原子性,可确保任务队列状态的一致性,整个过程中任务队列中的任一任务只会是已入队待处理、处理中、处理完成三种状态,而不会出现其他中间状态,大大简化了热升级过程中的状态维护。
图5示出了根据本申请一个实施方式在任务状态位图中记录生产方向任务队列添加任务的操作的流程图。如图5所示,上述步骤S110可包括子步骤S111和S112。在子步骤S111中,响应于生产方向任务队列添加任务的操作,在任务状态位图中确定与所添加的任务的添加操作相对应的位。当任务的生产方(例如,***中的线程或进程)向任务队列中添加任务时,可在任务状态位图中分配并确定与针对该任务的该操作相对应的位。随后,在子步骤S112中,修改任务状态位图中与所添加的任务的添加操作相对应的位的数值。即,如果该位上先前的数值为0,则修改为1;反之,如果先前为1,则修改为0。由此,可通过修改相应位上的数值来记录任务队列中任务的操作,从而实现对任务状态的记录。
图6示出了根据本申请一个实施方式在任务状态位图中记录处理方从任务队列取出任务的操作的流程图。如图6所示,上述步骤S120可包括子步骤S121和S122。在子步骤S121中,响应于任务的处理方从任务队列取出任务的操作,在任务状态位图中确定与所取出的任务的取出操作相对应的位。当任务的处理方(例如,***中的线程或进程)从任务队列取出任务进行处理时,可在任务状态位图中分配并确定与针对该任务的该操作相对应的位。随后,在子步骤S122中,修改任务状态位图中与所取出的任务的取出操作相对应的位的数值。即,如果该位上先前的数值为0,则修改为1;反之,如果先前为1,则修改为0。由此,可通过修改相应位上的数值来记录任务队列中任务的操作,从而实现对任务状态的记录。
图7示出了根据本申请一个实施方式在任务状态位图中记录处理方完成对任务的处理的操作的流程图。如图7所示,上述步骤S130可包括子步骤S131和S132。在子步骤S131中,响应于任务的处理方完成对任务的处理的操作,在任务状态位图中确定与所完成的任务的完成操作相对应的位。当任务的处理方(例如,***中的线程或进程)完成对任务的处理时,可在任务状态位图中分配并确定与针对该任务的该操作相对应的位。随后,在子步骤S132中,修改任务状态位图中与所完成的任务的完成操作相对应的位的数值。即,如果该位上先前的数值为0,则修改为1;反之,如果先前为1,则修改为0。由此,可通过修改相应位上的数值来记录任务队列中任务的操作,从而实现对任务状态的记录。
图8示出了根据本申请一个实施例的任务状态位图的示意图。如图8所示,该任务状态位图中的第一行Index表示任务队列中的任务编号,即任务队列中的第0个任务、第1个任务、第2个任务、第3个任务等等。第二行EnQueueBM是与每个任务的入队操作对应的位。第三行DeQueueBM是与每个任务的出队操作对应的位。第四行DoneBM是与每个任务的完成操作对应的位。第五行TaskState是通过异或运算后得出的每个任务的状态。也就是说,对于任务队列中的每个任务,在任务状态位图中均有三个位与之相对应,其中一个位记录任务的入队操作,另一个位记录任务的出队操作,还有一个位记录任务的完成操作。在初始时,任务状态位图中未被任何任务占用的一列三个位上的数值需保持一致,可以都是0,也可以都是1。可以理解,任务状态位图中的一列三个位经历了一个任务的完整处理过程后,其数值将均由0变为1,或者均由1变为0。
可通过对一个任务的三个位进行异或运算来获知该任务的当前状态。在图8所示的任务状态位图中,第二列任务0对应的三个位上的数值均为0,第五列任务3对应的三个位上的数值均为1。因为对于任务0和任务3中的任一个任务而言,其EnQueueBM位、DeQueueBM位、DoneBM位上的数值均相等,因此可以获知,该两列的位当前未被任何任务占用。可能是从未有任务占用过该列(即,初始化的状态),也可能是上一个占用该列的任务已完成。因此,状态显示为Done。
在图8所示的任务状态位图的第三列任务1中,EnQueueBM位为0,DeQueueBM位和DoneBM位均为1。因此,EnQueueBM位与DeQueueBM位的异或结果为1,这说明与该列对应的任务已添加到任务队列中,但还未由处理方取出进行处理。因此,状态显示为Queuing,即添加入任务队列中,待处理。
在图8所示的任务状态位图的第四列任务2中,EnQueueBM位和DeQueueBM位均为1,DoneBM位为0。因此,DeQueueBM位与DoneBM位的异或结果为1,这说明与该列对应的任务已由任务的处理方从任务队列中取出进行处理,但还未处理完成。因此,状态显示为Processing,即处理中。
由以上描述可以看出,通过任务状态位图,可以很方便地获知任务队列中的每个任务的当前状态。这样有助于***中组件的热升级,而不会影响其上下游组件。并且,任务的生产方和处理方也不需要通过通信才能够获知任务的当前状态。
图9示出了根据本申请一个实施方式的任务队列的处理装置的示意图。如图9所示,该装置200可包括任务生产单元210、任务处理单元220、位图记录单元230。任务生产单元210用于向任务队列中添加任务。任务处理单元220用于从所述任务队列取出并处理任务。位图记录单元230用于在任务状态位图中记录向所述任务队列添加任务的操作、从所述任务队列取出任务的操作以及完成对任务的处理的操作。
图10示出了根据本申请另一实施方式的任务队列的处理装置的示意图。如图10所示,除了任务生产单元210、任务处理单元220、位图记录单元230之外,该装置200还可包括状态确认单元240。状态确认单元240根据所述任务状态位图中的记录,确认所述任务队列中的任务的状态。
图11示出了根据本申请一个实施方式的状态确认单元的示意图。如图11所示,状态确认单元240可包括运算子单元241和确认子单元242。运算子单元241对所述任务状态位图中与所述任务队列中的任务相对应的多个位做异或运算。确认子单元242根据所述异或运算的结果,确认所述任务队列中的任务的状态。
图12示出了根据本申请一个实施方式的位图记录单元的示意图。如图12所示,位图记录单元230可包括确定子单元231和修改子单元232。确定子单元231响应于向所述任务队列添加任务的操作,在所述任务状态位图中确定与所添加的任务的添加操作相对应的位。修改子单元232修改所述任务状态位图中与所添加的任务的添加操作相对应的位的数值。
根据本申请另一实施方式,确定子单元231响应于从所述任务队列取出任务的操作,在所述任务状态位图中确定与所取出的任务的取出操作相对应的位。修改子单元232修改所述任务状态位图中与所取出的任务的取出操作相对应的位的数值。
根据本申请另一实施方式,确定子单元231响应于完成对任务的处理的操作,在所述任务状态位图中确定与所完成的任务的完成操作相对应的位。修改子单元232修改所述任务状态位图中与所完成的任务的完成操作相对应的位的数值。
根据本申请的另一方面,提供了一种装置,其包括处理器和存储器,存储器,用于存储一个或多个程序,当该一个或多个程序被该处理器执行时,可使得该处理器实现如上所述的方法。
根据本申请的又一方面,提供了一种非瞬时性计算机可读存储介质,其上存储有计算机程序,该计算机程序在被处理器执行时,可使得该处理器实现如上所述的方法。
本领域技术人员可以理解,本申请的技术方案可实施为***、方法或计算机程序产品。因此,本申请可表现为完全硬件的实施例、完全软件的实施例(包括固件、常驻软件、微码等)或将软件和硬件相结合的实施例的形式,它们一般可被称为“电路”、“模块”或“***”。此外,本申请可表现为计算机程序产品的形式,所述计算机程序产品嵌入到任何有形的表达介质中,所述有形的表达介质具有嵌入到所述介质中的计算机可用程序代码。
参照根据本申请实施例的方法、装置(***)和计算机程序产品的流程图和/或框图来描述本申请。可以理解的是,可由计算机程序指令执行流程图和/或框图中的每个框、以及流程图和/或框图中的多个框的组合。这些计算机程序指令可提供给通用目的计算机、专用目的计算机或其它可编程数据处理装置的处理器,以使通过计算机或其它可编程数据处理装置的处理器执行的指令创建用于实现流程图和/或框图的一个框或多个框中指明的功能/动作的装置。
这些计算机程序指令还可存储于能够指导计算机或其它可编程数据处理装置以特定的方式实现功能的计算机可读介质中,以使存储于计算机可读介质中的指令产生包括实现流程图和/或框图中的一个框或多个框中指明的功能/动作的指令装置。
计算机程序指令还可加载到计算机或其它可编程数据处理装置上,以引起在计算机上或其它可编程装置上执行一连串的操作步骤,以产生计算机实现的过程,从而使在计算机或其它可编程装置上执行的指令提供用于实现流程图和/或框图中的一个框或多个框中指明的功能/动作的过程。
附图中的流程图和框图示出根据本申请的多个实施例的***、方法和计算机程序产品的可能实现的体系结构、功能和操作。在这点上,流程图或框图中的每个框可表示一个模块、区段或代码的一部分,其包括一个或多个用于实现特定逻辑功能的可执行指令。还应注意,在一些可替代性实施中,框中标注的功能可以不按照附图中标注的顺序发生。例如,根据所涉及的功能性,连续示出的两个框实际上可大致同时地执行,或者这些框有时以相反的顺序执行。还可注意到,可由执行特定功能或动作的专用目的的基于硬件的***、或专用目的硬件与计算机指令的组合来实现框图和/或流程图示图中的每个框、以及框图和/或流程图示图中的多个框的组合。
虽然以上的叙述包括很多特定布置和参数,但需要注意的是,这些特定布置和参数仅仅用于说明本申请的一个实施方式。这不应该作为对本申请范围的限制。本领域技术人员可以理解,在不脱离本申请范围和精神的情况下,可对其进行各种修改、增加和替换。因此,本申请的范围应该基于所述权利要求来解释。