linux应用程序调度概述
linux应用程序调度概述
“时间片耗尽” 这是很多教材遗留下来的说法,更符合早期 O(1) Scheduler 或 RT Scheduler 的行为。
现代 Linux(CFS)的真实实现。严格来说:Linux CFS 并不存在传统意义上的固定时间片(Time Slice)耗尽导致切换。
scheduler_tick()
↓
更新 vruntime
curr->vruntime += delta_exec * weight_factor;
当前任务vruntime已经领先太多了吗?
↓
发现当前任务不再是最合适运行者
↓
set TIF_NEED_RESCHED
↓
在安全调度点
(中断返回/内核抢占点/用户态返回)
↓
schedule()
↓
切换到 vruntime 最小的任务
CFS 在 scheduler tick 中发现当前任务的 vruntime 相对其他可运行任务已经增长过多,于是设置 TIF_NEED_RESCHED;
随后在中断返回、内核抢占点或返回用户态时执行 schedule(),切换到 vruntime 最小的任务。
Linux应用线程发生调度的原因可以分为两类:
-
主动调度(当前任务主动放弃CPU)
- 等待IO(read、recv、accept等)
- 等待锁(mutex、rwsem、futex等)
- 延时休眠(sleep、usleep、nanosleep等)
- 主动让出CPU(sched_yield)
- 等待事件(epoll_wait、poll、select等)
特征:
当前任务进入非TASK_RUNNING状态,
主动调用schedule()。 -
抢占调度(当前任务被迫让出CPU)
- 唤醒了更高优先级任务
- 实时任务(RT)被唤醒
- CFS判断当前任务已获得过多CPU时间
(vruntime相对其他runnable task过大) - 中断线程、内核线程被唤醒且优先级更高
- 负载均衡导致CPU迁移
特征:
当前任务仍然处于TASK_RUNNING状态,
调度器设置TIF_NEED_RESCHED,
随后在中断返回、内核抢占点或返回用户态时执行schedule()。
Author: Yangkai Wang
wang_yangkai@163.com
Coding in 2026/06/09
转载请注明author,出处.
浙公网安备 33010602011771号