报文保序方法及装置的制作方法

文档序号:7888053阅读:105来源:国知局
专利名称:报文保序方法及装置的制作方法
报文保序方法及装置技术领域
本发明属于通信领域,尤其涉及一种报文保序方法及装置。
背景技术
随着多核技术的发展,多核中央处理器(Central Processing Unit, CPU)得到了越来越广泛的应用,然而当多核CPU用于处理及转发报文时,容易产生报文乱序的现象。例如,三核CPU按照报文1、2、3的顺序依次接收到3个报文并分别分发给核C1、C2、C3进行处理,由于报文内容、CPU处理策略及每个核的负载情况均存在差异,有可能出现报文2和报文3先处理完毕,报文I后处理完毕的情况,此时,若CPU把处理完毕的报文直接发送出去, 就出现了发送报文顺序为2、3、1的乱序现象。
现有技术在多核CPU中使用保序队列来保证报文的发送顺序。当多核CPU收到报文时,会首先依次给每个报文编号并将报文的编号信息放入保序队列,然后再分发给各个核处理,当每个核处理完报文之后,会根据报文的编号查询保序队列,看其处理的报文是否处在队列的头部,是则将报文直接发送出去,否则该核就被阻塞,直到队列中排在前列的报文都发送出去,该核才被唤醒,之后才将报文发送出去。然而,由于上述方法使得处于阻塞期的核无法处理其他报文,因此大大降低了 CPU的处理效率。发明内容
本发明实施例的目的在于提供一种报文保序方法,旨在解决现有技术中对报文进行保序时影响了 CPU的处理效率的问题。
本发明实施例是这样实现的,一种报文保序方法,所述方法包括
接收第一报文,并按序为所述第一报文分配第一编号;
将所述第一编号存入保序队列,并设置第一标识,所述第一标识置于第一状态,用于标识所述第一编号关联的所述第一报文还未处理完毕;
当所述第一报文处理完毕之后,查询所述第一编号是否位于所述保序队列的头部;
如果所述第一编号不是位于所述保序队列的头部,将所述第一标识置于第二状态,用于标识所述第一报文已处理完毕;
如果所述第一编号位于所述保序队列的头部,发送所述第一报文,并将所述第一编号从所述保序队列中删除。
本发明实施例的另一目的在于提供一种报文保序装置,所述装置包括
报文接收模块,用于接收第一报文,并按序为所述第一报文分配第一编号;
初始化模块,用于将所述第一编号存入保序队列,并设置第一标识,所述第一标识置于第一状态,用于标识所述第一编号关联的所述第一报文还未处理完毕;
第一查询模块,用于当所述第一报文处理完毕之后,查询所述第一编号是否位于所述保序队列的头部;
状态变更模块,用于如果所述第一编号不是位于所述保序队列的头部,将所述第一标识置于第二状态,用于标识所述第一报文已处理完毕;
第一发送模块,用于如果所述第一编号位于所述保序队列的头部,发送所述第一报文,并将所述第一编号从所述保序队列中删除。
本发明实施例为保序队列中的每个报文编号附加相应的标识,根据报文的处理情况来设定其标识的状态,并进一步通过检测标识的状态来执行报文的发送,在保证每个报文依序发送的前提下,使得多核CPU中的每个核在处理完一个报文之后无需被阻塞即可继续处理下一报文,大大提高了 CPU的处理效率。


图I是本发明实施例提供的报文保序方法的实现流程图2是本发明实施例提供的报文保序方法的实现流程图3是本发明实施例提供的报文保序方法的实现示意图4是本发明实施例提供的报文保序方法的实现流程图5是本发明实施例提供的报文保序方法分阶段处理报文的实现示意图6是本发明实施例提供的报文保序装置的结构框图7是本发明实施例提供的报文保序装置的结构框图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例为保序队列中的每个报文编号附加相应的标识,根据报文的处理情况来设定其标识的状态,并进一步通过检测标识的状态来执行报文的发送,在保证每个报文依序发送的前提下,使得多核CPU中的每个核在处理完一个报文之后无需被阻塞即可继续处理下一报文,大大提高了 CPU的处理效率。
需要说明的是,下述各实施例均以多核CPU的应用场景为背景对报文保序方法进行说明,而本发明实施例提供的报文保序方法除了可应用于多核CPU对报文的处理及转发场景之中,也可应用于所有需要对报文进行保序的并行处理系统中,在此不作限定。
以下结合具体实施例对本发明的具体实现进行详细描述
图I示出了本发明实施例提供的报文保序方法的实现流程,所述方法包括
101 :接收第一报文,并按序为所述第一报文分配第一编号。
当接收到报文时,首先按照报文的接收顺序,依序为每个报文分配相应的编号,例如为接收到的第一个报文关联编号“ 1”,为接收到的第二个报文关联编号“2”,以此类推。
102:将所述第一编号存入保序队列,并设置第一标识,所述第一标识置于第一状态,用于标识所述第一编号关联的所述第一报文还未处理完毕。
由于按序为报文分配编号后即将该编号存入保序队列中,因此存储了编号的保序队列头部为第一个报文的编号,之后为第二个报文的编号......所有报文的编号均按此顺序依次存储在保序队列中。
在本实施例中,对于存储进保序队列的编号,会为每个编号分别再附加一个第一标识,该第一标识用于标记其所对应的编号关联的报文是否处理完毕。对于每个第一标识, 其初始值(即第一状态)可以置“0”或者“NO”,以代表其对应的编号所关联的报文当前均未经过处理,而在报文经过处理之后,其关联的编号的第一标识则会被置“ I”或者“YES”以改变为第二状态,代表该报文处理完毕,可以随时发送。
103:当所述第一报文处理完毕之后,查询所述第一编号是否位于所述保序队列的头部。
当一个报文处理完毕之后,查询所述报文关联的编号是否位于所述保序队列的头部,不是则执行104,是则执行105。
104:所述第一编号不是位于所述保序队列的头部,则将所述第一标识置于第二状态,用于标识所述第一报文已处理完毕。
105:当所述第一编号位于所述保序队列的头部,则发送所述第一报文,并将所述第一编号从所述保序队列中删除。
在本实施例中,当一个报文处理完毕之后,会先查询该报文关联的编号在保序队列中的位置,若其位置不处于保序队列的头部,则不对报文进行发送处理,而是将该报文关联编号的第一标识置为第二状态,以代表该报文已处理完毕,处于可发送状态;若查询到该报文关联的编号位于保序队列的头部时,则直接将该报文发送出去,而无需改变其关联编号的第一标识的状态。
进一步,如图2所示,其中,201至205的实现原理与图I的101至105的实现原理相同,在此不再赘述。当所述第一编号位于所述保序队列的头部,发送所述第一报文,并将所述第一编号从所述保序队列中删除之后,所述方法还包括
206:查询位于所述保序队列头部的第二编号的第一标识是否置于第二状态,是则执行207,否则执行208。
207:如果所述第二编号的第一标识置于第二状态,发送所述第二编号对应的报文,并将所述第二编号从所述保序队列中删除,继续执行206。
所述第二编号的第一标识置于第二状态时,表不所述第二编号对应的报文已处理完毕,处于可发送状态。
通过重复执行206和207,在发送完所述第一报文之后,可以查询所述保序队列中排列在所述第一编号之后的编号的第一标识的状态,当排列在所述第一编号之后的N个连续编号的第一标识均置于第二状态时,表示这N个连续编号所对应的报文均已处理完毕, 处于可发送状态,则可以按序将所述N个连续编号对应的N个报文均发送出去,并将这N个连续编号从保序队列中删除,其中,N为大于等于I的整数。
208 :如果所述第二编号的第一标识置于第一状态,结束。作为本发明的一个实施例,在每发送完一个报文之后,则将其关联的编号从保序队列中删去,相应地,排列在之后的编号逐一向保序队列头部前移一位。
举例来说,以图3所示的三核CPU为例,该CPU包括三个核,分别为Cl,C2,C3。该 CPU收到报文I、报文2和报文3,分别对应编号1、2、3,每个编号的第一标识置为第一状态。 该CPU将接收到报文I、报文2、报文3分别送入核Cl、C2、C3进行处理。首先核C2对报文 2的处理结束,则其查询保序队列,发现报文2的编号不位于队列头部,则将编号2对应的5第一标识置为第二状态,然后可以继续处理其他报文。随后核C3对报文3的处理结束,其查询保序队列,发现报文3的编号不位于队列头部,则将编号3对应的第一标识置为第二状态,然后可以继续处理其他报文。最后核Cl对报文I的处理结束,其查询保序队列,发现报文I的编号位于队列头部,则先将报文I发送出去,并将报文I对应的编号I从保序队列中删除,之后核Cl查询保序队列,发现排在编号I之后的编号2和编号3的第一标识均已置于第二状态,则核Cl也将编号2和编号3对应的报文,即报文2和报文3发送出去,并删除保序队列中编号2和编号3。
而在上述情况中,假设报文3此时还未处理完毕,则编号3的第一标识仍处于第一状态,则只对报文2进行发送,编号3前移至保序队列的头部。
在本实施例中,通过为保序队列中的报文编号附加第一标识,CPU中的每个核在处理完当前报文之后,只需要改变该报文关联编号的第一标识的状态,即可以继续处理其他报文,而对报文的保序发送可根据保序队列中每个编号的第一标识来进行,从而大大提高了 CPU的处理效率。
本发明实施例提供的图I和图2所示的方法,不区分接收到的报文是否相关,做统一的保序处理;通常对于例如源IP及目的IP不同的报文流来说,任何两个报文流的报文之间是不存在顺序关系的,报文发送的先后关系不影响其后续的处理流程,因此,作为本发明的一个实施例,可以将不同的报文流进行区分,为每个报文流建立一个保序队列,以进一步地提高CPU的处理效率。
图4示出了本发明实施例提供的另一种报文保序方法的实现流程,通过为每个报文流建立一个保序队列,可以进一步地提高CPU的处理效率。所述方法包括
401 :建立M个保序队列,所述M为大于等于I的整数。
在实际的报文传输过程中,以源地址及目的地址均不同的报文为例,其相互之间是没有顺序关系的,不需要在彼此之间进行保序,因此,在本实施例中,可以针对不同的报文流分别建立多个保序队列,用于存入源地址及目的地址不同的报文关联的编号,在该方案下,只对源地址及目的地址相同的报文进行相互之间的保序。
需要说明的是,除了按照报文不同的源地址及目的地址建立保序队列,还可以按照不同的报文种类、不同的协议等分类方法建立保序队列,只要是两个报文之间不存在一定的顺序关系,即可以将这两个报文放入不同的保序队列中进行分别保序。具体的报文划分规则在此不作限定。
402:接收第一报文,并按照所述第一报文对应的保序队列,按序为所述第一报文分配所述第一编号。
在本实施例中,根据接收的第一报文所属的报文流,能够查询到第一报文对应的保序队列,并按照第一报文在该报文流中的接收顺序,按序为第一报文分配相应的第一编号。
403:将所述第一编号存入保序队列,并设置第一标识,所述第一标识置于第一状态,用于标识所述第一编号关联的所述第一报文还未处理完毕。
404:当所述第一报文处理完毕之后,查询所述第一编号是否位于所述保序队列的头部,不是则执行405,是则执行406。
405:所述第一编号不是位于所述保序队列的头部,则将所述第一标识置于第二状态,用于标识所述第一报文已处理完毕。
406:当所述第一编号位于所述保序队列的头部,则发送所述第一报文,并将所述第一编号从所述保序队列中删除。
例如,存在保序队列I、2、3,分别对应报文流I、2、3,则核CI、C2和C3可以根据CPU 的任务调度任意地处理任一报文流中的报文,而在发送报文时,可以根据系统的具体环境, 将报文流1、2、3中进行发送的报文同时并行地发送,或者以任意的报文流顺序进行发送, 只要保证每条报文流中的报文发送是保序的即可。
其中,上述403至406的实现原理与本发明实施例102至105的实现原理相同,在此不再赘述。
在本实施例中,通过建立M个保序队列,并按照预设的规则将报文的编号存入该报文所对应的保序队列,从而通过并行的若干保序队列实现了不同报文流的并行发送处理,进一步提高了 CPU的处理效率。
本发明实施例提供的图I和图3所示的方法中,每个报文均是经过CPU的一次处理就发送出去,然而,在实际的应用环境下,可能会出现将每个报文分为若干个阶段进行处理的情况,在每个处理阶段,系统会根据CPU每个核的负载情况、硬件运行状况等多种因素对处理中的报文进行重新调度,重新为报文分配合适的处理核,以根据系统的运行情况对系统任务进行有效调度,提高CPU的工作效率。此时,对于报文的每个处理阶段,都需要进行保序处理,具体的每个处理阶段的保序处理可以参考本发明实施例图I所示的方法,在此不再赘述。进一步地,如果还需要区分报文流,每个处理阶段的保序处理可以参考本发明实施例图3所示的方法,在此不再赘述。
因此本发明实施例提供的一种报文保序方法,适用于既需要区分报文流,每个报文又需要经过多个处理阶段的保序处理。如图5所示,为本发明实施例提供的另一种报文保序方法的实现流程,其中,报文分为若干个报文流,报文的处理分为若干个处理阶段。具体的
多核CPU根据系统需要对每个报文分四个阶段进行处理,则为每个报文处理阶段均建立保序队列1、2........n,分别对应报文流1、2........n,使得每个报文在进入一个处理阶段时,就需在相应的保序队列中保存关联的编号,并在离开当前处理阶段进入下一处理阶段之前执行一次保序处理。因此,针对图5的情况,每个报文需要进行从阶段I到阶段2、阶段2到阶段3、阶段3到阶段4及阶段4到发送四次保序处理。
本发明实施例提供的报文保序方法针对报文分阶段处理的情况,通过分别对每个处理阶段进行保序,保证最后报文在发送出去时的顺序能与接收的顺序一致,同时,也同样通过编号的相应标识来标识报文的处理状态,从而提高了 CPU的利用率,也因此提高了系统对报文的处理效率。
图6示出了本发明实施例提供的报文保序装置,该报文保序装置可以运行于例如多核CPU等并行处理系统中,用于实现本发明图I和图2所示的报文保序方法,为了便于说明,仅不出了与本实施例相关的部分。
参照图6,该报文保序装置包括
报文接收模块61,接收第一报文,并按序为所述第一报文分配第一编号。
初始化模块62,将所述第一编号存入保序队列,并设置第一标识,所述第一标识置于第一状态,用于标识所述第一编号关联的所述第一报文还未处理完毕。
第一查询模块63,当所述第一报文处理完毕之后,查询所述第一编号是否位于所述保序队列的头部。
状态变更模块64,如果所述第一编号不是位于所述保序队列的头部,将所述第一标识置于第二状态,用于标识所述第一报文已处理完毕。
第一发送模块65,如果所述第一编号位于所述保序队列的头部,发送所述第一报文,并将所述第一编号从所述保序队列中删除。
第二查询模块66,其在第一发送模块55将所述第一报文发送之后,查询位于所述保序队列头部的第二编号的第一标识。
第二发送模块67,如果所述第二编号的第一标识置于第二状态,发送所述第二编号对应的报文,并将所述第二编号从所述保序队列中删除。
作为本发明的一个实施例,可以将不同的报文流进行区分,为每个报文流建立一个保序队列,以进一步地提高CPU的处理效率。进一步地,如图7所示,该装置还包括
保序队列建立模块68,其建立M个保序队列,所述M为大于等于I的整数。
相应的,当建立M个保序队列时,所述初始化模块62用于按照所述第一报文对应的保序队列,按序为所述第一报文分配所述第一编号。
本发明实施例为保序队列中的每个报文编号附加相应的标识,根据报文的处理情况来设定其标识的状态,并进一步通过检测标识的状态来执行报文的发送,在保证每个报文依序发送的前提下,使得多核CPU中的每个核在处理完一个报文之后无需被阻塞即可继续处理下一报文,大大提高了 CPU的处理效率。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种报文保序方法,其特征在于,所述方法包括接收第一报文,并按序为所述第一报文分配第一编号;将所述第一编号存入保序队列,并设置第一标识,所述第一标识置于第一状态,用于标识所述第一编号关联的所述第一报文还未处理完毕;当所述第一报文处理完毕之后,查询所述第一编号是否位于所述保序队列的头部; 如果所述第一编号不是位于所述保序队列的头部,将所述第一标识置于第二状态,用于标识所述第一报文已处理完毕;如果所述第一编号位于所述保序队列的头部,发送所述第一报文,并将所述第一编号从所述保序队列中删除。
2.如权利要求I所述的方法,其特征在于,在发送所述第一报文之后,所述方法还包括查询位于所述保序队列头部的第二编号的第一标识;如果所述第二编号的第一标识置于第二状态,发送所述第二编号对应的报文,并将所述第二编号从所述保序队列中删除。
3.如权利要求I或2所述的方法,其特征在于,在接收所述第一报文之前,所述方法还包括建立M个保序队列,所述M为大于等于I的整数;相应的,所述按序为所述第一报文分配第一编号具体包括根据所述第一报文对应的保序队列,按序为所述第一报文分配所述第一编号。
4.一种报文保序装置,其特征在于,所述装置包括报文接收模块,用于接收第一报文,并按序为所述第一报文分配第一编号;初始化模块,用于将所述第一编号存入保序队列,并设置第一标识,所述第一标识置于第一状态,用于标识所述第一编号关联的所述第一报文还未处理完毕;第一查询模块,用于当所述第一报文处理完毕之后,查询所述第一编号是否位于所述保序队列的头部;状态变更模块,用于如果所述第一编号不是位于所述保序队列的头部,将所述第一标识置于第二状态,用于标识所述第一报文已处理完毕;第一发送模块,用于如果所述第一编号位于所述保序队列的头部,发送所述第一报文, 并将所述第一编号从所述保序队列中删除。
5.如权利要求4所述的装置,其特征在于,还包括第二查询模块,用于查询位于所述保序队列头部的第二编号的第一标识;第二发送模块,用于如果所述第二编号的第一标识置于第二状态,发送所述第二编号对应的报文,并将所述第二编号从所述保序队列中删除。
6.如权利要求4或5所述的装置,其特征在于,还包括保序队列建立模块,用于建立M个保序队列,所述M为大于等于I的整数;相应的,所述报文接收模块用于根据所述第一报文对应的保序队列,按序为所述第一报文分配所述第一编号。
全文摘要
本发明适用于通信领域,提供了一种报文保序方法及装置,包括接收第一报文,并按序为所述第一报文分配第一编号;将所述第一编号存入保序队列,并设置第一标识,所述第一标识置于第一状态;当所述第一报文处理完毕之后,查询所述第一编号是否位于所述保序队列的头部;如果所述第一编号不是位于所述保序队列的头部,将所述第一标识置于第二状态;如果所述第一编号位于所述保序队列的头部,发送所述第一报文,并将所述第一编号从所述保序队列中删除。本发明在保证每个报文依序发送的前提下,使得多核CPU中的每个核在处理完一个报文之后无需被阻塞即可继续处理下一报文,大大提高了CPU的处理效率。
文档编号H04L12/56GK102546424SQ20121001910
公开日2012年7月4日 申请日期2012年1月20日 优先权日2012年1月20日
发明者吴强, 赵广 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1