CFS 调度器

#内核 #进程 #调度 #CFS

CFS 调度器#

CFS(Completely Fair Scheduler)是 Linux 的默认调度策略。

核心思想#

CFS 的核心思想是公平性——让每个进程都能获得公平的 CPU 时间。

关键概念:

  • 虚拟运行时间(vruntime):记录进程已经使用的 CPU 时间
  • 红黑树:CFS 使用红黑树按 vruntime 排序所有可运行进程
  • 时间片:每个进程获得的 CPU 时间份额
// 简化的 CFS 调度逻辑
struct sched_entity {
    struct rb_node run_node;  // 红黑树节点
    u64 vruntime;             // 虚拟运行时间
    // ...
};

vruntime 计算公式#

vruntime+=Δexec×NICE_0_LOADweight\text{vruntime} += \Delta_{exec} \times \frac{NICE\_0\_LOAD}{weight}

  • nice 值越低,权重越高,获得的 CPU 时间越多
  • 实时进程优先级高于普通进程
技巧

nice 值范围是 -20 到 19,默认值为 0。nice 值越低,进程优先级越高。


进程状态#

Linux 进程有以下几种状态:

状态说明
TASK_RUNNING可运行或正在运行
TASK_INTERRUPTIBLE等待中断,可被信号唤醒
TASK_UNINTERRUPTIBLE等待中断,不可被信号唤醒
TASK_STOPPED被停止(如收到 SIGSTOP)
TASK_ZOMBIE已终止但未被父进程回收

调度策略对比#

完全公平调度(SCHED_NORMAL)

适用于普通进程,基于 vruntime 的公平调度。


参考资料#

书籍推荐
  • 《Linux 内核设计与实现》第 4 章
  • 《深入理解 Linux 内核》第 7 章