4、经典调度算法:轮询调度(RR)、最大载干比调度(Max C/I)、比例公平调度(PF)

各位同学,今天我们来聊聊无线资源调度里最经典的三个算法。说实话,这三个算法我用了十几年,从3G时代一直跟到5G,每次项目里遇到调度器设计,脑子里第一个跳出来的就是它们仨。

你想想看,基站手里有那么多无线资源——时隙、频点、功率,到底该分给谁?分多少?这就是调度算法要干的事。我见过不少刚入行的工程师,一上来就追求复杂的算法,结果系统跑起来反而卡顿。其实,把这三个经典算法吃透了,大部分场景都能应付。

4.1 轮询调度(Round Robin, RR)

轮询调度,说白了就是「轮流来」。每个用户排好队,一人一个机会,谁也不多拿,谁也不少拿。

核心思想: 公平至上。所有用户按顺序循环分配资源,不考虑信道质量好坏。

算法伪代码:

初始化:用户列表 U = {u1, u2, ..., uN}
当前指针 ptr = 0

每个调度周期:
  选择用户 u = U[ptr]
  分配资源给 u
  ptr = (ptr + 1) % N

优点:

  • 实现简单,几乎零计算开销
  • 绝对公平,用户间无饥饿现象
  • 适合用户数少、信道变化不大的场景

缺点:

  • 系统吞吐量低——信道好的用户和差的用户拿一样多资源
  • 不利用多用户分集增益

我的经验: 我在一个物联网项目中用过RR。当时终端数量少(不到50个),每个终端上报的数据量也小。RR跑起来非常稳,调试也省心。但后来终端数涨到200,RR就开始吃力了——信道差的终端占着资源不放,整体时延上去了。

4.2 最大载干比调度(Max C/I)

Max C/I,也叫最大信干比调度。这个算法的逻辑很直接:谁的信道质量好,资源就给谁。

核心思想: 在每个调度时刻,选择当前信道条件最好的用户,把资源全部给他。

算法伪代码:

每个调度周期:
  测量所有用户的 C/I 值
  选择用户 u* = argmax(C/I_u)
  分配全部资源给 u*

优点:

  • 系统吞吐量最大化——资源永远给「跑得最快」的人
  • 充分利用多用户分集增益

缺点:

  • 极度不公平——信道差的用户可能永远拿不到资源
  • 存在严重的「饥饿」问题,边缘用户基本被放弃

避坑指南: 我曾经在一个高铁覆盖项目中试过Max C/I。结果呢?靠近基站的用户下载速度飞起,但车厢尾部的用户几乎连不上网。用户投诉电话打爆了运维部门。后来我学乖了——纯Max C/I只适合对公平性没要求的场景,比如某些专用网络。

4.3 比例公平调度(Proportional Fair, PF)

比例公平调度,可以说是RR和Max C/I的「中和版」。它既想要吞吐量,又想要公平性。

核心思想: 在「信道质量」和「历史服务量」之间做权衡。信道好但很久没被服务的用户,优先级会提高。

算法伪代码:

每个调度周期:
  对每个用户 u,计算优先级:
    P_u = (当前速率 R_u) / (历史平均速率 T_u)
  选择用户 u* = argmax(P_u)
  分配资源给 u*
  更新历史平均速率:
    T_u = (1 - α) * T_u + α * 当前分配速率

这里 α 是遗忘因子,控制历史速率的更新速度。α 越大,算法越「健忘」,越接近Max C/I;α 越小,算法越「记仇」,越接近RR。

优点:

  • 兼顾吞吐量和公平性——实际系统中用得最多
  • 用户间不会出现长期饥饿
  • 能自适应信道变化

缺点:

  • 参数调优需要经验——α 设不好,性能还不如RR
  • 计算复杂度比RR高,需要维护历史速率

我的建议: 如果你刚开始做调度器设计,我建议先从PF入手。我在LTE基站项目里,PF的α值一般设在0.01到0.1之间。信道变化快的场景(比如高速移动),α取大一点;信道稳定的场景(比如室内),α取小一点。嗯,这个经验值是我调了无数次才试出来的。

4.4 算法性能对比

我把三个算法的核心指标整理成了一张表,方便你对比:

指标 RR Max C/I PF
系统吞吐量 最高 较高
公平性 最高 最低 较高
实现复杂度 极低 中等
用户饥饿风险
多用户分集增益 充分利用 部分利用
适用场景 用户少、信道稳定 专用网络、对公平无要求 大多数蜂窝网络

4.5 核心逻辑框架图

下面这张SVG图,展示了三个算法在「公平性」和「吞吐量」两个维度上的定位,以及它们之间的演进关系:

经典调度算法核心逻辑框架 吞吐量 → ↑ 公平性 RR 公平性最高 Max C/I 吞吐量最高 PF 兼顾两者 增加吞吐量 牺牲公平性 三个算法在公平性与吞吐量之间的权衡

4.6 适用场景总结

说了这么多,到底什么时候用哪个?我根据自己的项目经验,给你几个参考:

  • RR: 适合用户数少(比如<50)、信道条件差异不大的场景。比如智能抄表、工业传感器网络。我做过一个智慧农业项目,传感器都在同一片田里,信道条件差不多,RR就够用了。
  • Max C/I: 适合对吞吐量要求极高、不在乎公平性的场景。比如基站回传链路、某些专用数据采集系统。但注意,千万别用在公众移动通信网里,否则投诉率会让你怀疑人生。
  • PF: 适合大多数蜂窝网络场景。LTE、5G NR的默认调度器基本都是PF的变种。我建议你把它作为「默认选项」,除非你有明确的理由换别的。

最后提醒一句: 算法选型没有银弹。我在一个项目中试过PF,结果发现某些用户因为移动速度太快,历史速率更新跟不上,反而比RR还差。后来我加了速度自适应参数,才解决问题。所以,理解原理之后,一定要结合实际场景做微调。


公众号:蓝海资料掘金营,微信deep3321