现代多核调度器的本质 调度三重奏

现代多核调度器的核心设计围绕 "调度三重奏"(Scheduling Trio) 展开,即 负载均衡(Load Balancing)任务放置(Task Placement)任务选择(Task Selection) 三个关键机制的协同作用。这三者共同决定了多核系统中任务如何分配、迁移和执行,以实现高性能、低延迟和公平性。


1. 调度三重奏的核心组成

(1) 负载均衡(Load Balancing)

目标 :确保所有 CPU 核心的负载均衡,避免某些核心过载而其他核心闲置。
关键机制

  • 周期性负载检测 (如 Linux 的 scheduler_tick
  • 负载计算 (使用 PELT(Per-Entity Load Tracking)或 WALT(Window-Assisted Load Tracking))
  • 任务迁移 (通过 active_balancepull/push 操作)

示例(Linux CFS):

  • 当某个 CPU 的运行队列(cfs_rq)负载显著高于其他 CPU 时,调度器会将部分任务迁移到空闲核心。

(2) 任务放置(Task Placement)

目标 :在任务唤醒(如 wake_up_new_task())或迁移时,选择最优的 CPU 核心。
关键策略

  • 缓存亲和性(Cache Affinity):优先选择任务上次运行的 CPU(利用缓存局部性)。
  • NUMA 感知:避免跨 NUMA 节点迁移(减少远程内存访问延迟)。
  • SMT 优化:避免将高优先级任务放在同一超线程核心上竞争资源。

示例 (Linux 的 select_task_rq):

c 复制代码
int select_task_rq(struct task_struct *p, int cpu, int sd_flags) {
    if (sd_flags & SD_BALANCE_WAKE) {
        // 优先选择缓存亲和的 CPU
        cpu = p->recent_used_cpu;
    }
    // NUMA 感知逻辑...
    return cpu;
}

(3) 任务选择(Task Selection)

目标 :从当前 CPU 的运行队列中选择下一个要执行的任务。
关键策略

  • 调度类优先级 :按调度类顺序选择(如 RT > CFS > IDLE)。
  • 公平性/实时性
    • CFS 选择 vruntime 最小的任务。
    • RT 选择优先级最高的实时任务。
  • 启发式优化:如 CPU 缓存预热、避免频繁切换。

示例 (Linux CFS 的 pick_next_task_fair):

c 复制代码
struct task_struct *pick_next_task_fair(struct rq *rq) {
    struct sched_entity *se = __pick_first_entity(cfs_rq_of(rq));
    return se ? task_of(se) : NULL; // 选择 vruntime 最小的任务
}

2. 三重奏的协同工作流程

场景示例:新任务唤醒

  1. 任务放置select_task_rq
    • 根据缓存亲和性、NUMA 拓扑选择目标 CPU(如 CPU1)。
  2. 负载均衡load_balance
    • 如果 CPU1 过载,可能将其他任务迁移到 CPU2,为新任务腾出空间。
  3. 任务选择pick_next_task
    • CPU1 的调度器从队列中选择下一个任务(可能是新唤醒的任务或原有任务)。

3. 现代调度器的优化扩展

(1) 能耗感知调度(EAS, Energy-Aware Scheduling)

  • 在负载均衡时考虑 CPU 的能效比,优先使用小核(如 ARM big.LITTLE)。
  • 通过 energy_model 预测任务迁移的功耗影响。

(2) 实时性优化

  • Deadline 调度器 :严格遵循任务的截止时间(runtime/deadline/period)。
  • SCHED_FIFO/RR:高优先级任务可抢占普通任务。

(3) 虚拟化支持

  • vCPU 调度:在宿主机的多个物理 CPU 间均衡虚拟机的 vCPU。
  • 嵌套调度:同时处理宿主机和客户机的调度策略。

4. 不同操作系统的实现对比

调度器 负载均衡 任务放置 任务选择
Linux CFS load_balance() select_task_rq() pick_next_task_fair()
Windows Scheduler 基于处理器组(Processor Groups) 考虑 NUMA 和 SMT 动态优先级 + 时间配额
FreeBSD ULE 运行队列窃取(Runqueue Stealing) 缓存亲和性优先 交互式任务优先

5. 挑战与未来方向

  • 异构计算(如 CPU+GPU 调度):需要统一的任务分配策略。
  • AI 辅助调度:利用机器学习预测任务行为(如短任务识别)。
  • RISC-V 支持:为新兴架构优化调度算法。

总结

调度三重奏(负载均衡 + 任务放置 + 任务选择)构成了现代多核调度器的核心框架:

  1. 负载均衡确保系统资源充分利用;
  2. 任务放置优化缓存和 NUMA 局部性;
  3. 任务选择决定实时性和公平性。

三者协同工作,使得 Linux、Windows 等系统能够高效处理从嵌入式设备到数据中心的多样化负载。

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux