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图,展示了三个算法在「公平性」和「吞吐量」两个维度上的定位,以及它们之间的演进关系:
4.6 适用场景总结
说了这么多,到底什么时候用哪个?我根据自己的项目经验,给你几个参考:
- RR: 适合用户数少(比如<50)、信道条件差异不大的场景。比如智能抄表、工业传感器网络。我做过一个智慧农业项目,传感器都在同一片田里,信道条件差不多,RR就够用了。
- Max C/I: 适合对吞吐量要求极高、不在乎公平性的场景。比如基站回传链路、某些专用数据采集系统。但注意,千万别用在公众移动通信网里,否则投诉率会让你怀疑人生。
- PF: 适合大多数蜂窝网络场景。LTE、5G NR的默认调度器基本都是PF的变种。我建议你把它作为「默认选项」,除非你有明确的理由换别的。
最后提醒一句: 算法选型没有银弹。我在一个项目中试过PF,结果发现某些用户因为移动速度太快,历史速率更新跟不上,反而比RR还差。后来我加了速度自适应参数,才解决问题。所以,理解原理之后,一定要结合实际场景做微调。
公众号:蓝海资料掘金营,微信deep3321