Linux 线程调度核心要点
1. 基本单位:任务(Task)
Linux 内核不严格区分线程和进程,它们都被称为任务(Task),共享相同的调度策略。线程本质上是共享同一内存地址空间和其他资源(如文件描述符)的任务。
2. 核心调度器:CFS(完全公平调度器)
这是 Linux 默认的调度策略,旨在为所有可运行任务公平地分配 CPU 时间。
- 工作原理:CFS 使用一颗红黑树来组织可运行的任务。树的排序依据是任务的虚拟运行时间(vruntime) —— 即任务实际运行时间经过优先级加权后的值。
- 调度决策:CFS 总是选择 vruntime 最小的任务来运行,这代表了它最“缺乏”CPU 时间。这保证了所有任务在较长的时间范围内都能获得公平的 CPU 份额。
- 优先级(Nice值):用户可以通过
nice
值(-20 到 19,越小优先级越高)来影响调度的“公平”权重。高优先级(低 nice 值)的任务的 vruntime 增长得更慢,从而能获得更多的实际运行时间。
3. 调度策略(Schedule Policies)
CFS 主要管理普通任务,Linux 还提供了其他策略:
SCHED_OTHER
/SCHED_NORMAL
: 默认策略,即 CFS,用于普通任务。SCHED_FIFO
/SCHED_RR
: 实时策略,优先级高于所有普通任务。- FIFO (先进先出):高优先级任务会一直运行,直到它主动放弃、休眠或被更高优先级的任务抢占。
- RR (时间片轮转):与 FIFO 类似,但同级优先级的任务会共享 CPU,每个任务运行一个时间片后轮到下一个。
SCHED_BATCH
/SCHED_IDLE
: 用于低优先级后台任务,对交互响应要求低。
4. 多核负载均衡
在多核(SMP)系统中,调度器还需要将任务合理地分配到各个 CPU 核心上,以充分利用所有核心并减少缓存失效。这个过程由负载均衡器完成,它会定期在各个 CPU 之间迁移任务以平衡负载。
总结一下:Linux 线程调度的核心是 CFS,它通过虚拟运行时间(vruntime) 和红黑树来实现公平性,同时支持实时优先级和多核负载均衡以满足不同场景的需求。