1 SP(Strict Priority, 严格优先级)
SP调度会给各个输入队列分配优先级,当高优先级的队列非空时,优先调度高优先级队列。只有当高优先级队列为空时,才有可能调度低优先级的队列。
2 RR(Round Robin, 轮询)
如何理解轮询?所谓‘轮’,是指RR调度中有一个RR指针,每次调度成功后,RR指针就会移动一下,指向下一个队列,而且这个指针是依次循环的,比如从0,1...一直到N,最后又循环到0。所谓'询',就是指每次调度时去看RR指针指向的队列是否可用,如果可用的话,就调度RR指针指向的队列,如果不可用的话,就看下一个队列是否可用。RR调度在芯片设计中比较常见到,它是一种比较公平的调度算法。举个例子:
如上图所示,有4个队列,假设在第T拍以后都没有新的packet进入队列了。RR调度的过程如下:
第T拍:此时RR指针指向queue_0, queue_0里有packet, 因此queue_0赢得仲裁,p0被调度出来,同时RR指针更新,指向下一个queue,也就是queue_1;
T+1拍:RR指针指向queue_1,但queue_1为空,指针+1后指向queue_2,queue_2有packet,queue_2赢得仲裁,p2被调度出来,指针+1指向queue_3;
T+2拍:queue_3赢得仲裁,p4被调度出来,指针+1指向queue_0;
T+3拍:queue_0赢得仲裁,p1被调度出来,指针+1指向queue_1;
T+4拍:queue_2赢得仲裁,p3被调度出来,指针+1指向queue_3。
3 WRR(Weight Rounf Robin, 带权重的轮询)
WRR是在RR调度的基础上,为各个调度源加入了权重(weight)。各个队列的weight一般都是可配置的,也就是说软件可以较为灵活的分配各个队列的权重。可以认为RR调度是各个队列权重都为1的WRR。WRR中的每个队列都对应有一个weight counter, weight counter在复位以后都被赋予初始值,这个初始值就是软件分配的权重值。一旦某个队列赢得一次仲裁后,其对应的weight counter就减一,当所有队列的weight counter都为0后,所有的weight counter又被赋予初始值。调度流程与RR原理类似,都是基于RR指针的轮询,当RR指针指向某一个队列时,队列赢得仲裁的条件是队列可用(非空)且其对应的weight counter不为0。
未完待续……