具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
一个实施例:
图1为本申请实施例提供的一种队列调度方法的流程示意图。
在进行调度前,预先将待调度范围内的所有子调度单元依次设置有编号,并且在待调度范围内预先选取起始指针的初始位置和尾指针的初始位置。
如图1所示,该方法包括以下步骤:
S100:选取调度指针的位置,并将当前调度指针所在位置的子调度单元中的队列输出一次。
在选取调度指针时,选取位于当前起始指针位置与尾指针位置之间、且沿起始指针位置指向尾指针位置方向上第一个有效的子调度单元的位置作为当前调度指针的位置。
这里当前起始指针位置与尾指针位置之间是包括当前起始指针和当前尾指针,即如果当前起始指针位置的子调度单元是有效的,那么第一次选取调度指针时,就会选择当前起始指针位置作为调度指针的位置,即调度指针与当前起始指针的位置会重合。
S200:根据当前调度指针所在位置的子调度单元的队列长度判断起始指针是否驻留。
这里驻留是指起始指针移动到当前调度指针所在位置,将起始指针移动到当前调度指针所在位置,使得起始指针的位置与当前调度指针的位置相重合,那么在下一次选取调度指针时,根据上述选取调度指针的方法,将会仍然选取当前调度指针的位置为下一次调度指针的位置,即通过判断起始指针是否驻留,就可以判断出是否需要对当前指针位置所在的子调度单元进行重复调度。
当该步骤中判断起始指针驻留时,进行S300;当该步骤中判断起始指针不驻留时,进行S400。
S300:将起始指针的位置移动到当前调度指针所在位置。
在上述S200中已经描述了,驻留的目的是使得起始指针的位置与当前调度指针的位置相重合。而在本申请实施例中,如果当前调度指针的位置与当前起始指针的位置不重合,那么当判断起始指针驻留时,就需要将当前起始指针的位置移动到当前调度指针所在的位置。
另外,如果当前调度指针的位置与当前起始指针的位置是原本就是重合在一起的,那么当判断起始指针驻留时,就可以直接保持当前起始指针的位置不动,而无需移动,当然也可以认为当前起始指针的移动位置是0。
在将起始指针的位置移动后,进行S500。
S400:将起始指针的位置移动到沿起始指针位置指向尾指针位置方向上当前调度指针所在位置后一位子调度单元的位置。
如果判断起始指针不驻留时,即不需要对当前调度指针所在位置的子调度单元进行重复调度,那么就需要沿着始指针的初始位置指向尾指针的初始位置方向上调度下一个子调度单元。
在进行移位时,选择将起始指针的位置移动到当前调度指针位置后移位子调度单元的位置,这样在下一次选取调度指针的位置时,必然将选取当前调度指针之后的子调度单元。
在将起始指针的位置移动后,进行S500。
S500:选取下一个调度指针的位置,并将下一个调度指针所在位置的子调度单元中的队列输出一次。
在选取下一个调度指针的位置时,选取的原则与上述S100中相同,选取移位后始指针位置与尾指针位置之间、且沿移位后起始指针位置指向尾指针位置方向上第一个有效的子调度单元作为下一个调度指针的位置。
由于起始指针移位后,起始指针的位置将与当前调度指针的位置重合,所以,选取的下一个调度指针的位置仍然是当前调度指针,即实现了对某一个调度子单元重复调度。
本申请实施例提供的该队列调度方法,在对当前调度指针所在位置的子调度单元进行调度后,会对对当前调度指针所在位置的子调度单元的状态进行判断起始指针是否驻留,当判断起始指针驻留时,再次对当前调度指针所在位置的子调度单元进行调度。即该方法可以根据当前调度指针所在位置的子调度单元的队列长度来确定调度的次数,这样使得在调度时,不再是对每一个子调度单元依次调度,而可以对待调度方位内的某一个子调度单元有针对性地多次调度。
因此,本申请实施例提供该队列调度方法,可以根据待调度的子调度单元的队列情况进行灵活调度,以解决现有的采用RR轮询调度时存在的流量抖动、调度不均匀以及由于调度不均匀而导致服务质量变差的问题。
又一个实施例:
在本申请实施例中,为了方便对子调度单元的队列长度进行描述,将待调度范围内所有子调度单元的队列长度用四种状态表示,分别为:第一状态、第二状态、第三状态和第四状态,其中:
第一状态,表示子调度单元为空;第二状态,表示子调度单元有少量报文,存在可能被调空的情况;第三状态,表示子调度单元在无调度反压的情况下可以连续调度;第四状态,表示子调度单元已经溢出。
在实际应用时,除第一状态和第四状态外,其它两种状态的情况可以根据实际情况进行调节。
另外,为了方便对起始指针是否驻留有更加量化的表示,在本申请实施例中,采用驻留参数来指示起始指针是否驻留,具体为:
当驻留参数为第一值时,表示起始指针不驻留;当驻留参数为第二值时,表示起始指针驻留。
图2为本申请实施例提供的判断起始指针是否驻留的详细流程示意图。
如图2所示,判断起始指针是否驻留包括以下步骤:
S201:确定当前调度指针所在位置的子调度单元的状态。
根据当前调度指针所在位置的子调度单元内队列的长度来确定子调度单元的状态。
S202:将驻留参数设置成第一值。
当当前调度指针所在位置的子调度单元的状态为第一状态或第二状态时,将驻留参数设置成第一值;
S203:判断是否第一次调度当前调度指针所在位置的子调度单元。
当当前调度指针所在位置的子调度单元为第三状态时,判断是否第一次调度当前调度指针所在位置的子调度单元。判断是否第一调度当前调度指针所在位置的子调度单元的结果,可以作为是否多次调度当前调度指针所在位置的子调度单元的一种依据。
并且当不是第一次调度时,进行S2031;当是第一次调度时,进行S2032。
S2031:将驻留参数的值设定为第一值。
S2032:根据权重值确定驻留参数的值。
在本申请实施例中,如图3所示,该步骤可以包括:
S301:根据权重值确定一个包括权重值在内的随机数范围,并在随机数范围内随机生成一个随机数;
S302:将随机数的值与权重值进行比较;
S303:当随机数的值小于等于权重值,将驻留参数的值设定为第二值;
S304:当随机数的值大于权重值,将驻留参数的值设定为第一值。
S204:将驻留参数的值设定为第二值,并在调度过程中根据调度反压重新设定驻留参数的值。
当当前调度指针所在位置的子调度单元为第四状态时,将驻留参数的值设定为第二值,并在调度过程中根据调度反压重新设定驻留参数的值。
在本申请实施例中,如图4所示,在调度过程中根据调度反压重新设定驻留参数的值可以包括以下步骤:
S401:将当前调度指针所在位置的子调度单元被调度的次数与预设最大值进行比较,且判断是否出现调度反压。
这里预设最大值小于等于当前子调度单元中调度的最长报文长度与从当前子调度单元调度的最短报文长度的比值。
S402:若当前调度指针所在位置的子调度单元被调度的次数小于预设最大值、且未出现调度反压,根据权重值确定驻留参数的值。
S403:将驻留参数的值设定为第一值。
若当前调度指针所在位置的子调度单元被调度的次数大于等于预设最大值或出现调度反压中有任意一个情况发生时,均将驻留参数的值设定为第一值。
在本申请实施例中,详细描述了如何根据当前调度指针所在位置的子调度单元内的队列长度来确定是否对当前调度指针所在位置的子调度单元进行重复调度。因而可以根据待调度的子调度单元的队列情况进行灵活调度,以解决现有的采用RR轮询调度时存在的流量抖动、调度不均匀以及由于调度不均匀而导致服务质量变差的问题。
又一个实施例:
在上述两个实施例的基础上,当起始指针沿着起始指针指向尾指针方向移动时,最终会出现起始指针与尾指针重合的情况,当起始指针与尾指针重合,本申请实施例提供了另外一种队列调度方法,以便可以重新对待调度范围内所有子调度单元再次进行调度。
图5为本申请实施例提供的另一种队列调度方法的流程示意图。
如图5所示,该队列调度方法还可以包括:
S600:判断起始指针的位置是否与尾指针的位置重合。
上面已经描述了,当起始指针沿着起始指针指向尾指针方向移动时,最终会出现起始指针与尾指针重合的情况,所以在调度过程中,需要判断起始指针是否与尾指针相重合。
S700:当起始指针的位置是否与尾指针的位置重合后,将起始指针移动到起始指针的初始位置。
将起始指针移动到其初始位置,也就意味着可以再次对待调度范围内所有子调度单元进行调度。
本申请实施例提供的该方法,在一次调度完成后,可以将起始指针的位置移动到起始指针的初始位置,进而可以在一次调度完成后,可以再次对所有子调度单元进行调度。
又一个实施例:
图6为本申请实施例提供的一种队列调度系统的结构示意图。
在进行调度前,预先将待调度范围内的所有子调度单元依次设置有编号,并且在待调度范围内预先选取起始指针的初始位置和尾指针的初始位置。
如图6所示,该队列调度系统包括:调度指针位置选取单元1、驻留判断单元2、起始指针移位单元3和输出单元4。
调度指针位置选取单元1用于选取当前起始指针初始位置与尾指针初始位置之间、且沿起始指针位置指向尾指针位置方向上第一个有效的子调度单元的位置作为当前调度指针的位置。
这里当前起始指针位置与尾指针位置之间是包括当前起始指针和当前尾指针,即如果当前起始指针位置的子调度单元是有效的,那么第一次选取调度指针时,就会选择当前起始指针位置作为调度指针的位置,即调度指针与当前起始指针的位置会重合。
驻留判断单元2,用于当调度指针位置选取单元1选取出当前调度指针的位置后,根据当前调度指针所在位置的子调度单元的状态判断起始指针是否驻留。
通过判断起始指针是否驻留,就可以判断出是否需要对当前指针位置所在的子调度单元进行重复调度。
起始指针移位单元3,用于当驻留判断单元判断起始指针驻留时,将起始指针的位置移动到当前调度指针所在位置。
驻留的目的是使得起始指针的位置与当前调度指针的位置相重合。而在本申请实施例中,如果当前调度指针的位置与当前起始指针的位置不重合,那么当判断起始指针驻留时,就需要将当前起始指针的位置移动到当前调度指针所在的位置。
另外,如果当前调度指针的位置与当前起始指针的位置是原本就是重合在一起的,那么当判断起始指针驻留时,就可以直接保持当前起始指针的位置不动,而无需移动,当然也可以认为当前起始指针的移动位置是0。
输出单元4,用于当选取出当前调度指针的位置后,将当前调度指针所在位置的子调度单元的队列输出一次。
该系统对当前调度指针所在位置的子调度单元进行调度后,会对对当前调度指针所在位置的子调度单元的状态进行判断起始指针是否驻留,当判断起始指针驻留时,再次对当前调度指针所在位置的子调度单元进行调度。即该方法可以根据当前调度指针所在位置的子调度单元的队列长度来确定调度的次数,这样使得在调度时,不再是对每一个子调度单元依次调度,而可以对待调度方位内的某一个子调度单元有针对性地多次调度。
又一个实施例:
在本申请实施例中,为了方便对子调度单元的队列长度进行描述,将待调度范围内所有子调度单元的队列长度用四种状态表示,分别为:第一状态、第二状态、第三状态和第四状态,其中:
第一状态,表示子调度单元为空;第二状态,表示子调度单元有少量报文,存在可能被调空的情况;第三状态,表示子调度单元在无调度反压的情况下可以连续调度;第四状态,表示子调度单元已经溢出。
在实际应用时,除第一状态和第四状态外,其它两种状态的情况可以根据实际情况进行调节。
图7为本申请实施例提供的驻留判断单元的结构示意图。
如图7所示,在本申请实施例中,驻留判断单元2包括:状态确定单元21、第一次调度判断单元22、驻留概率计算单元23、驻留参数值设置单元24和驻留参数调整单元25。
状态确定单元21用于确定当前调度指针所在位置的子调度单元的状态。在确定时,根据当前调度指针所在位置的子调度单元内队列的长度来确定子调度单元的状态。
第一次调度判断单元22,用于判断是否第一次调度当前调度指针所在位置的子调度单元。判断是否第一调度当前调度指针所在位置的子调度单元的结果,可以作为是否多次调度当前调度指针所在位置的子调度单元的一种依据。
驻留概率计算单元23,用于根据权重值确定起始指针的是否驻留在当前起始指针的位置。
在本申请实施例中,如图8所示,该驻留计算单元23可以包括:随机数生成单元31、第二比较单元32和驻留概率计算子单元33,其中:
随机数范围生成单元31,用于根据权重值确定一个包括权重值在内的随机数范围,并在随机数范围内随机生成一个随机数;
第二比较单元32用于将随机数的值与权重值进行比较;
驻留概率计算子单元33用于根据第二比较单元32的比较结果计算起始指针是否驻留,当随机数的值小于等于权重值,表示起始指针驻留;当随机数的值大于权重值,表示起始指针不驻留。
驻留参数值设置单元23用于当当前调度指针所在位置的子调度单元的状态为第一状态或第二状态时,将驻留参数设置成第一值;
当当前调度指针所在位置的子调度单元为第三状态时,且不是第一次调度时,将驻留参数的值设定为第一值;
当当前调度指针所在位置的子调度单元为第三状态时,且是第一次调度时,根据驻留概率计算单元的计算结果将驻留参数设置成第一值或第二值;
当当前调度指针所在位置的子调度单元为第四状态时,将驻留参数的值设定为第二值。
驻留参数调整单元25用于当当前调度指针所在位置的子调度单元为第四状态时,且将驻留参数的值设定为第二值,在调度过程中根据调度反压重新设定驻留参数的值。
在本申请实施例中,如图9所示,驻留参数调整单元24可以包括:第一比较单元41和调度反压检测单元42,其中:
第一比较单元41用于将当前调度指针所在位置的子调度单元被调度的次数与预设最大值进行比较;
调度反压检测单元42用于检测在调度过程中是否出现反压
当当前调度指针所在位置的子调度单元被调度的次数小于预设最大值、且未出现调度反压,驻留参数值设置单元24根据驻留概率计算单元23的计算结果将驻留参数设置成第一值或第二值,否则将驻留参数的值设定为第一值。
这里预设最大值小于等于当前子调度单元中调度的最长报文长度与从当前子调度单元调度的最短报文长度的比值。
又一个实施例:
在上述两个实施例的基础上,当起始指针沿着起始指针指向尾指针方向移动时,最终会出现起始指针与尾指针重合的情况,当起始指针与尾指针重合,本申请实施例提供了另外一种队列调度方法,以便可以重新对待调度范围内所有子调度单元再次进行调度。
图10为本申请实施例提供的另一种队列调度系统的结构示意图。
如图10所示,该队列调度系统还可以包括:位置判断单元5和初始化单元6,其中:
位置判断单元5用于判断起始指针的位置是否与尾指针的位置重合。上面已经描述了,当起始指针沿着起始指针指向尾指针方向移动时,最终会出现起始指针与尾指针重合的情况,所以在调度过程中,需要判断起始指针是否与尾指针相重合。
初始化单元6用于当起始指针的位置是否与尾指针的位置重合后,将起始指针移动到起始指针的初始位置。将起始指针移动到其初始位置,也就意味着可以再次对待调度范围内所有子调度单元进行调度。
本申请实施例提供的该系统,在一次调度完成后,可以将起始指针的位置移动到起始指针的初始位置,进而可以在一次调度完成后,可以再次对所有子调度单元进行调度。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本申请的优选实施方式,使本领域技术人员能够理解或实现本申请。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。