具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。
本发明中,通过对Sworker进行软件虚拟化,使得Sworker在与Cworker或者硬件加速单元同步等待的时间继续处理后需的报文,提高报文处理效率,也避免数据转发核的资源浪费。
下面对本发明提供的方法进行描述:
图5示出了本发明提供的方法流程图。如图5所示,该流程可包括以下步骤:
步骤501,将Sworker虚拟化为N个不同的VCPU。
本步骤501中,可采用虚拟化技术将Sworker虚拟化为N个不同的VCPU。
其中,N可根据经验设置。
本发明中,N个VCPU具有不同的标识,且分别对应不同的栈空间。另外,为便于描述该N个VCPU,本发明还从设定值比如1开始按照递增顺对这N个VCPU进行编号。图6示出了从1开始按照递增顺对这N个VCPU进行编号的实例。
在本发明中,N个VCPU在同一时刻只有一个VCPU完全占用Sworker的资源处于工作状态,而其他VCPU处于非工作状态,不可同时出现两个以上的VCPU共享占用Sworker的资源处于工作状态。在初始,可预先假设编号为1的VCPU(比如VCPU1)被默认为处于工作状态进行报文的处理,而其他VCPU处于非工作状态。
步骤502,处于工作状态的VCPU在识别出当前待处理的报文所涉及的业务为本VCPU不能独自执行的复杂业务,则先对所述报文进行复杂业务之前的简单业务处理,将处理后的报文传递给用于执行所述复杂业务的业务处理模块,保存本VCPU当前在Sworker的运行轨迹至本VCPU对应的栈空间,释放本VCPU当前占用Sworker资源,从处于非工作状态的VCPU中选择一个VCPU占用该被释放的Sworker资源进入工作状态,同时将本VCPU的状态切换为非工作状态。
以VCPU1处于工作状态为例,则VCPU1在处理发往Sworker的报文时,识别当前报文涉及的业务,如果该识别出的业务为本VCPU1不能独自执行的复杂业务,则先对所述报文进行简单业务处理,这里,该简单业务处理实质为该报文进行复杂业务之前的前期处理。之后,将处理后的报文传递给用于执行所述业务的业务处理模块。
这样,VCPU1和业务处理模块之间就存在同步的业务,为避免VCPU1占用的Sworker的资源在该同步业务时间内被闲置,则VCPU1保存本VCPU1当前在Sworker的运行轨迹至本VCPU1对应的栈空间,释放本VCPU1占用的Sworker资源,从处于非工作状态的VCPU中选择一个VCPU(以VCPU2为例)占用该被释放的Sworker资源处于工作状态,同时将本VCPU1的状态切换为非工作状态。这样,该被选择处于工作状态的VCPU2可以在VCPU1和业务处理模块之间存在业务同步期间继续占用Sworker资源执行报文的处理,避免了Sworker的资源浪费,提高Sworker的资源利用效率。
作为本发明的一个实施例,VCPU1当前在Sworker的运行轨迹可包括:Sworker的CPU的寄存器信息、VCPU1当前运行的最后一条指令地址等。这里VCPU1之所以保存当前在Sworker的运行轨迹,目的是便于在后续收到业务处理模块返回的报文(其具体为本VCPU1之前传递的报文执行完复杂业务处理后的报文)时,直接按照该记录的运行轨迹恢复对应的状态,以便在该恢复的状态下处理该收到的报文,实现业务的同步。
作为本发明的一个实施例,上述的业务处理模块可为执行复杂业务处理的Cworker或者硬件加速单元。
下面以一个具体实施例对图5所示流程进行详细描述:
参见图7,图7为本发明实施例提供的方法流程图。如图7所示,该流程可包括以下步骤:
步骤701,将Sworker虚拟化为N个VCPU。
步骤702,在初始,默认VCPU1完全占用Sworker的资源处于工作状态,而其他VCPU处于非工作状态。
步骤703,VCPU1从Sworker的缓存中获取一报文。
本发明中,当Sworker通过业务口接收到报文时,其会先暂时存放该接收的报文至缓存中,以便处于工作状态的VCPU来获取。
步骤704,VCPU1识别该报文所涉及的业务,如果该业务为本VCPU1独自执行的业务,则执行步骤705,如果该业务为本VCPU1不能独自执行的业务,则执行步骤706。
为便于识别报文所涉及的业务,本发明会预先建立一个访问控制列表(ACL),该ACL会记载三层IP地址和业务之间的对应关系,基于此,当VCPU1获取到报文时,其会依据该报文的三层IP地址在ACL中查找该三层IP地址对应的业务,将该查找到的业务确定为该报文所涉及的业务。
本发明实施例中,本VCPU1不能独自执行的业务,意味着该业务比较复杂,其需要借助复杂的业务处理模块比如Cworker或者硬件加速单元执行,而如果该业务为本VCPU1能独自执行的业务,则意味着该业务比较简单,本VCPU1可按照现有业务处理方式处理该报文比如转发报文,具体见步骤705。
步骤705,VCPU1按照现有业务处理方式处理该报文,在完成处理后,继续从Sworker的缓存中获取下一个报文,返回步骤704。
本步骤705是在Sworker起始工作时的步骤,此时VCPU1还未与其他VCPU发生工作状态切换,基于下文对复杂业务处理标识的描述,可以知道此时VCPU1不会与业务处理模块比如Cworker或者硬件加速单元存在同步关系的业务,只能是继续对报文处理,以使得在Sworker只有简单的业务、且VCPU1还未与其他VCPU进行工作状态的切换之前,始终是由VCPU1完全占用CPU进行报文的处理。
步骤706,VCPU1对该报文进行对应的简单处理,将本VCPU1的标识携带该处理后的报文中并传递给业务处理模块执行复杂业务处理,设置本VCPU1的复杂业务处理标识为表示未完成的第一值比如0,保存本VCPU1当前在Sworker的运行轨迹至本VCPU1对应的栈空间,释放本VCPU1占用的所述Sworker的资源,由处于非工作状态的其中一个VCPU(记为VCPUm)占用所述Sworker的资源并切换为工作状态,而将本VCPU1的状态切换为非工作状态。之后执行步骤707。
这里,VCPU1将报文传递给业务处理模块比如Cworker或者硬件加速单元执行复杂业务处理,则意味着该VCPU1与业务处理模块比如Cworker或者硬件加速单元存在同步关系的业务。为了保证该同步关系的业务顺利执行,则VCPU1释放本VCPU1占用的所述Sworker的资源,由处于非工作状态的VCPUm占用所述Sworker的资源并切换为工作状态,而将本VCPU1的状态切换为非工作状态,以由VCPUm继续执行工作,具体见步骤707。这相比于现有Sworker盲目等待业务处理模块返回的处理结果,大大节约了Sworker资源的浪费时间,提高Sworker的资源利用效率。
本发明中,当业务处理模块比如Cworker或者硬件加速单元接收到来自Sworker中任一VCPU发送的报文时,其会识别出该报文携带的VCPU标识,并对该报文进行相应的业务处理,在完成处理后,将处理后的报文发送至具有该VCPU标识的VCPU中,而当Sworker检测到其一VCPU收到业务处理模块比如Cworker或者硬件加速单元返回的报文时,则意味着该VCPU传递至业务处理模块的报文被业务处理模块处理完成,该Sworker就会将该VCPU的复杂业务处理标识设置为表示复杂业务处理完成的第二值比如1。
本发明中,Sworker的任一VCPU与复杂业务处理模块比如Cworker或者硬件加速单元之间报文的传递可通过共享内存、中断、消息或者特有的高速数据总线等执行,本发明并不具体限定。
上述步骤702至步骤706为在Sworker起始工作时该Sworker上被默认处于工作状态的VCPU1执行的操作。而此时其他VCPU还未处于工作状态过,基于此,本发明中,在N个VCPU从1开始编号的前提下,m可为2。
步骤707,VCPUm的状态被切换为工作状态后,从Sworker的缓存获取报文。
本步骤707在VCPUm首次处于工作状态的前提下执行,类似步骤703。
步骤708,VCPUm识别该报文所涉及的业务,如果该业务为本VCPUm能独自执行的业务,则执行步骤709,如果该业务为本VCPUm不能独自执行的业务,则执行步骤713。
本步骤708与上面描述的步骤704类似,这里不再赘述。
步骤709,VCPUm按照现有业务处理方式处理该报文,在完成处理后,执行步骤710。
本步骤709之所以不与上述步骤705类似,原因是:VCPUm不为Sworker初始开始工作后首个处于工作状态的VCPU,在VCPUm处于工作状态之前,已经有至少一个VCPU曾处于工作状态过,并且,该曾经处于工作状态过的至少一个VCPU可能已经收到业务处理模块比如Cworker或者硬件加速单元返回的处理后的报文,为保证这些VCPU及时处理来自业务处理模块的报文,本发明需要执行下述步骤710。
步骤710,VCPUm检测处于非工作状态的VCPU的复杂业务处理标识,当检测到至少一个处于非工作状态的VCPU的复杂业务处理标识为表示业务完成的第二值时,执行步骤711,而当检测到处于非工作状态的VCPU中不存在复杂业务处理标识为第二值的VCPU时,继续从Sworker的缓存中获取下一个报文,返回执行步骤708。
步骤711,保存本VCPUm当前在所述数据转发核的运行轨迹至本VCPUm对应的栈空间,释放本VCPUm占用的所述Sworker的资源,切换本VCPUm的状态为非工作状态,触使复杂业务处理标识为第二值的其中一个VCPU占用所述Sworker的资源并切换为工作状态。之后执行步骤712。
步骤712,复杂业务处理标识为第二值、且被切换为工作状态的VCPU依据本VCPU对应的栈空间所记录的运行轨迹处理所述业务处理模块返回的报文,在完成报文的处理后删除本VCPU对应的复杂业务处理标识、以及删除本VCPU对应的栈空间记录的所述运行轨迹,之后本VCPU按照步骤710中VCPUm的操作执行。
步骤713,VCPUm对该报文进行对应的简单处理,将本VCPUm的标识携带该处理后的报文中传递给业务处理模块比如Cworker或者硬件加速单元执行复杂业务处理,设置本VCPUm对应的复杂业务处理标识为表示未完成的第一值比如0,并检测各个处于非工作状态的VCPU的复杂业务处理标识,当检测到至少一个处于非工作状态的VCPU的复杂业务处理标识为表示业务完成的第二值时,执行步骤711,当检测到处于非工作状态的VCPU中不存在复杂业务处理标识为第二值的VCPU、且有至少一个VCPU不存在复杂业务处理标识时,执行步骤714,当检测到每个处于非工作状态的VCPU存在复杂业务处理标识、且该复杂业务处理标识为第一值时,执行步骤716。
步骤714,保存本VCPUm当前在所述数据转发核的运行轨迹至本VCPUm对应的栈空间,释放本VCPUm占用的所述Sworker的资源,并切换本VCPUm的状态为非工作状态,按照设定的VCPU执行顺序选择下一个不存在复杂业务处理标识的VCPU(记为VCPUn)占用所述Sworker的资源进入工作状态,之后执行步骤715。
步骤715,VCPUn被切换为工作状态后,依据本VCPUn对应的栈空间所记录的运行轨迹从Sworker的缓存获取报文,并按照步骤708中VCPUm的操作执行本VCPU的操作。
步骤716,执行同步等待,直至至少一个处于非工作状态的VCPU对应的复杂业务处理标识为第二值时,保存本VCPUm当前在所述Sworker的运行轨迹至本VCPUm对应的栈空间,释放本VCPUm占用的所述Sworker的资源,并切换本VCPUm的状态为非工作状态,触使复杂业务处理标识为第二值的其中一个VCPU占用所述Sworker的资源切换为工作状态并按照步骤712执行操作。
至此,完成图7所示的流程。
通过图7所示流程可以看出,本发明中,当任一处于工作状态的VCPU识别出本VCPU能独自处理当前报文涉及的业务(即该业务为简单业务),则处理该报文,而当识别出本VCPU能独自处理当前报文(记为报文1)涉及的复杂业务,则仅对该报文1进行简单的处理,并传递该处理后的报文1给业务处理模块,同时,主动释放本VCPU占用的Sworker的资源,以由其他VCPU重新切换为工作状态继续处理报文,如此切换N次(假如N个简单业务的处理时间至少等于1个复杂业务的处理时间),这样,当报文1的复杂业务已经处理完毕返回给之前处理该报文1的VCPU后,再由之前处理该报文1的VCPU切换回工作状态,继续处理该报文1,具体如图8示出。这能够避免现有技术中Sworker等待同步业务所浪费的CPU,提高了Sworker的资源利用效率,也能有效提升复杂业务的系统转发能力。
以上对本发明提供的方法进行了描述,下面对本发明提供的多核设备进行描述:
本发明实施例提供了多核设备的结构。其中,所述多核设备包括至少一数据转发核,而所述数据转发核包括:通过采用虚拟化技术从所述数据转发核虚拟化出的N个VCPU;其中,N个VCPU对应不同的栈空间、且同一时刻只有一个VCPU占用所述数据转发核的资源处于工作状态,而其它VCPU处于非工作状态。
图9示出了每一VCPU的结构。
如图9所示,每一VCPU包括:
识别单元,用于在自身VCPU占用所述数据转发核资源处于工作状态时识别出当前处理的报文涉及的业务是否为自身VCPU不能独自执行的业务;
传递单元,用于在所述识别单元的识别结果为是时,对所述报文进行复杂业务之前的简单业务处理,将处理后的报文传递给用于执行所述复杂业务的业务处理模块,并发送处理通知给处理单元;
处理单元,用于接收所述处理通知后,保存自身VCPU当前在所述数据转发核的运行轨迹至自身VCPU对应的栈空间,释放自身VCPU当前占用的数据转发核资源,从处于非工作状态的VCPU中选择一个VCPU占用该被释放的数据转发核资源进入工作状态,同时将自身VCPU的状态切换为非工作状态。
优选地,所述处理单元进一步设置所述VCPU的复杂业务处理标识为表示业务未完成的第一值;
基于此,所述处理单元从处于非工作状态的VCPU中选择一个VCPU占用该被释放的数据转发核资源并进入工作状态包括:
检测每一处于非工作状态的VCPU的复杂业务处理标识;
当检测到至少一个处于非工作状态的VCPU的复杂业务处理标识为第二值时,选择复杂业务处理标识为第二值的其中一个VCPU占用该被释放的数据转发核资源并进入工作状态,其中,任一VCPU对应的复杂业务处理标识为第二值,是指该VCPU传递至所述业务处理模块的报文已被所述业务处理模块进行复杂业务处理且返回至该VCPU;
当检测到处于非工作状态的VCPU中不存在复杂业务处理标识为第二值的VCPU、且有至少一个VCPU不存在复杂业务处理标识时,按照设定的VCPU执行顺序选择下一个不存在复杂业务处理标识的VCPU占用该被释放的数据转发核资源并进入工作状态;
当检测到每一处于非工作状态的VCPU存在复杂业务处理标识、且该复杂业务处理标识为第一值时,执行同步等待,直至检测到至少一个处于非工作状态的VCPU的复杂业务处理标识为第二值,选择复杂业务处理标识为第二值的其中一个VCPU占用该被释放的数据转发核资源进入工作状态。
优选地,所述处理单元进一步在所述识别单元的识别结果为否时,对所述报文进行对应的业务处理,在完成处理后,检测每一处于非工作状态的VCPU对应的复杂业务处理标识;
当检测到至少一个处于非工作状态的VCPU的复杂业务处理标识为第二值时,保存本VCPU当前在所述数据转发核的运行轨迹至本VCPU对应的栈空间,释放本VCPU当前占用的数据转发核资源,将本VCPU的状态从当前的工作状态切换为非工作状态,并选择复杂业务处理标识为第二值的其中一个VCPU占用该被释放的数据转发核资源进入工作状态;
当检测到处于非工作状态的VCPU中不存在复杂业务处理标识为第二值的VCPU时,继续执行下一个报文的处理。
优选地,本发明中,每一VCPU进一步包括:业务单元和获取单元。
其中,所述业务单元用于在自身VCPU的复杂业务处理标识为第二值且被选择进入工作状态时,执行以下操作:
获取所述业务处理模块返回的经过复杂业务处理的报文;
依据本VCPU对应的栈空间记录的运行轨迹处理所述业务处理模块返回的报文;
在完成报文的处理后删除本VCPU对应的栈空间记录的所述运行轨迹、以及删除VCPU的复杂业务处理标识,并检测每一处于非工作状态的VCPU对应的复杂业务处理标识,
当检测到至少一个处于非工作状态的VCPU对应的复杂业务处理标识为第二值时,保存本VCPU当前在所述数据转发核的运行轨迹至本VCPU对应的栈空间,释放本VCPU当前占用的数据转发核资源,将本VCPU的状态从当前的工作状态切换为非工作状态,并选择复杂业务处理标识为第二值的其中一个VCPU占用该被释放的数据转发核资源并进入工作状态;
当检测到处于非工作状态的VCPU中不存在复杂业务处理标识为第二值的VCPU时,继续执行下一个报文的处理。
所述获取单元用于在自身VCPU不存在复杂业务处理标识且被选择进入工作状态时,执行以下操作:从所述数据转发核的缓存中获取当前待处理的报文,并依据本VCPU对应的栈空间记录的运行轨迹处理获取的报文。
至此,完成图9所示的VCPU结构描述。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。