概览
Zircon 调度器是一种混合调度器,同时支持公平和截止时间调度规范。它在每个逻辑 CPU 上独立运行,管理自己的运行队列集,并通过处理器间中断 (IPI) 与其他 CPU 协调。
调度器的主要目标是在竞争线程之间共享 CPU 带宽,同时保证关键工作负载(例如音频、图形和高频传感器)的时序要求。
调度规范
公平调度
公平调度是系统中通用工作负载的主要调度规范。它会在竞争线程之间分配 CPU 带宽,以便每个线程在一段时间内获得加权比例的 CPU。
- 基于权重的分配:为每个线程分配一个权重。权重是另一个线程两倍的线程会获得大约两倍的 CPU 时间。
- 虚拟时间轴:根据虚拟完成时间,以平衡二叉树(WAVL 树)的形式对就绪线程进行排序。权重较高的线程会排在前面,但权重较低的线程也能保证及时执行,以防止出现饥饿和无界优先级倒置。
- 调度周期:调度周期会根据竞争线程的数量进行调整。如果过多的线程争用,则周期会延长,以确保每个线程至少获得一个最小粒度切片,从而提高吞吐量。
如需详细了解公平调度算法的数学原理和排序条件,请参阅公平调度器机制。
截止时间调度
对于需要严格的时间保证且在过载情况下不得参与比例减速的延迟关键型任务,支持截止时间调度。
- 保证:截止时间任务指定了容量(CPU 时间)和截止时间(周期)。如果总体截止期限需求可行,调度器会保证任务在截止期限内获得其容量。
- 优先级:截止时间任务的优先级始终高于符合条件的公平任务。
- 过载响应:为确保所有截止时间任务都能在预期的时间段内进行调度,截止时间需求的总和不得超过处理器的容量。如果处理器的总截止期限需求超过 100%,则预计会出现随机截止期限未命中情况,并且系统会表现得好像某些或所有任务的周期都乘以了过载系数。
运行队列和选择
每个 CPU 维护两个主要运行队列,这两个队列以增强型 WAVL 树实现,以满足高效的 O(log n) 操作:
- 截止时间运行队列:包含可运行的截止时间任务。
- 公平运行队列:包含可运行的公平任务。
线程选择
在选择要运行的下一个线程时,调度程序会按以下顺序评估队列:
- 截止期限任务:选择完成时间最早的符合条件的截止期限任务。
- 公平任务:选择具有最早虚拟完成时间的符合条件的公平任务。
- 空闲/电源线程:在没有其他符合条件的线程时运行。
抢占和时间片
调度程序会根据所选线程的时间片或截止时间任务的到达情况设置 CPU 本地抢占计时器。当计时器触发时,当前线程上的执行会停止,调度程序会重新评估哪个线程最适合接下来运行。
CPU placement and migration
调度程序会根据多种因素执行负载均衡和任务放置,以优化性能和散热效率。
展示位置条件
当线程唤醒或解除阻塞时,调度程序会根据以下因素选择目标 CPU:
- 关联性:线程的用户定义 CPU 关联性掩码优先。
- 最后一个 CPU:在最后一个 CPU 上运行有助于保持缓存热度(集群内亲和性)。
- 空闲状态:如果核心避免了繁忙 CPU 的上下文切换开销,则优先级很高。
工作窃取
为了保持负载平衡,没有符合条件的工作的 CPU 会尝试从其他繁忙的 CPU 窃取工作。
- 集群感知:调度器会感知 CPU 拓扑。CPU 窃取会优先考虑本地集群而非远程集群,以充分利用更好的共享缓存性能水平并减少迁移惩罚。
电源和能源意识
调度器使用本地能耗模型和功率级控制来优化能耗和热性能。
- 性能缩放:在预算计算中考虑各个 CPU 性能倍增器。
- 动态电压和频率调节 (DVFS):调整处理器工作负载,支持用户定义的限制,同时努力满足截止时间安排。