一种队列清空方法以及相关设备与流程

文档序号:12739704阅读:248来源:国知局
一种队列清空方法以及相关设备与流程

本发明涉及通信技术领域,尤其涉及一种队列清空方法以及相关设备。



背景技术:

现代通信设备需要提供大容量的数据包缓存来吸收突发的数据包。缓存在通信设备中的数据包按照数据包的包描述符组成队列进行管理,并按照队列的优先级进行调度发送。为了保证一个用户的数据包不被错发给另一个用户,当一个用户下线时,需要将该用户的数据包对应的包描述符组成的队列清空后才能将该队列重新分配给另一用户。现有的队列清空方式为:向流量管理芯片下发针对需要清空队列的队列清空命令;流量管理芯片接收到该队列清空命令之后,等待该需要清空队列被调度出队;在该需要清空队列出队时,清空该需要清空队列中的所有包描述符。

当需要清空的队列数量较多时,优先级较低的队列等待被调度出队的时间较长,导致优先级较低的队列会长时间无法被调度出队,优先级较低的队列的清空完成时间无法得到保证。



技术实现要素:

本发明实施例公开了一种队列清空方法以及相关设备,可以解决当需要清空的队列数量较多时,清空速度较慢的问题。

本发明实施例第一方面公开一种队列清空方法,包括:

队列清空处理器从队列信息表中扫描有效队列的清空状态,确定清空状态为“将被清空”的目标队列,所述队列信息表用于记录包括所述有效队列的清空状态;

所述队列清空处理器将所述目标队列的清空状态修改为“启动清空”;

所述队列清空处理器将所述目标队列清空;其中,当所述目标队列被清空后,

所述目标队列的清空状态被修改为“清空完成”。

本发明实施例无需考虑目标队列的优先级,可以同时扫描多个队列并进行清空,实现批量清空队列,保证队列的清空完成时间,进而提高队列批量清空能力。

可选的,所述队列清空处理器将所述目标队列的清空状态修改为“启动清空”之后,所述方法还包括:

所述队列清空处理器判断所述目标队列是否位于调度器的正常队列链表中,所述调度器用于对所述正常队列链表中的队列进行调度;

若否,所述队列清空处理器将所述目标队列添加到所述调度器的清空队列链表中,并执行所述将所述目标队列清空的步骤;

若是,则执行所述将所述目标队列清空的步骤。

不论目标队列是位于调度器的正常队列链表中,还是位于调度器的清空队列链表中,还是一部分目标队列位于调度器的正常队列链表中,另一部分目标队列位于调度器的清空队列链表中,本发明实施例都可以将目标队列进行清空。

可选的,所述队列清空处理器将所述目标队列清空包括:

所述队列清空处理器读取所述正常队列链表和/或所述清空队列链表中当前已入队的所有队列的队列标识;

当所述正常队列链表和/或所述清空队列链表中当前已入队的所述所有队列的对列标识均被所述队列清空处理器读取之后,所述队列清空处理器接收所述出队处理器发送的清空完成指示,所述清空完成指示用于指示所述正常队列链表和/或所述清空队列链表中当前已入队的所有需要清空的队列均被清空。

队列清空处理器可以将调度器的正常队列链表和/或所述清空队列链表中队列的队列标识读出来并发送给出队处理器进行清空状态检查,通过队列清空处理器和出队处理器完成共同调度器清空扫描。

可选的,所述队列清空处理器读取所述正常队列链表和/或所述清空队列链表中当前已入队的所有队列的队列标识包括:

所述队列清空处理器读取所述正常队列链表和/或所述清空队列链表中第一队列的第一队列标识,向所述出队处理器发送针对所述第一队列标识的清空检查请求,所述清空检查请求用于请求所述出队处理器检查所述第一队列的清空状态,所述第一队列为所述正常队列链表和/或所述清空队列链表中当前已入队的所有队列中的任一个;

所述队列清空处理器接收所述出队处理器发送的清空检查结果,所述清空检查结果用于指示所述第一队列是否需要被清空;

若所述清空检查结果指示所述第一队列需要被清空并且所述出队处理器有可用清空引擎对所述第一队列进行清空,所述队列清空处理器将所述第一队列从所述正常队列链表和/或所述清空队列链表中出队,并读取所述正常队列链表和/或所述清空队列链表中所述第一队列的下一个队列的队列标识;

若所述清空检查结果指示所述第一队列需要被清空并且所述出队处理器没有可用清空引擎对所述第一队列进行清空,所述队列清空处理器将所述第一队列加入所述清空队列链表中,并读取所述正常队列链表和/或所述清空队列链表中所述第一队列的下一个队列的队列标识;

若所述清空检查结果指示所述第一队列不需要被清空,所述队列清空处理器读取所述正常队列链表和/或所述清空队列链表中所述第一队列的下一个队列的队列标识。

在启动调度器清空扫描后,对于后续进入正常队列链表中的队列不进行扫描,可以保证调度器清空扫描的完成时间。通过队列清空处理器和出队处理器完成共同调度器清空扫描,可以在不影响调度器的正常调度的情况下完成调度器清空扫描的操作。

可选的,所述方法还包括:

所述队列清空处理器接收针对至少一个队列的清空命令,在所述队列信息表中记录所述至少一个队列的清空状态为所述“将被清空”。

可选的,所述在所述队列信息表中记录所述至少一个队列的清空状态为所述“将被清空”之后,所述方法还包括:

当所述至少一个队列中有数据包入队时,所述队列清空处理器将所述数据包丢弃;

当接收到针对所述至少一个队列的数据包调度指令时,所述队列清空处理器将所述数据包调度指令丢弃。

当队列进入清空流程之后,该队列无法进行入队操作,也无法接收新的数据包调度指令,可以保证队列在清空过程中能够不被新的调度操作的影响。

可选的,所述队列清空处理器将所述目标队列清空之后,所述方法还包括:

所述队列清空处理器扫描所述队列信息表中所述目标队列的清空状态,检查所述目标队列中是否存在清空状态为所述“启动清空”的队列;

若是,所述队列清空处理器将所述目标队列中清空状态为所述“启动清空”的队列修改为所述“清空完成”。

由于在调度器清空扫描中有可能会出现一些漏修改队列的清空状态的情况,在调度器清空扫描之后,进行一次清空完成扫描,以保证需要被清空的队列彻底被清空。

本发明实施例第二方面公开一种队列清空方法,包括:

出队处理器接收队列清空处理器发送的针对第一队列标识的清空检查请求;

所述出队处理器从队列信息表中读取所述第一队列标识对应的第一队列的清空状态;

当所述第一队列的清空状态为“启动清空”时,所述出队处理器向所述队列清空处理器发送清空检查结果,并利用配置的清空引擎将所述第一队列内的包描述符清空并回收,所述清空检查结果用于指示所述第一队列是否需要被清空。

出队处理器可以并利用配置的清空引擎将需要清空的目标队列内的包描述符进行清空,无需等待需要清空的目标队列中的包描述符被正常调度出队,出队处理器可以主动利用清空引擎进行队列清空,无需考虑目标队列的优先级,保证目标队列的清空完成时间,进而提高队列清空能力。

可选的,所述出队处理器利用配置的清空引擎将所述第一队列内的包描述符清空并回收包括:

所述出队处理器利用配置的清空引擎将所述第一队列内的包描述符清空并将所述包描述符从包描述符缓存中回收。

将包描述符回收利用,可以将回收的包描述符分配给新入队的数据包,提高包描述符的利用率,由于包描述符包含数据包在包缓存中的地址,回收利用包描述符,即可以重复利用包缓存的存储空间。

可选的,所述出队处理器利用配置的清空引擎将所述第一队列内的包描述符清空并将所述包描述符从包描述符缓存中回收之后,所述方法还包括:

所述出队处理器将所述第一队列的清空状态修改为所述“清空完成”;

当所有需要清空的队列都完成清空之后,所述出队处理器向队列清空处理器发送清空完成指示,所述清空完成指示用于指示所述队列清空处理器所述所有需要清空的队列的清空操作已完成。

本发明实施例第三方面公开一种队列清空处理器,包括:

第一扫描单元,用于从队列信息表中扫描有效队列的清空状态;

确定单元,用于确定清空状态为“将被清空”的目标队列,所述队列信息表用于记录所述有效队列的清空状态;

处理单元,用于将所述目标队列的清空状态修改为“启动清空”;

清空单元,用于将所述目标队列清空;其中,所述目标队列被清空后,所述目标队列的清空状态被修改为“清空完成”。

可选的,所述队列清空处理器还包括:

判断单元,用于判断所述目标队列是否位于调度器的正常队列链表中,所述调度器用于对所述正常队列链表中的队列进行调度;

添加单元,用于当所述判断单元判断结果为否时,将所述目标队列添加到所述调度器的清空队列链表中;

所述清空单元,还用于在所述添加单元将所述目标队列添加到所述调度器的清空队列链表中之后,将所述目标队列清空;

所述清空单元,还用于当所述判断单元判断结果为是时,将所述目标队列清空。

可选的,所述清空单元包括:

读取子单元,用于读取所述正常队列链表和/或所述清空队列链表中当前已入队的所有队列的队列标识;

接收子单元,用于当所述正常队列链表和/或所述清空队列链表中当前已入队的所述所有队列的对列标识均被所述队列清空处理器读取之后,接收所述出队处理器发送的清空完成指示,所述清空完成指示用于指示所述正常队列链表和/或所述清空队列链表中当前已入队的所有需要清空的队列均被清空。

可选的,所述读取子单元包括:

第一处理子单元,用于读取所述正常队列链表和/或所述清空队列链表中第一队列的第一队列标识,向所述出队处理器发送针对所述第一队列标识的清空检查请求,所述清空检查请求用于请求所述出队处理器检查所述第一队列的清空状态,所述第一队列为所述正常队列链表和/或所述清空队列链表中当前已入队的所有队列中的任一个;

第二处理子单元,用于接收所述出队处理器发送的清空检查结果,所述清空检查结果用于指示所述第一队列是否需要被清空;

第三处理子单元,用于在所述清空检查结果指示所述第一队列需要被清空并且所述出队处理器有可用清空引擎对所述第一队列进行清空时,将所述第一队列从所述正常队列链表和/或所述清空队列链表中出队,并读取所述正常队列链表和/或所述清空队列链表中所述第一队列的下一个队列的队列标识;

第四处理子单元,用于在所述清空检查结果指示所述第一队列需要被清空并且所述出队处理器没有可用清空引擎对所述第一队列进行清空时,将所述第一队列加入所述清空队列链表中,并读取所述正常队列链表和/或所述清空队列链表中所述第一队列的下一个队列的队列标识;

第五处理子单元,用于在所述清空检查结果指示所述第一队列不需要被清空时,读取所述正常队列链表和/或所述清空队列链表中所述第一队列的下一个队列的队列标识。

可选的,所述队列清空处理器还包括:

接收单元,用于接收针对至少一个队列的清空命令,在所述队列信息表中记录所述至少一个队列的清空状态为所述“将被清空”。

可选的,所述队列清空处理器还包括:

丢弃单元,用于当所述至少一个队列中有数据包入队时,将所述数据包丢弃;

所述丢弃单元,还用于当接收到针对所述至少一个队列的数据包调度指令时,将所述数据包调度指令丢弃。

可选的,所述队列清空处理器还包括:

第二扫描单元,用于扫描所述队列信息表中所述目标队列的清空状态,检查所述目标队列中是否存在清空状态为所述“启动清空”的队列;

所述处理单元,还用于当所述第二扫描单元扫描到清空状态为所述“启动清空”的队列,将所述目标队列中清空状态为所述“启动清空”的队列修改为所述“清空完成”。

本发明实施例第四方面公开一种出队处理器,包括:

接收单元,用于接收队列清空处理器发送的针对第一队列标识的清空检查请求;

读取单元,用于从队列信息表中读取所述第一队列标识对应的第一队列的清空状态;

发送单元,用于当所述第一队列的清空状态为“启动清空”时,向所述队列清空处理器发送清空检查结果,所述清空检查结果用于指示所述第一队列是否需要被清空;

清空单元,用于当所述第一队列的清空状态为“启动清空”时,利用配置的清空引擎将所述第一队列内的包描述符清空并回收。

可选的,所述清空单元利用配置的清空引擎将所述第一队列内的包描述符清空并回收的方式具体为:

所述清空单元利用配置的清空引擎将所述第一队列内的包描述符清空并将所述包描述符从包描述符缓存中回收。

可选的,所述出队处理器还包括:

处理单元,用于将所述第一队列的清空状态修改为所述“清空完成”;

所述发送单元,还用于当所有需要清空的队列都完成清空之后,向队列清空处理器发送清空完成指示,所述清空完成指示用于指示所述队列清空处理器所述所有需要清空的队列的清空操作已完成。

本发明实施例第五方面公开一种计算机可读存储介质,所述计算机可读存储介质存储有一个或多个计算机程序,所述队列清空处理器通过运行所述一个或多个计算机程序来执行上述第一方面的队列清空方法,重复之处不再赘述。

本发明实施例第六方面公开一种计算机可读存储介质,所述计算机可读存储介质存储有一个或多个计算机程序,所述队列清空处理器通过运行所述一个或多个计算机程序来执行上述第二方面的队列清空方法,重复之处不再赘述。

本发明实施例中,队列清空处理器从队列信息表中扫描有效队列的清空状态,确定清空状态为“将被清空”的目标队列,队列信息表用于记录有效队列的清空状态;将目标队列的清空状态修改为“启动清空”;其中,当所述目标队列被清空后,所述目标队列的清空状态被修改为“清空完成”。本发明实施例中,当需要清空的队列数量较多时,无需考虑队列的优先级,可以同时扫描多个队列并进行清空,实现批量清空队列,保证队列清空完成时间,进而提高队列批量清空能力。

附图说明

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

图1是本发明实施例公开的一种系统架构示意图;

图2是本发明实施例公开的一种队列信息表、包描述符缓存以及包缓存的结构示意图;

图3是本发明实施例公开的一种队列清空处理器的架构示意图;

图4是本发明实施例公开的一种队列清空方法的流程示意图;

图5是本发明实施例公开的另一种队列清空方法的流程示意图;

图6是本发明实施例公开的另一种队列清空方法的流程示意图;

图7是本发明实施例公开的一种队列清空处理器的结构示意图;

图8是本发明实施例公开的一种出队处理器的结构示意图。

具体实施方式

下面结合附图,对本发明的实施例进行描述。

为了更好的理解本发明实施例,下面先对本发明实施例公开的一种系统架构进行描述。

请参阅图1和图2,图1是本发明实施例公开的一种流量管理系统架构示意图。如图1所示,该系统架构包括入队处理器(Enqueue Processor,EP)101、队列信息表(Flow Queue Information Table,FQIT)102、包缓存(Packet Memory,PM)103、包描述符缓存(Packet Descriptor Memory,PDM)104、调度器(Scheduler,SCH)105、出队处理器(Dequeue Processor,DP)106、队列清空处理器(Flush Processor,FP)107以及包描述符地址管理模块108。

图2是本发明实施例公开的一种队列信息表、包描述符缓存以及包缓存的结构示意图。如图2所示,队列信息表可以包含多行表项,每一行表项对应一个队列信息,例如,第一行对应第一队列信息,第一队列信息可以包括第一队列标识(FQID-1)、第一队列的长度、第一队列的头指针和尾指针、第一队列的清空状态等等;第二行对应第二队列信息,第二队列信息可以包括第二队列标识(FQID-2)、第二队列的长度、第二队列的头指针和尾指针、第二队列的清空状态等等、...第M行对应第M队列信息。队列信息表可以存储在非易失性存储器(例如,非易失性RAM)中。本发明实施例中的队列中的元素为包描述符,即将包描述符用链表串起来就构成了队列。队列中的元素满足“先入先出”的原则,队列中的队头用于删除元素(元素出队),队列中的队尾用于插入新的元素(元素入队)。本发明实施例中的每个队列都是由一串包描述符(Packet Descriptor,PD)组成的,图2中的第一队列标识对应的第一队列,由PD-1、PD-2、...PD–N总共N个包描述符组成。队列中的包描述符存储在包描述符缓存中,每个包描述符均包括数据包在包缓存中的地址、包描述符指针(指向队列中的下一个包描述符在包描述缓存中的地址)、数据包长度等。例如,如图2所示,图2中的地址长度以16位为例,PD-1包括PD-1在包描述符缓存中的地址(1000)、包描述符指针(例如,该指针指向地址1003,即在第一队列中,PD-1的下一个包描述符为PD-4)、数据包长度(例如,100bit);PD-2包括PD-2在包描述符缓存中的地址(1001)、包描述符指针(例如,该指针指向地址1005,即在第一队列中,PD-2的下一个包描述符为PD-6)、数据包长度(例如,100bit)。包缓存中存储有包描述符对应的数据包,例如,数据包-1存储在包描述符地址2000中,数据包-2存储在包描述符地址2001中,数据包-3存储在包描述符地址2002中等等。其中,包描述符与数据包一一对应,如图2所示,PD-1对应数据包-1,PD-2对应数据包-2等等。

入队处理器101,用于将收到的数据包写入包缓存103、为该数据包分配包描述符(Packet Descriptor,PD),并将该包描述符写入包描述符缓存104、将该包描述符链接到队列信息表102中对应的队列的队尾。包描述符包含数据包的包长及数据包在包缓存103中的地址等信息。

队列信息表102,用于存储队列相关信息(队列相关信息可以包括队列长度、队列标识等)、队列的头指针和尾指针、队列的清空状态等。当数据包入队时,入队处理器101将新入队的数据包的包描述符链接到队列的队尾,此时队列信息表102中该队列的队尾指针指向该队列新入队的包描述符在包描述符缓存的地址。当数据包出队时,出队处理器106将队列的队头的包描述符读出,此时队列信息表102中该队列的队头指针指向该队列的下一个包描述符在包描述符缓存的地址。队列信息表102中可以存储多个队列的队列相关信息(例如,队头、队尾、队列长度等等)。队列信息表102可以存放在存储器(例如,非易失性存储器)中。

包缓存103,用于存储队列中的包描述符对应的数据包。

包描述符缓存104,用于存储队列中的包描述符。

调度器105,用于根据队列的空满状态和调度策略决定出队的队列。调度器内部可以保存有队列链表。将多个队列串起来,即可构成队列链表,队列链表中的每个元素为队列标识,队列链表也称为“队列的队列”。

出队处理器106,用于将出队队列队头的包描述符从包缓存103读出包数据后送给接口模块发送数据。

队列清空处理器107,用于接收软件下发的队列清空命令,对队列信息表102和调度器105内部的队列链表进行扫描来完成队列清空功能。

包描述符地址管理模块108,用于从出队处理器107接收被回收的包描述符,出队处理器107可以将调度器105正常调度出队的队列和被清空的队列内的包描述进行回收利用。这些被回收的包描述符可以用于入队处理器101分配给新来的数据包使用。包描述符地址管理模块108内部可以保存一个或多个回收队列。回收队列是由回收的包描述符组成的队列,当有新的数据包入队时,可以将回收队列中位于队头的包描述符出队,并由入队处理器101分配给新入队的数据包;当有被回收的包描述入队时,可以将被回收的包描述符放入回收队列的队尾。

当有数据包入队时,入队处理器101将接收到的数据包写入包缓存103、为该数据包分配包描述符(可以根据数据包的大小分配一个或多个包描述符),并将该包描述符写入包描述符缓存104(即,在包描述符缓存104中分配一块存储空间用于存放包描述符)、并将该包描述符链接到队列信息表102中对应的队列的队尾中。当调度器105调度该数据包所处的队列从队列链表中出队时,出队处理器106根据该队列中的包描述符(从该队列的队头的包描述符开始)从包缓存103读出该数据包后送给接口模块发送数据,以释放在该数据包在包缓存103中的存储空间。当该队列中的所有包描述符对应的数据包都被发送之后,出队处理器106将该队列中的所有包描述符从包描述符缓存104中读出进行回收(即通知包描述符地址管理模块108该队列中的所有包描述符可以作为新入队的数据包的包描述符了)。在数据包正常出队时,当数据包被发送走之后,出队处理器106可以立即将该数据包对应的包描述符进行回收利用。每个包描述符均包括数据包在包缓存103中的地址,用于存放在该地址中的数据包。当一个包描述符被用于存储数据包后,在该数据包被发送或者清空后才能被回收用于存储新的数据包。由于包描述符包含数据包在包缓存103中的地址,回收利用包描述符,即可以重复利用包缓存103的存储空间。

本发明实施例中的包描述符可以回收利用,当该包描述对应的数据包被发送之后,可以将该包描述符分配给新入队的数据包。

当有队列被清空时,队列清空处理器107读取调度器105中的队列链表中每个队列的队列标识,并将读取的队列标识发送给出队处理器106,出队处理器106从队列信息表中读取该队列标识对应的队列的清空状态,当该队列的清空状态为“启动清空”时,出队处理器106将该队列内的包描述符进行清空并回收(即通知包描述符地址管理模块108该第一队列中的所有包描述符可以作为新入队的数据包的包描述符了),当该队列内的所有包描述符全部被清空并回收后,出队处理器106将该队列的清空状态修改为“清空完成”,即完成对该队列的清空。当该队列被清空时,出队处理器106无需对该队列中的所有包描述对应的数据包进行处理(因为只要回收了包描述符,当该包描述符被重新利用的时候,之前旧的数据包会被新的数据包覆盖)。由于该队列中的所有包描述会占用包缓存103中的存储空间,回收利用包描述符,即可以重复利用包缓存103的存储空间。

当所有需要清空的队列都完成清空之后,出队处理器106向队列清空处理器107发送清空完成指示,清空完成指示用于指示队列清空处理器107所有需要清空的队列的清空操作已完成。

请参阅图3,图3是本发明实施例公开的一种队列清空处理器的架构示意图。如图3所示,该队列清空处理器107包括队列清空命令处理器(Flush Commander Processor,FCP)1071、队列扫描器(Queue Scanner,QS)1072和调度器扫描器(Scheduler Scanner,SS)1073。

队列清空命令处理器1071,用于接收和记录软件下发的队列清空命令。队列清空命令处理器1071可以包括清空寄存器,清空寄存器用于记录并存储软件下发的队列清空命令。

队列扫描器1072,用于对队列信息表中的队列状态进行扫描,例如:清空标志扫描(Mask Scan)和清空完成扫描(Cleanup Scan)。

调度器扫描器1073,用于对调度器中的队列链表进行扫描,并将队列链表中队列的队列标识发送给出队处理器106做清空检查。

基于图1、图2和图3所示的架构示意图,公开了一种队列清空方法,请参阅图4,图4是本发明实施例公开的一种队列清空方法的流程示意图。如图4所示,该队列清空方法包括如下步骤。

401、队列清空处理器从队列信息表中扫描有效队列的清空状态,确定清空状态为“将被清空”的目标队列,队列信息表用于记录有效队列的清空状态。

本发明实施例中,队列清空处理器可以从队列信息表中逐个读取有效队列的队列信息,并扫描有效队列的清空状态。有效队列的清空状态一般可以分为“将被清空”、“启动清空”和“清空完成”三种。具体实现中,有效队列的清空状态可以通过二进制的清空状态标识进行标识。例如,清空状态标识“01”代表“将被清空”、清空状态标识“10”代表“启动清空”、清空状态标识“11”代表“清空完成”。

有效队列可以是预先设置的队列。例如,预先设置的队列可以是软件配置的需要清空的队列范围,对范围内的队列进行扫描,对范围之外的队列不进行扫描。有效队列还可以通过队列信息表中每个队列的有效标识进行识别。例如,当有效标识为“0”时,表示该队列为无效队列;当有效标识为“1”时,表示该队列为无效队列。一般而言,有效队列与无效队列相对,有效队列是正在入队和出队的队列,无效队列是空队列或者调度出错的队列。无效队列一般没有清空状态。

队列清空处理器从队列信息表中扫描有效队列的清空状态需要一定的时长,将队列清空处理器从队列信息表中扫描有效队列的清空状态所花费的时长命名为第一时间间隔,则第一时间间隔可以根据有效队列的数量以及队列清空处理器的处理能力来确定。例如,将第一时间间隔记为T_mask_scan,将有效队列的个数记为Total_fq_number,设置扫描一个队列的时长为T_mask_scan_interval,则第一时间间隔T_mask_scan=Total_fq_number×T_mask_scan_interval。T_mask_scan_interval的大小可以根据芯片(例如,流量管理芯片)的处理能力进行设置,例如,芯片的处理能力为每拍时钟可以扫描一个队列,则可以设置T_mask_scan_interval=64拍时钟,以限制扫描占用的芯片处理能力为芯片处理能力的1/64。设置T_mask_scan_interval为64拍时钟,可以使得扫描占用的处理能力不会对芯片的其他正常处理(例如,队列的出队、入队、调度等等)造成影响。

举例来说,假设芯片的频率为500MHz,有效队列的个数Total_fq_number为512K个,则每拍时钟时间为1/500MHz=2ns;第一时间间隔T_mask_scan=Total_fq_number×T_mask_scan_interval=512×1024×64×2ns=67.1ms。

本发明实施例中的队列按照队列层次结构可以分为如下6种。

1、流队列(Flow Queue,FQ):单个的用户优先级队列称为流队列。

2、用户队列(Subscriber Queue,SQ):一个用户的所有优先级队列合起来称为用户队列。

3、用户组优先级队列(Group Queue,GQ):属于一个(或者多个)优先级的一些(比如属于同一个公司的)流队列合起来组成的队列称为用户优先组队列。

4、虚拟接口队列(Virtual Interface Queue,VI):属于一个(或者多个)优先级的一些(比如属于同一运营商的)用户组优先级队列合起来组成的队列称为虚拟接口队列。

5、物理端口队列(Dummy Port Queue,DP):同一个物理端口的属于一个(或者多个)优先级的虚拟接口队列合起来组成的队列称为物理端口队列。

6、逻辑端口队列(Trunk Port Queue,TP):同一逻辑端口的属于一个(或者多个)优先级的物理端口队列合起来组成的队列称为逻辑端口队列。

402、队列清空处理器将目标队列的清空状态修改为“启动清空”。

本发明实施例中,当队列清空处理器扫描到一个队列的清空状态为“将被清空”时,队列清空处理器将这个队列的清空状态修改为“启动清空”。

本发明实施例中的步骤401至步骤402为队列清空处理器进行的清空标志扫描(Mask Scan),队列清空处理器可以定期的执行步骤401至步骤402、进行清空标志扫描。

403、队列清空处理器将目标队列清空;其中,当目标队列被清空后,目标队列的清空状态被修改为“清空完成”。

本发明实施例中,队列清空处理器将目标队列清空,清空的结果是指将目标队列中的元素(例如,包描述符)清空并回收。具体的,队列清空处理器可以读取调度器中的队列链表中队列的队列标识,向出队处理器发送针对目标队列的清空检查请求,出队处理器配置清空引擎对目标队列中的包描述符进行清空,当目标队列中的所有包描述符全部被清空之后,出队处理器将目标队列中的所有包描述符从包描述符缓存中读出并进行回收,以使目标队列中的所有包描述符可以分配给新入队的数据包使用。本发明实施例中的引擎可以分为出队引擎和清空引擎。其中,出队引擎可以多线程的并行处理多个出队请求,出队引擎可以对正常出队的队列执行出队操作。清空引擎可以多线程的并行处理多个清空检查请求,用于将需要清空的目标队列进行清空。本发明实施例将目标队列进行清空时,无需考虑目标队列的优先级,出队处理器配置清空引擎并行的对目标队列中的包描述符进行清空,即可完成对目标队列的清空。

实施图4所示的方法,清空队列时无需考虑队列的优先级,对所有的队列都以相同的方式进行扫描并清空,可以同时扫描多个队列并进行清空,实现批量清空队列,可以保证队列的清空完成时间,进而提高队列批量清空能力。

基于图1、图2和图3所示的架构示意图,公开了另一种队列清空方法,请参阅图5,图5是本发明实施例公开的另一种队列清空方法的流程示意图。如图5所示,该队列清空方法包括如下步骤。

501、队列清空处理器从队列信息表中扫描有效队列的清空状态,确定清空状态为“将被清空”的目标队列,队列信息表用于记录有效队列的清空状态。

502、队列清空处理器将目标队列的清空状态修改为“启动清空”。

503、队列清空处理器判断目标队列是否位于调度器的正常队列链表中,若否,执行步骤504、若是,执行步骤505。

504、队列清空处理器将目标队列添加到调度器的清空队列链表中,并执行步骤505。

本发明实施例中,调度器用于对正常队列链表中的队列进行调度。调度器通常会维护一定数量的正常队列链表,正常队列链表用来管理和调度可用剩余信用度(credit)直接发送数据包的队列。除了正常队列链表之外,调度器也可以增加一个专门用于队列清空的清空队列链表,清空队列链表用于串连不在正常队列链表中并且需要清空的队列。队列链表也是一种队列,队列链表中的每个元素为队列标识,队列链表也称为“队列的队列”。

如果目标队列位于调度器的正常队列链表中,表明目标队列可以被调度器正常调度。如果目标队列位于调度器的清空队列链表中,表明目标队列可以被出队处理器进行清空。

505、队列清空处理器将目标队列清空;其中,当目标队列被清空后,目标队列的清空状态被修改为“清空完成”。

本发明实施例中,不论目标队列是位于调度器的正常队列链表中,还是位于调度器的清空队列链表中,还是一部分目标队列位于调度器的正常队列链表中,另一部分目标队列位于调度器的清空队列链表中,都需要将目标队列进行清空。

可选的,在一种实施方式中,步骤505可以包括如下步骤:

(11)队列清空处理器读取正常队列链表和/或清空队列链表中当前已入队的所有队列的队列标识;

(12)当正常队列链表和/或清空队列链表中当前已入队的所有队列的对列标识均被队列清空处理器读取之后,队列清空处理器接收出队处理器发送的清空完成指示,清空完成指示用于指示正常队列链表和/或清空队列链表中当前已入队的所有需要清空的队列均被清空。

本发明实施例中,步骤(11)和步骤(12)为调度器清空扫描的流程。如果正常队列链表和清空队列链表中都有目标队列,队列清空处理器可以同时扫描正常队列链表和清空队列链表。对于正常队列链表来说,队列清空处理器用扫描指针记录正常队列链表当前正在被扫描的队列标识,用扫描队尾指针记录正常队列链表的当前的队尾的队列标识(当正常队列链表中有新的队列入队时,扫描队尾指针不变)。对于清空队列链表来说,队列清空处理器用扫描指针记录清空队列链表当前正在被扫描的队列标识(即队头的队列标识),用扫描队尾指针记录清空队列链表的队尾的队列标识(当清空队列链表中有新的队列入队时,扫描队尾指针指向新入队的队列)。

需要说明的是,为了降低队列清空对队列的正常出队、入队、调度等其他操作带来影响,本发明实施例中的清空操作的优先级要比调度器的正常调度操作的优先级低,因此,队列清空处理器在读取调度器的正常队列链表中队列的队列标识时,调度器仍然可以对正常队列链表中的队列进行出队、入队等操作。如果正常队列链表中的队列在队列清空处理器读取并发送给出队处理器进行清空检查时,该队列被调度器正常调度出队(对于被正常调度出队的队列,出队处理器会利用出队引擎进行清空并回收队列中的包描述符),则队列清空处理器继续读取正常队列链表中下一个队列的队列标识并发送给出队处理器进行清空检查。如果正常队列链表中的队列在队列清空处理器读取并发送给出队处理器进行清空检查时,该队列的清空状态为“启动清空”,但出队处理器当前没有可用的清空引擎,为了保证该队列能够被清空,则队列清空处理器将该队列重新放入清空队列链表中(例如,放入清空队列链表的队尾),等待后续队列清空处理器读取清空队列链表中的该队列并交给出队处理器进行清空操作。如果队列清空处理器在读取正常队列链表中队列的队列标识时,该正常队列链表有新队列入队,为了控制正常队列链表的读取时间,本发明实施例在刚开始读取正常队列链表中队列的队列标识时,会记录正常队列链表当时的队尾的队列标识,当队列清空处理器读取到该队尾的队列标识时,结束对该正常队列链表的读取操作。具体的,当队列清空处理器启动调度器清空扫描后,就用扫描队尾指针记录正常队列链表中的队尾的队列标识,当扫描指针扫描的队列标识为队尾的队列标识时,表明该正常队列链表扫描完成。实施本发明实施例,可以防止出现队列清空处理器启动调度器清空扫描后,后续不断有新的队列进入该正常队列链表时,会不断的对新入队的队列进行扫描导致无法结束对正常队列链表扫描的问题。实施步骤(11)和步骤(12),在启动调度器清空扫描后,对于后续进入正常队列链表中的队列不进行扫描,可以保证调度器清空扫描的完成时间。

队列清空处理器读取正常队列链表和/或清空队列链表中当前已入队的所有队列的队列标识需要一定的时长,将读取正常队列链表和/或清空队列链表中当前已入队的所有队列的队列标识所花费的时长命名为第二时间间隔,第二时间间隔可以根据调度器中正常队列链表和/或清空队列链表中需要扫描的队列的数量以及队列清空处理器的处理能力进行设定。例如,将第二时间间隔T_scheduler_scan,将需要扫描的队列的个数记为Total_fq_number,设置扫描一个队列的时长为T_scheduler_scan_interval,则第二时间间隔T_scheduler_scan=Total_fq_number×T_scheduler_scan_interval+T_pd_flush。

其中,T_pd_flush是出队处理器将需要清空的队列中的所有包描述符从包描述符缓存中清空所需要的时间,如果配置的清空引擎数量为Flush_engine_number,总的引擎数量为Total_engine_number,假设芯片每拍时钟可以从包描述符缓存中读取一个包描述符,则清空一个包描述所需要的时间为Total_engine_number/Flush_engine_number拍时钟。用Total_pd_number表示需要清空的总的包描述符数量,则T_pd_flush=Total_pd_number×Total_engine_number/Flush_engine_number拍时钟

T_scheduler_scan_interval的大小可以根据芯片(例如,流量管理芯片)的处理能力进行设置,例如,芯片的处理能力为每拍时钟可以扫描一个队列,则可以设置T_scheduler_scan_interval=64拍时钟,以限制扫描占用的芯片处理能力为芯片处理能力的1/64。设置T_scheduler_scan_interval为64拍时钟,可以使得调度器扫描占用的处理能力不会对芯片的其他正常处理(例如,队列的出队、入队、调度等等)造成影响。

举例来说,假设芯片的频率为500MHz需要扫描的队列的个数为Total_fq_number为512K个,则每拍时钟时间为1/500MHz=2ns;配置的清空引擎数量为Flush_engine_number=1,总的引擎数量为Total_engine_number=64,Total_pd_number=1M,则第二时间间隔T_scheduler_scan=Total_fq_number×T_scheduler_scan_interval+T_pd_flush;其中,T_pd_flush=Total_pd_number×(Total_engine_number/Flush_engine_number)×每拍时钟时间。则T_scheduler_scan=512×1024×64×2ns+1×1024×1024×64×2ns=67.1ms+134.2ms=201.3ms。

队列清空处理器对正常队列链表进行扫描,当扫描到正常队列链表中的队列标识时,向出队处理器发送针对该队列标识的清空检查请求,出队处理器接收到清空检查请求后,读取队列信息表中该队列标识对应的队列的清空状态。如果该队列标识有效(即该队列标识未被调度器调度),并且该队列的清空状态为“启动清空”,则出队处理器向队列清空处理器发送清空检查结果并利用配置的清空引擎将该队列内的包描述符清空。队列清空处理器接收到出队处理器发送的清空检查结果后,将该目标队列标识从正常队列链表和/或清空队列链表中出队。

可选的,在一种实施方式中,队列清空处理器对调度器进行扫描以及出队处理器对队列进行清空,具体可以包括如下步骤:

(21)队列清空处理器读取正常队列链表和/或清空队列链表中第一队列的第一队列标识,向出队处理器发送针对第一队列标识的清空检查请求,清空检查请求用于请求出队处理器检查第一队列的清空状态,第一队列为正常队列链表和/或清空队列链表中当前已入队的所有队列中的任一个;

(22)出队处理器接收队列清空处理器发送的针对第一队列标识的清空检查请求,并从队列信息表中读取第一队列标识对应的第一队列的清空状态;

(23)当第一队列的清空状态为“启动清空”时,出队处理器向队列清空处理器发送清空检查结果,并利用配置的清空引擎将第一队列内的包描述符清空并回收,清空检查结果用于指示第一队列是否需要被清空;

(24)队列清空处理器接收出队处理器发送的清空检查结果,若清空检查结果指示第一队列需要被清空并且出队处理器有可用清空引擎对第一队列进行清空,队列清空处理器将第一队列从正常队列链表和/或清空队列链表中出队,并读取正常队列链表和/或清空队列链表中第一队列的下一个队列的队列标识;

(25)若清空检查结果指示第一队列需要被清空并且出队处理器没有可用清空引擎对第一队列进行清空,队列清空处理器将第一队列加入清空队列链表中,并读取正常队列链表和/或清空队列链表中第一队列的下一个队列的队列标识;

(26)若清空检查结果指示第一队列不需要被清空,队列清空处理器读取正常队列链表和/或清空队列链表中第一队列的下一个队列的队列标识。

本发明实施例中,当出队处理器从队列信息表中读取第一队列标识对应的第一队列的清空状态为“启动清空”时,出队处理器会利用配置的清空引擎将第一队列内的包描述符清空并回收。由于配置的用于清空的清空引擎数量占总引擎的比例较小,有可能会出现出队处理器当前没有可用的清空引擎对第一队列进行清空的情况,为了保证在此情况下该第一队列能够被清空,则队列清空处理器将该第一队列重新放入清空队列链表中(例如,放入清空队列链表的队尾),等待后续队列清空处理器读取清空队列链表中的该第一队列并交给出队处理器进行清空操作。

可选的,出队处理器利用配置的清空引擎将第一队列内的包描述符清空并回收的方式具体为:

出队处理器利用配置的清空引擎将第一队列内的包描述符清空并将包描述符从包描述符缓存中回收。

本发明实施例中,引擎可以分为出队引擎和清空引擎。其中,出队引擎可以多线程的并行处理多个出队请求,出队引擎可以对正常出队的队列执行出队操作。清空引擎可以多线程的并行处理多个清空检查请求,用于将需要清空的目标队列内的包描述符从包描述符缓存中回收(回收后的包描述符可以另作他用,例如,可以将回收后的包描述符分配给新入队的数据包)。清空引擎并不是将包描述符彻底的删除并丢弃,而是回收后重新利用。

出队处理器的主要功能是处理队列出队,出队处理器通常用多个出队引擎并行处理出队请求。本发明实施例中,由于队列清空时,也需要引擎处理队列清空,所以将出队引擎中配置一定数量的引擎作为清空引擎。为了控制队列清空对正常队列出队的影响,可以限制清空引擎(用于队列清空的引擎)的个数不超过预设阈值。例如,如果总的引擎的个数为100个,可以限制清空引擎的个数不超过5个,保证至少有95个引擎用于处理正常的队列出队。出队处理器接收到清空检查请求后,等到有至少一个清空引擎空闲时,将这个清空引擎配置为用于处理清空检查。

可选的,出队处理器利用配置的清空引擎将第一队列内的包描述符清空并将包描述符从包描述符缓存中回收之后,还可以执行如下步骤:

(31)出队处理器将第一队列的清空状态修改为“清空完成”;

(32)当所有需要清空的队列都完成清空之后,出队处理器向队列清空处理器发送清空完成指示,清空完成指示用于指示队列清空处理器所有需要清空的队列的清空操作已完成。

本发明实施例中,在出队处理器利用配置的清空引擎将第一队列内的所有包描述符清空并将包描述符从包描述符缓存中回收之后,出队处理器将第一队列的清空状态修改为“清空完成”。当出队处理器对队列清空处理器发送的所有队列清空请求都进行处理,并将所有需要清空的队列的清空状态修改为“清空完成”之后,出队处理器向队列清空处理器发送清空完成指示,清空完成指示用于指示队列清空处理器所有需要清空的队列的清空操作已完成。此时,队列清空处理器的调度请清空扫描正式结束。

可选的,在执行步骤505之后,还可以执行步骤506和步骤507。

506、队列清空处理器扫描队列信息表中目标队列的清空状态,检查目标队列中是否存在清空状态为“启动清空”的队列。

507、若是,队列清空处理器将目标队列中清空状态为“启动清空”的队列的清空状态从“启动清空”修改为“清空完成”。

本发明实施例中,在执行步骤501至步骤505之后,队列的清空操作已经结束了。但是在调度器清空扫描中有可能会出现一些漏修改队列的清空状态的情况,此时需要在执行步骤505之后,继续执行步骤506和步骤507,以保证需要被清空的队列彻底被清空。对于基于信用值(credit)调度的调度器,调度器在对队列进行正常调度时,会预先给队列分配一定的信用值(credit),队列才能发送与信用值对应的数据包。例如,调度器分配给队列1K的信用值,队列才能发送1K的数据包。如果调度器的正常队列链表中某一队列在被调度器调度之前就已经被出队处理器进行清空了,由于该队列被清空,该队列中的数据包就没有被正常调度并发送,该队列的信用值实际上并没有被使用,为了保证调度器分配的信用值不被浪费(即保证调度器分配的带宽不会由于清空操作导致降低),该队列在被清空之后,需要将之前分配的信用值还给调度器。一般而言,出队处理器将队列清空后,会将该队列之前分配的信用值还给调度器,当信用值被还给调度器之后,出队处理器才将该队列的清空状态从“启动清空”修改为“清空完成”。如果出队处理器将之前分配的信用值还给调度器的时候,调度器正在为其他的队列分配信用值,则可能会出现信用值返还失败的情况。在信用值返还失败时,队列的清空状态仍然为“启动清空”,未被修改为“清空完成”。因此,本发明实施例增加了步骤506和步骤507,以保证需要被清空的队列彻底被清空。

下面具体解释为什么会出现信用值返还失败的情况。调度器可以用非易失性随机存储器(Non-Volatile Random Access Memory,NVRAM)存储信用值,如果NVRAM为单端口RAM,则NVRAM在一拍时钟内仅能进行一次读操作或者一次写操作,即,调度器在一拍时钟内,仅能为队列分配信用值或者接收队列返还的信用值。由于在队列清空处理器进行调度器清空扫描时,清空操作的优先级要比调度器的正常调度操作的优先级要低,所以在一拍时钟内,如果调度器正在为队列分配信用值,此时又有队列在返还信用值,则会出现信用值返还失败的情况。当然,如果NVRAM为双端口RAM,则不会出现信用值返还失败的情况。

步骤506和步骤507,也称之为清空完成扫描(Cleanup Scan)。清空完成扫描所需要的时长命名为第三时间间隔,第三预设时间间隔可以根据有效队列的数量以及队列清空处理器的处理能力进行设定。例如,有效队列的个数为Total_fq_number,设置扫描一个队列的时长为T_cleanup_scan_interval,则第一时间间隔T_cleanup_scan=Total_fq_number×T_cleanup_scan_interval。T_cleanup_scan_interval的大小可以根据芯片(例如,流量管理芯片)的处理能力进行设置,例如,芯片的处理能力为每拍时钟可以扫描一个队列,则可以设置T_cleanup_scan_interval=64拍时钟,以限制扫描占用的芯片处理能力为芯片处理能力的1/64。设置T_cleanup_scan_interval为64拍时钟,可以使得扫描占用的处理能力不会对芯片的其他正常处理(例如,队列的出队、入队、调度等等)造成影响。举例来说,假设芯片的频率为500MHz,有效队列的个数Total_fq_number为512K个,则每拍时钟时间为1/500MHz=2ns;第三时间间隔T_cleanup_scan=Total_fq_number×T_cleanup_scan_interval=512×1024×64×2ns=67.1ms。

下面从队列清空处理器这一侧来描述调度器清空扫描的过程。具体场景中,假设调度器中有10个正常队列链表,1个清空队列链表,队列清空处理器扫描10个正常队列链表中的预设正常队列链表(例如,10个中的5个)。队列清空处理器开始对这5个正常队列链表(包括第一正常队列链表、第二正常队列链表、第三正常队列链表、第四正常队列链表和第五正常队列链表)进行调度器清空扫描时,队列清空处理器可以对这5个正常队列链表逐个进行扫描。以扫描第一正常队列链表为例,首先,队列清空处理器用扫描指针记录第一正常队列链表的当前正在扫描的队列标识,用扫描队尾指针记录第一正常队列链表的队尾的队列标识。然后,队列清空处理器开始对第一正常队列链表进行调度器清空扫描,逐个将第一正常队列链表中扫描到的队列标识(例如,FQID1)读出,并判断清空队列链表是否为空,若否,将清空队列链表的队头的队列标识(FQID2)读出,若是,则不对清空队列链表做任何处理。然后,以清空队列链表为非空的情况来说,队列清空处理器将FQID1和FQID2发给出队处理器做清空检查并等待出队处理器的清空检查结果。如果在等待清空检查结果时,FQID1被调度器正常调度出队,则将扫描指针指向第一正常队列链表中的下一个队列标识;如果清空检查结果指示FQID2对应的队列的清空状态为“启动清空”,则将FQID2对应的队列从清空队列链表中出队;如果在等待清空检查结果时,扫描指针没有被改变,并且清空检查结果指示FQID1对应的队列的清空状态为“启动清空”,则将FQID1对应的队列从第一正常队列链表中移除,并将扫描指针指向第一正常队列链表中的下一个队列标识。当扫描队尾指针指向的队列标识被清空检查完成或者被正常出队后,第一正常队列链表的清空扫描完成,继续扫描下一个正常队列链表(例如,第二正常队列链表)。

下面从出队处理器这一侧来描述调度器清空扫描的过程。具体场景中,当出队处理器接收队列清空处理器发送的针对FQID1和FQID2的清空检查请求后,出队处理器读取队列信息表中FQID1对应的目标队列的清空状态。当读取FQID1对应目标队列的清空状态为“启动清空”时,出队处理器向队列清空处理器发送清空检查结果,该清空检查结果用于指示FQID1的清空状态为“启动清空”。出队处理器向队列清空处理器发送清空检查结果后,利用配置的清空引擎将目标队列内的包描述符清空。如果用配置的清空引擎个数为1个,则出队处理器每次只能清空一个目标队列。例如,当读取FQID1对应目标队列的清空状态为“启动清空”时,清空引擎先对FQID1对应目标队列进行清空处理,等到FQID1对应目标队列内的包描述符清空完毕后,清空引擎再对FQID2对应目标队列进行清空处理。在另一种场景中,出队处理器对正常调度出队的队列1也会做清空检查,当读取该队列1的清空状态为“启动清空”时,表明该队列1为需要清空的队列,此时出队处理器判断是否有处于空闲状态的清空引擎,如果有,则利用处于空闲状态的清空引擎将队列1内的包描述符清空;如果没有,则出队处理器将队列1放入清空队列链表中,等待被清空。

需要注意的是,将目标队列清空,指的是将目标队列内的包描述符从包描述符缓存中回收,而包描述符原本对应的数据包则无需清理,这些数据包变为没有包描述符的数据包,这些数据包的清空与否并不影响到目标队列的清空。

图5中的步骤501和步骤502的具体实施方式可以参见图4所示的步骤401和步骤402、步骤506和步骤507的具体实施方式可以参见图4所示的步骤404和步骤405、此处不再赘述。

可选的,在执行步骤501之前,或者执行步骤507之后,或者在执行步骤501至步骤507之间,还可以执行如下步骤:

(41)队列清空处理器接收针对至少一个队列的清空命令,在队列信息表中记录至少一个队列的清空状态为“将被清空”;

(42)当上述至少一个队列中有数据包入队时,队列清空处理器将数据包丢弃;

(43)当接收到针对上述至少一个队列的数据包调度指令时,队列清空处理器将数据包调度指令丢弃。

本发明实施例中,队列清空处理器可以接收中央处理器发送的针对至少一个队列的清空命令,并在队列信息表中记录上述至少一个队列的清空状态为“将被清空”。当一个队列的清空状态为“将被清空”或者“启动清空”之后,如果有数据包要调度进入这个队列,则队列清空处理器将数据包丢弃;接收到针对清空状态为“将被清空”或者“启动清空”的队列的数据包调度指令时(例如,有数据包要从这个队列中调度出去),队列清空处理器将数据包调度指令丢弃。当队列进入清空流程之后,该队列无法进行入队操作,也无法接收新的数据包调度指令,可以保证队列在清空过程中能够不被新的调度操作的影响。

下面举例说明队列清空需要的时间。

举例来说,假设芯片的频率为500MHz,有效队列的个数Total_fq_number为512K个,则每拍时钟时间为1/500MHz=2ns;配置的清空引擎数量为Flush_engine_number=1,总的引擎数量为Total_engine_number=64,Total_pd_number=1M,第一时间间隔T_mask_scan=Total_fq_number×T_mask_scan_interval=512×1024×64×2ns=67.1ms。第二时间间隔T_cleanup_scan=Total_fq_number×T_cleanup_scan_interval=512×1024×64×2ns=67.1ms。第三时间间隔T_scheduler_scan=Total_fq_number×T_scheduler_scan_interval+T_pd_flush;其中,T_pd_flush=Total_pd_number×(Total_engine_number/Flush_engine_number)×每拍时钟时间。则T_scheduler_scan=512×1024×64×2ns+1×1024×1024×64×2ns=67.1ms+134.2ms=201.3ms。因此,完成一轮队列清空扫描的时间上限为T_flush_round=T_mask_scan+T_cleanup_scan+T_scheduler_scan=67.1ms+67.1ms+201.3ms=335.5ms。一般情况下,当软件下发清空命令之后,开始一轮队列清空扫描,则需要清空的队列在一轮队列清空扫描的时间上限内就可以完成清空。当软件下发清空命令之后,如果已经开始了一轮队列清空扫描,则需要清空的队列等待这一轮队列清空扫描之后,在下一轮队列清空扫描之后就可以完成清空。可见,当软件下发清空命令之后,队列会在两轮队列清空扫描时长内完成。因此,队列清空的时间上限T_flush=2×T_flush_round=671ms。

实施图5所示的方法,经过三次扫描(清空标识扫描、调度器清空扫描和清空完成扫描)之后,即可完成队列的清空。无需考虑队列的优先级,可以同时扫描多个队列并进行清空,保证队列的清空完成时间,进而提高队列清空能力。

基于图1、图2以及图3所示的架构示意图,公开了另一种队列清空方法,请参阅图6,图6是本发明实施例公开的另一种队列清空方法的流程示意图。如图6所示,该队列清空方法包括如下步骤。

601、队列扫描器从队列信息表中扫描有效队列的清空状态,确定清空状态为“将被清空”的目标队列,队列信息表用于记录有效队列的清空状态。

602、队列扫描器将目标队列的清空状态修改为“启动清空”。

其中,步骤601和步骤602为队列扫描器进行的清空标识扫描过程。

603、调度器扫描器读取调度器中正常队列链表和/或清空队列链表中第一队列的第一队列标识。

604、调度器扫描器向出队处理器发送针对第一队列标识的清空检查请求。

其中,清空检查请求用于请求出队处理器检查第一队列的清空状态,第一队列为正常队列链表和/或清空队列链表中当前已入队的所有队列中的任一个。

605、出队处理器从队列信息表中读取第一队列标识对应的第一队列的清空状态。

606、当第一队列的清空状态为“启动清空”时,出队处理器向队列清空处理器发送清空检查结果,清空检查结果用于指示第一队列是否需要被清空。

607、出队处理器利用配置的清空引擎将第一队列内的包描述符清空并将包描述符从包描述符缓存中回收。

608、出队处理器将第一队列的清空状态修改为“清空完成”。

609、当所有需要清空的队列都完成清空之后,出队处理器向调度器扫描器发送清空完成指示,清空完成指示用于指示调度器扫描器所有需要清空的队列的清空操作已完成。

步骤603至步骤609为调度器扫描器和出队处理器进行的调度器清空扫描过程。

610、队列扫描器扫描队列信息表中目标队列的清空状态,检查目标队列中是否存在清空状态为“启动清空”的队列。

611、若是,队列扫描器将目标队列中清空状态为“启动清空”的队列的清空状态从“启动清空”修改为“清空完成”。

步骤610至步骤611为队列扫描器进行的清空完成扫描过程。

实施图6所示的方法,经过三次扫描(清空标识扫描、调度器清空扫描和清空完成扫描)之后,即可完成队列的清空。无需考虑队列的优先级,可以同时扫描多个队列并进行清空,保证队列的清空完成时间,进而提高队列清空能力。

请参阅图7,图7是本发明实施例公开的一种队列清空处理器的结构示意图,如图7所示,该队列清空处理器包括第一扫描单元701、确定单元702、处理单元703和清空单元704,其中:

第一扫描单元701,用于从队列信息表中扫描有效队列的清空状态。

确定单元702,用于确定清空状态为“将被清空”的目标队列,队列信息表用于记录有效队列的清空状态。

处理单元703,用于将目标队列的清空状态修改为“启动清空”。

清空单元704,用于将目标队列清空;其中,目标队列被清空后,目标队列的清空状态被修改为“清空完成”。

本发明实施例无需考虑目标队列的优先级,可以同时扫描多个队列并进行清空,实现批量清空队列,可以保证队列的清空完成时间,进而提高队列批量清空能力。

该队列清空处理器的实施可以参见图4所示的方法实施例,重复之处不再赘述。

请参阅图8,图8是本发明实施例公开的一种出队处理器的结构示意图,如图8所示,该出队处理器包括接收单元801、读取单元802、发送单元803和清空单元804,其中:

接收单元801,用于接收队列清空处理器发送的针对第一队列标识的清空检查请求。

读取单元802,用于从队列信息表中读取第一队列标识对应的第一队列的清空状态。

发送单元803,用于当第一队列的清空状态为“启动清空”时,向队列清空处理器发送清空检查结果,清空检查果用于指示第一队列是否需要被清空。

清空单元804,用于当第一队列的清空状态为“启动清空”时,利用配置的清空引擎将第一队列内的包描述符清空并回收。

本发明实施例中的出队处理器在进行队列清空时,无需考虑队列的优先级,利用配置的清空引擎进行队列清空,可以保证队列的清空完成时间,进而提高队列清空能力。

该出队处理器的实施可以参见图5所示的方法实施例,重复之处不再赘述。

本发明实施例的方法中的步骤可以根据实际需要进行顺序调整、合并和删减。

本发明实施例终端或设备中的单元或子单元可以根据实际需要进行合并、划分和删减。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,比如,该程序可以存储于一计算机可读存储介质中,由处理器调用完成。所述存储介质包括只读存储器(Read-Only Memory,ROM)、随机存储器(Random Access Memory,RAM)、可编程只读存储器(Programmable Read-only Memory,PROM)、可擦除可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)、一次可编程只读存储器(One-time Programmable Read-Only Memory,OTPROM)、电子抹除式可复写只读存储器(Electrically-Erasable Programmable Read-Only Memory,EEPROM)、只读光盘(Compact Disc Read-Only Memory,CD-ROM)或其他光盘存储器、磁盘存储器、磁带存储器、或者能够用于携带或存储数据的计算机可读的任何其他介质。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以所述权利要求的保护范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1