加权轮询算法

加权轮询（ Weighted round robin ）是网络中用于调度数据流的算法，也可用于调度进程。 加权轮询是轮询调度的一般化。加权轮询在队列或一系列任务上循环，每个轮次中各数据包或进程按权重获得运行机会。 加权轮询有若干种类，比如经典加权轮询和交替加权轮询。 下面以网络调度程序为例介绍加权轮询。 假设有 n {\displaystyle n} 个输入队列 q 1 , . . . , q n {\displaystyle q_{1},...,q_{n}} 。每个队列 q i {\displaystyle q_{i}} 的权重是一个正整数 w i {\displaystyle w_{i}} 。使用加权轮询时，队列运行过程有周期性。在每个周期中，队列 q i {\displaystyle q_{i}} 有 w i {\displaystyle w_{i}} 次发送机会。 不同的加权轮询算法的区别是在一个周期中如何分配机会。 采用经典加权轮询算法时，调度程序会在队列间循环。轮到队列 q i {\displaystyle q_{i}} 时，调度程序开始发送数据包，直到发出 w i {\displaystyle w_{i}} 个数据包或遇到队尾为止。 令 w m a x = max { w i } {\displaystyle w_{max}=\max\{w_{i}\}} 为所有队列中的最大权重。在交替加权轮询算法中，每个周期分为 w m a x {\displaystyle w_{max}} 轮。第 r {\displaystyle r} 轮中，如果 r ≤ w i {\displaystyle r\leq w_{i}} ，队列i可以发送一个数据包。 假设一个系统有三个队列 q 1 , q 2 , q 3 {\displaystyle q_{1},q_{2},q_{3}} , 其各自的权重 w 1 = 5 , w 2 = 2 , w 3 = 3 {\displaystyle w_{1}=5,w_{2}=2,w_{3}=3} 。第一个队列中有7个数据包A，B，C，D，E，F，G，第二队列中为3个数据包U，V，W，第三个队列中有两个数据包X，Y。且不会有新数据包到达。 如果使用经典加权轮询算法，在第一个周期中，调度程序首先选择 q 1 {\displaystyle q_{1}} 并传送位于队列头部的A，B，C，D，E（因为 w 1 = 5 {\displaystyle w_{1}=5} ），然后选择第二个队列 q 2 {\displaystyle q_{2}} ，传送队列开头的U，V（因为 w 2 = 2 {\displaystyle w_{2}=2} ），最后选择第三个队列，该队列的权重等于3，然而该队列一共只有两个数据包，因此传输X，Y 。在Y的传输完毕后，第二个周期开始，先是发送 q 1 {\displaystyle q_{1}} 中的F，G，然后是 q 2 {\displaystyle q_{2}} 中的W。 如果使用交替加权轮询算法，第一个周期分为5轮。第一轮（r = 1），每个队列发送一个数据包（A，U，X），第二轮（r = 2），每个队列再发送一个数据包（B，V，Y），第三轮（r = 3），仅排队 q 1 , q 3 {\displaystyle q_{1},q_{3}} 被允许发送数据包（ w 1 >= r {\displaystyle w_{1}>=r} ， w 2 < r {\displaystyle w_{2}<r} 和 w 3 >= r {\displaystyle w_{3}>=r} ），但由于 q 3 {\displaystyle q_{3}} 为空，只有来自 q 1 {\displaystyle q_{1}} 的C被发送，在第四和第五轮，只有D，E从 q 1 {\displaystyle q_{1}} 被发送。然后开始第二个周期，依次发送F，W，G。 与数据包调度类似，加权轮询完成任务或进程调度时： n {\displaystyle n} 个现行任务以循环方式安排，每个任务 τ i {\displaystyle \tau _{i}} 得到 w i {\displaystyle w_{i}} 份的处理器时间 。 调度数据包时，如果所有数据包都具有相同的大小，则WRR是通用处理器共享算法的近似：长期来看，队列 q i {\displaystyle q_{i}} 将占据 w i ∑ j = 1 n w j {\displaystyle {\frac {w_{i}}{\sum _{j=1}^{n}w_{j}}}} 的带宽（假设所有队列均处于现行状态）。 如果数据包长度可变，则每个队列接收的带宽部分不仅取决于权重，还取决于数据包大小。 如果队列 q i {\displaystyle q_{i}} 的平均数据包大小是 s i {\displaystyle s_{i}} ，则每个队列将获得的长期带宽份额等于 s i × w i ∑ j = 1 n s j × w j {\displaystyle {\frac {s_{i}\times w_{i}}{\sum _{j=1}^{n}s_{j}\times w_{j}}}} 。如果目标是给每个队列 q i {\displaystyle q_{i}} 分配链接容量的 ρ i {\displaystyle \rho _{i}} （ ∑ i = 1 n ρ i = 1 {\displaystyle \sum _{i=1}^{n}\rho _{i}=1} ），则可以设置权重 w i = ρ i s i {\displaystyle w_{i}={\frac {\rho _{i}}{s_{i}}}} 。 Katevenis, M.; Sidgiropoulos, S.; Courcoubetis, C. Weighted round-robin cell multiplexing in a general-purpose ATM switch chip. IEEE Journal on Selected Areas in Communications. 1991, 9 (8): 1265–1279. ISSN 0733-8716. doi:10.1109/49.105173.  Chaskar, H.M.; Madhow, U. Fair scheduling with tunable latency: A round-robin approach. IEEE/ACM Transactions on Networking. 2003, 11 (4): 592–601. ISSN 1063-6692. doi:10.1109/TNET.2003.815290.  Brahimi, B.; Aubrun, C.; Rondeau, E. Modelling and Simulation of Scheduling Policies Implemented in Ethernet Switch by Using Coloured Petri Nets: 667–674. 2006. doi:10.1109/ETFA.2006.355373.  Semeria, Chuck. Supporting Differentiated Service Classes: Queue Scheduling Disciplines (PDF) (报告): 15–18. [4 May 2020]. （原始内容存档 (PDF)于2017-08-29）.  Beaulieu, Alain. Real Time Operating Systems -- Scheduling & Schedulers (PDF). Winter 2017 [4 May 2020]. [失效連結] 20190266019  Fall, Kevin. EECS 122, "Introduction to Communication Networks", Lecture 27, "Scheduling Best-Effort and Guaranteed Connections". 29 April 1999 [4 May 2020]. （原始内容存档于2012-07-22）.