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应用线程发生调度的原因可以分为两类:

  1. 主动调度(当前任务主动放弃CPU)

    • 等待IO(read、recv、accept等)
    • 等待锁(mutex、rwsem、futex等)
    • 延时休眠(sleep、usleep、nanosleep等)
    • 主动让出CPU(sched_yield)
    • 等待事件(epoll_wait、poll、select等)

    特征:
    当前任务进入非TASK_RUNNING状态,
    主动调用schedule()。

  2. 抢占调度(当前任务被迫让出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,出处.



posted @ 2026-06-09 12:18  王阳开  阅读(14)  评论(0)    收藏  举报