一种先入先出队列调度方法及装置制造方法

文档序号:7811634阅读:141来源:国知局
一种先入先出队列调度方法及装置制造方法
【专利摘要】本发明公开了一种先入先出队列调度方法和装置,本发明方案未使用自旋锁,以原子操作读取FIFO队列的当前头计数H和尾计数T,在原子比较交换函数中完成判断是否有其它核执行入队或出队操作及实际入队或出队计数的计数操作。本发明中,需要多核互斥操作的保护代码段的范围很小,没有多核加锁和解锁的开销,能够提高多核设备对FIFO队列的调度效率。
【专利说明】一种先入先出队列调度方法及装置

【技术领域】
[0001]本发明涉及数据通信领域,特别涉及一种先入先出(First In First Out, FIFO)队列调度方法及装置。

【背景技术】
[0002]FIFO队列是数据通信设备支持的最基本的一种队列形式,采用单独队列的形式,可以缓存多个数据报文,队列长度通常可配置,数据报文以先进先出的方式完成队列调度。
[0003]目前,在现有多核系统中实现FIFO队列,通常以自旋锁(spinlock)的方式完成入、出队的调度,以自旋锁方式实现FIFO队列的调度时,多个核心以抢占模式互斥执行队列入队和出队,以入队为例,当某个核执行入队操作时,会尝试对入队操作加锁,如果加锁成功,则在加锁成功到报文入队完成的整个过程中,其他核不能并发执行入队操作,只能等待入队操作解锁后,其它的核心才能通过抢夺入队锁的方式执行入队操作,因此在自旋锁模式下,入队出队操作仍然类似于单线程模式,其本质仍然是一个生产者,一个消费者的模型,入队和出队的过程不能并发。并且,由于多核自旋锁自身加锁、解锁的CPU开销较大,降低了 CPU处理性能。
[0004]另外,多核自旋锁以自旋的方式等待,队列入队、出队的过程都在临界区中,执行互斥保护的程序代码段范围较大,无法充分发挥多核并发的优势。
[0005]可见,多核系统中以自旋锁方式实现FIFO队列,对队列的调度性能有较大影响。


【发明内容】

[0006]有鉴于此,本发明实施例的目的之一在于提出一种队列调度方法,用于解决多核设备采用自旋锁实现FIFO队列调度时,加解锁开销大,多核并发处理性能较差的计数问题。
[0007]进一步来讲,该方法包括:
[0008]在报文入队时:以原子读操作获取队列尾计数T赋值给缓存变量Tcur,当判定当前队列未满时,在原子比较交换函数中判断当前的队列尾计数T是否等于所述缓存变量Tcur,若相等,则在所述原子比较交换函数中将当前队列尾计数T指向下一待入队位置,若不相等,则所述原子比较交换函数直接返回当前的队列尾计数T的值;判断函数返回值与所述缓存变量Tcur值是否相等,若相等则以所述缓存变量Tcur对队列总长度S取余所得值作为入队位置执行报文入队操作;若不相等则返回所述以原子读操作获取队列尾计数T赋值给缓存变量Tcur的步骤,再次执行上述入队步骤;
[0009]在报文出队时:以原子读操作获取队列头计数H赋值给缓存变量Hcur,当判定当前队列不为空时,在原子比较交换函数中判断当前队列头计数H是否等于所述缓存变量Hcur,若相等,则在所述原子比较交换函数中将当前队列头计数H指向下一待出队位置,若不相等,则所述原子比较交换函数直接返回当前队列头计数H的值;判断函数返回值与所述缓存变量Hcur,若相等则以所述缓存变量Hcur对队列总长度S取余所得值作为出队位置执行报文出队操作;若不相等则返回到所述以原子读操作获取队列头计数H赋值给缓存变量Hcur的步骤,再次执行上述出队步骤;
[0010]其中,所述队列尾计数T和队列头计数H为原子变量。
[0011 ] 在一些实施例中,所述队列总长度S大于等于队列配置长度L与核数N之和,所述队列配置长度L为预配置的队列缓存报文的最大数目,所述核数N为多核设备的处理器核心数目。
[0012]在一些实施例中,所述在报文入队时,判断当前队列未满的方法为:判断缓存变量Tcur减去所述变量队列头计数H与队列配置长度L之和是否小于0,小于O表示队列未满,否则表示队列已满。
[0013]在一些实施例中,所述在报文出队时,判断当前队列不为空的方法为:以Hcur减去队列尾计数T,当差值小于O时表示队列不为空,否则表示队列为空。
[0014]在一些实施例中,所述队列通过队列头计数H和队列尾计数T在达到其表达范围上限后的回绕实现队列存储空间的循环使用。
[0015]本发明实施例的另一目的在于提出一种先入先出队列调度装置,该装置包括入队模块和出队模块;
[0016]所述入队模块包括:
[0017]入队预处理单元,用于以原子读操作获取队列尾计数T赋值给缓存变量Tcur,及判断当前队列是否已满,在队列未满时指令原子比较交换单元执行;
[0018]入队原子比较交换单元,用于执行入队原子比较交换函数,在入队原子比较交换函数中判断当前的队列尾计数T是否等于所述缓存变量Tcur,若相等,则在所述入队原子比较交换函数中将当前队列尾计数T指向下一待入队位置,若不相等,则所述入队原子比较交换函数直接返回当前的队列尾计数T的值;
[0019]入队判断单元,用于判断所述入队原子比较交换函数的返回值与所述缓存变量Tcur值是否相等,若相等则指令入队单元执行,否则指令预处理单元再次执行;
[0020]入队单元,用于以所述缓存变量Tcur对队列总长度S取余所得值作为入队位置执行报文入队操作;
[0021]所述出队模块包括:
[0022]出队预处理单元,用于以原子读操作获取队列头计数H赋值给缓存变量Hcur,以及判断当前队列是否为空,若不为空则指令出队原子比较交换单元执行;
[0023]出队原子比较交换单元,用于执行出队原子比较交换函数,在出队原子比较交换函数中判断当前队列头计数H是否等于所述缓存变量Hcur,若相等,则在所述出队原子比较交换函数中将当前队列头计数H指向下一待出队位置,若不相等,则所述出队原子比较交换函数直接返回当前队列头计数H的值;
[0024]出队判断单元,用于判断出队原子比较交换函数返回值与所述缓存变量Hcur,若相等则指令出队单元执行,否则指令出队预处理单元执行再次执行;
[0025]出队单元,用于以所述缓存变量Hcur对队列总长度S取余所得值作为出队位置执行报文出队操作;
[0026]其中,所述队列尾计数T和队列头计数H为原子变量。
[0027]在一些实施例中,所述队列总长度S大于等于队列配置长度L与核数N之和,所述队列配置长度L为预配置的队列缓存报文的最大数目,所述核数N为多核设备的处理器核心数目。
[0028]在一些实施例中,所述入队预处理单元判断当前队列是否已满的方法为:判断缓存变量Tcur减去所述变量队列头计数H与队列配置长度L之和是否小于0,小于O表示队列未满,否则表示队列已满。
[0029]在一些实施例中,所述出队预处理单元判断判断当前队列是否为空的方法为:以Hcur减去队列尾计数T,当差值小于O时表示队列不为空,否则表示队列为空。
[0030]在一些实施例中,所述入队原子比较交换单元和所述出队原子比较交换单元通过队列头计数H和队列尾计数T在达到其表达范围上限后的回绕实现队列存储空间的循环使用。
[0031]相对于现有技术,本发明具有以下优势:
[0032]本发明方案未使用自旋锁,以原子操作读取FIFO队列的当前头计数H和尾计数T,在原子比较交换函数中完成判断是否有其它核执行入队或出队操作及实际入队或出队计数的计数操作。本发明中,需要多核互斥操作的保护代码段的范围很小,没有多核加锁和解锁的开销,能够提高多核设备对FIFO队列的调度效率。

【专利附图】

【附图说明】
[0033]构成本发明实施例一部分的附图用来提供对本发明实施例的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
[0034]图1为本发明实施例提供的一种多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度方法所使用的队列数据结构示意图;
[0035]图2为本发明实施例提供的一种多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度方法中的报文入队方法流程图;
[0036]图3为本发明实施例提供的一种多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度方法中的报文出队方法流程图;
[0037]图4为本发明实施例提供的一种多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度装置结构示意图。

【具体实施方式】
[0038]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0039]需要说明的是,在不冲突的情况下,本发明实施例及实施例中的特征可以相互组口 ο
[0040]下面结合附图,对本发明的各优选实施例作进一步说明:
[0041]图1为本发明实施例提供的多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度方法所使用的队列数据结构示意图,在本发明一实施例中,队列数据结构采用数组结构,每个数组单元为一个报文指针,指向实际存储报文的内存单元,本发明不限定该队列的数据结构,任意能够实现本发明方法的数据结构都应包括在本发明的保护范围之内,例如也可以采用链表结构。如图1所示,其中:
[0042]队列配置长度L:为队列需要缓存报文的最大报文数目,可以根据系统参数进行配置,为大于等于I的正整数。由于队列受到系统资源的限制,不能无限缓存报文,需要有一个缓存上限,该上限即为缓存的最大报文数目,该值在各设备中可以是不一样的,本发明不做具体限定。
[0043]核数N:为多核设备的处理器核心数目,如中央处理单元CPU的数目,该值可从操作系统中获取。
[0044]队列总长度S:为队列总的报文缓冲区大小,即队列总的可缓存报文的个数,由计算所得,大于等于L+N,通常指定为L+N。
[0045]队列头计数H:记录队列中报文头的位置。通常初始化为0,为原子变量,以原子方式执行操作,当达到该变量表达范围上限值时,将会被重置为O。
[0046]队列尾计数T:记录队列中报文尾的位置。通常初始化为0,为原子变量,以原子方式执行操作,当达到该变量表达范围上限值时,将会被重置为O。
[0047]队列缓冲区以头尾计数在达到其表达范围上限后的回绕实现队列存储空间的循环使用,例如T初始化为0,当其为双字节16比特位时,其表达范围为O?65535,当其值超过65535时将被重置为O即实现回绕操作。
[0048]基于上述队列数据结构,本发明实施例提供的一种多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度方法,该方法包括步骤:
[0049]在报文入队时:以原子读操作获取队列尾计数T赋值给缓存变量Tcur,当判定当前队列未满时,在原子比较交换函数中判断当前的队列尾计数T是否等于所述缓存变量Tcur,若相等,则在所述原子比较交换函数中将当前队列尾计数T指向下一待入队位置(例如对T做自增操作),若不相等,则所述原子比较交换函数直接返回当前的队列尾计数T的值;判断函数返回值与所述缓存变量Tcur值是否相等,若相等则以所述缓存变量Tcur对队列总长度S取余所得值(即Tcur^S)作为入队位置执行报文入队操作;若不相等则返回所述以原子读操作获取队列尾计数T赋值给缓存变量Tcur的步骤,再次执行上述入队步骤;
[0050]其中,原子比较交换函数中判断当前的队列尾计数T是否等于缓存变量Tcur的目的是判断在执行该原子操作之前,是否有其它核执行了入队操作,从而导致当前的T与之前获得Tcur不同。
[0051]在报文出队时:以原子读操作获取队列头计数H赋值给缓存变量Hcur,当判定当前队列不为空时,在原子比较交换函数中判断当前队列头计数H是否等于所述缓存变量Hcur,若相等,则在所述原子比较交换函数中将当前队列头计数H指向下一待出队位置(例如对H做自增操作),若不相等,则所述原子比较交换函数直接返回当前队列头计数H的值;判断函数返回值与所述缓存变量Hcur,若相等则以所述缓存变量Hcur对队列总长度S取余所得值(即Hcur^ S)作为出队位置执行报文出队操作;若不相等则返回到所述以原子读操作获取队列头计数H赋值给缓存变量Hcur的步骤,再次执行上述出队步骤。
[0052]其中,原子比较交换函数中判断当前的队列尾计数H是否等于缓存变量Hcur的目的是判断在执行该原子操作之前,是否有其它核执行了出队操作,从而导致当前的H与之前获得Hcur不同。
[0053]通过上述步骤可知,本发明实施例提供的队列调度方法中,未使用自旋锁的方式来解决多核并发入队或出队导致调度错误的问题,本发明通过原子变量实现队列头计数H和尾计数T并采用原子操作对其移位计数操作,将入队和出队多核临界区限定在更小的范围内(即原子操作范围内),实现了多生产者多消费者FIFO队列调度模型,能够更大程度的发挥了多核CPU并发的优势,提高数通设备的队列处理性能。
[0054]图2为本发明实施例提供的一种多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度方法中的报文入队方法流程图,假设在该实施例中,当前队列的初始状态为:队列配置长度L为100,核数N为8,队列总长度S (即L+N)为108,队列头计数H为500,队列尾计数T为599,在整个入队过程中,H保持不变。报文入队步骤如下:
[0055]步骤201、以原子读操作获取队列尾计数原子变量T的值,并赋值给缓存变量Tcur ;
[0056]例如当T值为599,通过原子读函数atomic_read(T)读取T的值赋值给Tcur,则Tcur的值为599。
[0057]步骤202、以Tcur减去原子变量队列头计数H与队列配置长度L之和,判断队列是否已满,当差值小于O时表示队列未满,则执行步骤203,否则执行步骤206 ;
[0058]例如当H为500,L为100时,判断Tcur-(H+L)是否小于零,当Tcur为599时,则差值小于零,说明队列未满,否则说明队列已满。
[0059]步骤203、通过原子比较交换函数完成:判断当前队列尾计数T是否等于所述缓存变量Tcur,若相等,则在原子比较交换函数中将队列尾计数T加1,并返回原队列尾计数T的值即加I之前的值给中间变量Told,若不相等,则直接返回当前队列尾计数T的值给中间变量Told。
[0060]本发明实施例中用到原子比较交换函数atomic_cmpxchg(a, b, c),其中a为原子变量,b和c为目标参数。各数通操作系统(包括Linux等)都提供原子变量类型及一组原子变量的操作处理,本发明中在原子比较交换函数中对原子变量a进行的原子变量操作具有原子性,能够保证并发写入原子变量临界区的正确性。
[0061]该原子比较交换函数的功能包括:原子变量a与目标参数b进行比较,若a与b相等,将a交换成目标参数c并返回原原子变量a的值即交换之前的值,若a与b不相等,则直接返回原子变量a的值。该函数过程满足原子性,不可中断。
[0062]例如该步骤执行原子比较交换函数形式为atomic_cmpxchg(T, Tcur, Tcur+1),假设在执行该原子函数时,T = Tcur,则说明在执行该函数前,没有其它核执行了入队操作,则在该原子函数对原子变量T加I (即将Tcur+Ι的值赋值给T),并返回原T的值给Told,例如Tcur为599,T当前也为599时,在该原子函数中T变为600,并函数返回值为599给Told。假设在执行该原子函数时,T fTcur,则说明在执行该函数前,有其他核执行了入队操作,则该原子函数直接返回当前的原子变量T的值给Told,例如Tcur为599,T当前值为600,则该原子函数不对T做任何操作,直接返回600的值给Told。
[0063]步骤204、通过Told和Tcur的比较判断在执行原子比较交换函数时,是否有其他核做入队操作,如果有即Told ? Tcur时,返回步骤201,如果没有即Told = Tcur时,执行步骤205 ;
[0064]步骤205、依据缓存变量Tcur,将缓存变量Tcur对队列总长度S取余后的值作为入队位置执行报文入队操作,流程结束。
[0065]在该步骤中,由于报文实际入队的位置已通过缓存变量Tcur保存了下来,所以在原子比较交换函数之后其他核的入队操作将不会影响当前报文的入队操作。
[0066]步骤206、丢弃报文,结束流程。
[0067]图3本发明实施例提供的一种多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度方法中的报文出队方法流程图,假设在该实施例中,当前队列的初始状态为:队列配置长度L为100,核数N为8,队列总长度S (即L+N)为108,队列头计数H为550,队列尾计数T为600,在整个出队过程中,T保持不变。报文出队步骤如下:
[0068]步骤301、以原子读操作获取队列头计数原子变量H的值,并赋值给缓存变量Hcur ;
[0069]例如当H值为550,通过原子读函数atomic_read(H)读取H的值赋值给Hcur,贝丨JHcur的值为550。
[0070]步骤302、以Hcur减去原子变量队列尾计数T,判断队列是否为空,当差值小于O时表示队列不为空,则执行步骤303,否则结束流程;
[0071]例如当T为600,Hcur为550时,判断Hcur-T小于零,说明队列不为空,可以执行报文出队操作,否则说明队列为空,不能执行报文出队操作。
[0072]步骤303、通过原子比较交换函数完成:判断当前队列头计数H是否等于所述缓存变量Hcur,若相等,则在原子比较交换函数中将队列头计数H加1,并返回原队列头计数H的值即加I之前的值给中间变量Hold,若不相等,则直接返回当前队列头计数H的值给中间变量Hold。
[0073]如该步骤执行原子比较交换函数形式为atomic_cmpxchg(H, Hcur, Hcur+1),假设在执行该原子函数时,H = Hcur,则说明在执行该函数前,没有其它核执行了出队操作,则在该原子函数对原子变量H加I (即将Hcur+1的值赋值给H),并返回原H的值给Hold。假设在执行该原子函数时,H古Hcur,则说明在执行该函数前,有其他核执行了出队操作,则该原子函数直接返回当前的原子变量H的值给Hold。
[0074]步骤304、通过Hold和Hcur的比较判断在执行原子比较交换函数时,是否有其他核做出队操作,如果有即Hold ? Hcur时,返回步骤301,如果没有即Hold = Hcur时,执行步骤305 ;
[0075]步骤305、依据缓存变量Hcur,将缓存变量Hcur对队列总长度S取余后的值作为出队位置执行报文出队操作,流程结束。
[0076]在该步骤中,由于报文实际出队的位置已通过缓存变量Hcur保存了下来,所以在原子比较交换函数之后其他核的出队操作将不会影响当前报文的出队操作。
[0077]以下说明本发明实施例中将S设定为S彡H+L的原因:
[0078]本发明实施例中,步骤303 (P3)为队列头原子变量H操作,步骤305 (P4)为报文实际出队列的操作,在步骤303和305之间,有若干个CPU时钟周期的时间差(和具体的CPU相关,通常在O到20个时钟周期之间),步骤303中对H的操作先完成,步骤305中出队操作后完成。
[0079]本发明实施例中,步骤203(P1)为队列尾原子变量T操作,步骤205 (P2),P2为实际的报文入队列的操作,在步骤203和205之间,有若干个CPU时钟周期的时间差(和具体的CPU相关,通常在O到20个时钟周期之间),步骤203中T的操作先完成,步骤205中入队操作后完成。
[0080]如果没有S彡L+N的限制,而是S = L,那么存在如下问题:
[0081]当队列已满时即(H等于T时),假设有两个CPU,CPUl执行出队(步骤303和305),CPU2执行入队(步骤203和步骤205),在绝对时间上以步骤303 —步骤203 —步骤205 —步骤305的顺序来完成出队和入队的操作。
[0082]则CPUl执行步骤303过程后,H已释放一个缓存空间,CPU2满足了入队条件,执行步骤203,随后执行步骤205,这样CPUl的步骤305报文出队列实际出了 CPU2在步骤205中入队的报文,导致调度错误。
[0083]队列缓存区提供了额外的CPU个数的扩展缓冲区(即队列缓冲区总长度S大于等于队列配置长度L+核数N),这样即便所有的CPU同时并发,也能够避免队列尾原子变量T计算的队列缓冲区的入队计数(即T%S)回绕到队列头原子变量H计算的队列缓冲区的出队计数(H% S) 0
[0084]本发明实施例通过原子变量及其操作,将入队和出队多核临界区限定在更小的范围内(原子操作范围内),实现了多生产者多消费者FIFO队列调度模型,能够更大程度的发挥了多核CPU并发的优势,提高数通设备的队列处理性能。
[0085]基于上述方法实施例,本发明实施例还提供一种多核系统下无自旋锁的支持多生产者多消费者的FIFO队列调度装置,其结构示意图如图4所示:
[0086]基于与上述方法实施例相同的原理,本发明实施例还提供一种先入先出队列调度装置,该装置的功能模块结构示意图如图4所示,该装置400包括:入队模块410和出队模块 420 ;
[0087]入队模块410包括:
[0088]入队预处理单元411,用于以原子读操作获取队列尾计数T赋值给缓存变量Tcur,及判断当前队列是否已满,在队列未满时指令原子比较交换单元执行;
[0089]入队原子比较交换单元412,用于执行入队原子比较交换函数,在入队原子比较交换函数中判断当前的队列尾计数T是否等于所述缓存变量Tcur,若相等,则在所述入队原子比较交换函数中将当前队列尾计数T指向下一待入队位置,若不相等,则所述入队原子比较交换函数直接返回当前的队列尾计数T的值;
[0090]入队判断单元413,用于判断所述入队原子比较交换函数的返回值与所述缓存变量Tcur值是否相等,若相等则指令入队单元执行,否则指令预处理单元再次执行;
[0091]入队单元414,用于以所述缓存变量Tcur对队列总长度S取余所得值作为入队位置执行报文入队操作;
[0092]出队模块420包括:
[0093]出队预处理单元421,用于以原子读操作获取队列头计数H赋值给缓存变量Hcur,以及判断当前队列是否为空,若不为空则指令出队原子比较交换单元执行;
[0094]出队原子比较交换单元422,用于执行出队原子比较交换函数,在出队原子比较交换函数中判断当前队列头计数H是否等于所述缓存变量Hcur,若相等,则在所述出队原子比较交换函数中将当前队列头计数H指向下一待出队位置,若不相等,则所述出队原子比较交换函数直接返回当前队列头计数H的值;
[0095]出队判断单元423,用于判断出队原子比较交换函数返回值与所述缓存变量Hcur,若相等则指令出队单元执行,否则指令出队预处理单元执行再次执行;
[0096]出队单元424,用于以所述缓存变量Hcur对队列总长度S取余所得值作为出队位置执行报文出队操作;
[0097]其中,所述队列尾计数T和队列头计数H为原子变量。
[0098]队列总长度S大于等于队列配置长度L与核数N之和,队列配置长度L为预配置的队列缓存报文的最大数目,核数N为多核设备的处理器核心数目。
[0099]进一步地,入队预处理单元411判断当前队列是否已满的方法为:判断缓存变量Tcur减去所述变量队列头计数H与队列配置长度L之和是否小于0,小于O表示队列未满,否则表示队列已满。
[0100]进一步地,出队预处理单元421判断当前队列是否为空的方法为:以Hcur减去队列尾计数T,当差值小于O时表示队列不为空,否则表示队列为空。
[0101]进一步地,入队原子比较交换单元412和出队原子比较交换单元422通过队列头计数H和队列尾计数T在达到其表达范围上限后的回绕实现队列存储空间的循环使用。
[0102]显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。所述存储装置为非易失性存储器,如:R0M/RAM、闪存、磁碟、光盘等。
[0103]以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种先入先出队列调度方法,其特征在于,该方法包括: 在报文入队时:以原子读操作获取队列尾计数T赋值给缓存变量Tcur,当判定当前队列未满时,在原子比较交换函数中判断当前的队列尾计数T是否等于所述缓存变量Tcur,若相等,则在所述原子比较交换函数中将当前队列尾计数T指向下一待入队位置,若不相等,则所述原子比较交换函数直接返回当前的队列尾计数T的值;判断函数返回值与所述缓存变量Tcur值是否相等,若相等则以所述缓存变量Tcur对队列总长度S取余所得值作为入队位置执行报文入队操作;若不相等则返回所述以原子读操作获取队列尾计数T赋值给缓存变量Tcur的步骤,再次执行上述入队步骤; 在报文出队时:以原子读操作获取队列头计数H赋值给缓存变量Hcur,当判定当前队列不为空时,在原子比较交换函数中判断当前队列头计数H是否等于所述缓存变量Hcur,若相等,则在所述原子比较交换函数中将当前队列头计数H指向下一待出队位置,若不相等,则所述原子比较交换函数直接返回当前队列头计数H的值;判断函数返回值与所述缓存变量Hcur,若相等则以所述缓存变量Hcur对队列总长度S取余所得值作为出队位置执行报文出队操作;若不相等则返回到所述以原子读操作获取队列头计数H赋值给缓存变量Hcur的步骤,再次执行上述出队步骤; 其中,所述队列尾计数T和队列头计数H为原子变量。
2.根据权利要求1所述的方法,其特征在于,所述队列总长度S大于等于队列配置长度L与核数N之和,所述队列配置长度L为预配置的队列缓存报文的最大数目,所述核数N为多核设备的处理器核心数目。
3.根据权利要求2所述的方法,其特征在于, 所述在报文入队时,判断当前队列未满的方法为:判断缓存变量Tcur减去所述变量队列头计数H与队列配置长度L之和是否小于O,小于O表示队列未满,否则表示队列已满。
4.根据权利要求2所述的方法,其特征在于, 所述在报文出队时,判断当前队列不为空的方法为:以Hcur减去队列尾计数T,当差值小于O时表示队列不为空,否则表示队列为空。
5.根据权利要求2所述的方法,其特征在于, 所述队列通过队列头计数H和队列尾计数T在达到其表达范围上限后的回绕实现队列存储空间的循环使用。
6.一种先入先出队列调度装置,其特征在于,该装置包括入队模块和出队模块; 所述入队模块包括: 入队预处理单元,用于以原子读操作获取队列尾计数T赋值给缓存变量Tcur,及判断当前队列是否已满,在队列未满时指令原子比较交换单元执行; 入队原子比较交换单元,用于执行入队原子比较交换函数,在入队原子比较交换函数中判断当前的队列尾计数T是否等于所述缓存变量Tcur,若相等,则在所述入队原子比较交换函数中将当前队列尾计数T指向下一待入队位置,若不相等,则所述入队原子比较交换函数直接返回当前的队列尾计数T的值; 入队判断单元,用于判断所述入队原子比较交换函数的返回值与所述缓存变量Tcur值是否相等,若相等则指令入队单元执行,否则指令预处理单元再次执行; 入队单元,用于以所述缓存变量Tcur对队列总长度S取余所得值作为入队位置执行报文入队操作; 所述出队模块包括: 出队预处理单元,用于以原子读操作获取队列头计数H赋值给缓存变量Hcur,以及判断当前队列是否为空,若不为空则指令出队原子比较交换单元执行; 出队原子比较交换单元,用于执行出队原子比较交换函数,在出队原子比较交换函数中判断当前队列头计数H是否等于所述缓存变量Hcur,若相等,则在所述出队原子比较交换函数中将当前队列头计数H指向下一待出队位置,若不相等,则所述出队原子比较交换函数直接返回当前队列头计数H的值; 出队判断单元,用于判断出队原子比较交换函数返回值与所述缓存变量Hcur,若相等则指令出队单元执行,否则指令出队预处理单元执行再次执行; 出队单元,用于以所述缓存变量Hcur对队列总长度S取余所得值作为出队位置执行报文出队操作; 其中,所述队列尾计数T和队列头计数H为原子变量。
7.根据权利要求6所述的装置,其特征在于,所述队列总长度S大于等于队列配置长度L与核数N之和,所述队列配置长度L为预配置的队列缓存报文的最大数目,所述核数N为多核设备的处理器核心数目。
8.根据权利要求7所述的装置,其特征在于, 所述入队预处理单元判断当前队列是否已满的方法为:判断缓存变量Tcur减去所述变量队列头计数H与队列配置长度L之和是否小于O,小于O表示队列未满,否则表示队列已满。
9.根据权利要求7所述的装置,其特征在于, 所述出队预处理单元判断判断当前队列是否为空的方法为:以Hcur减去队列尾计数T,当差值小于O时表示队列不为空,否则表示队列为空。
10.根据权利要求7所述的装置,其特征在于, 所述入队原子比较交换单元和所述出队原子比较交换单元通过队列头计数H和队列尾计数T在达到其表达范围上限后的回绕实现队列存储空间的循环使用。
【文档编号】H04L12/863GK104168217SQ201410404736
【公开日】2014年11月26日 申请日期:2014年8月15日 优先权日:2014年8月15日
【发明者】董君 申请人:杭州华三通信技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1