cpu调度器

1、含义
在可执行的任务集合中选出一个,并分配一定时间片。
(可执行集合比如linux里进程或线程 task_struct\ 进程组cgroup)

2、流程与目标
不同选举策略选举一个可执行任务(公平CFS、短任务、优先级) -》 分配时间片(考虑均衡,太长伤延时,太短伤吞吐) -》 何时切换(自愿切换、时钟/唤醒抢占)
对于cpu调度,我们可以频繁做不同决策,但具体切换应当谨慎;通过need_reach标志位,对任务先打标,在执行;此外,目标是需要均衡,(吞吐、延迟、公平、实时)

3、选举策略与其数据结构
选举-- 就是从集合中取出一个任务,对于集合的功能来说,它具备入队,出队操作、选出最优任务;策略不同,其数据结构也不同;

  • 短任务, 通过键 = 预计撞钟时间或剩余撞钟时间, 最小的应当优先出队, 往往最小堆-》底层是同态数组维护的完全二叉树, 入队出队 O(log2N) 选出O(1);

  • 优先级FIFO/RR, 将任务分不同档位, 0档最优先,后依次增大;用位图bitmap标记该档位下是否有任务, 用FIFO队列存储每个任务, 选最优,先选档位在去对头任务 O(1); 入队,找到档位的队列,挂在队尾; 出队从链表中摘掉 《O(log2N)

  • 公平CFS : LINUX常用的, key = vruntime 虚拟运行时间, 它根据权重 nice计算, nice越高虚拟运行时间增长快; 为实现公平,选出vruntime 最小先执行,执行一段时间后,vruntime 增长不再是最小,当前任务切出,新的最优任务运行。 这要求所有任务必须是有序的,而不是相对有序。
    因此 红黑树最合适 入队出队O(log2 N) 选举 是树左下角;;

4、linux下怎么调度
Linux 的 CPU 调度并不是一个单一算法,而是按调度类分层实现的。每个 CPU 核心都对应一个运行队列 struct rq,里面分别存放不同调度类的就绪队列,调度时按优先级从高到低依次检查。
有很多调度策略 从高优先级到低优先级 分别是 stop deadline rt FIFO/RR fair idle
stop 是 用于执行内核内部的特殊任务,比如 CPU 热插拔、迁移任务、关闭 CPU 等。
Deadline 调度类对应 SCHED_DEADLINE 策略,用于需要严格时限保证的实时任务。
RT 调度类 队列加BITMAP SCHED_FIFO 和 SCHED_RR 两种实时策略
Fair 调度类 红黑树维护任务 按虚拟运行时间 vruntime 选择 这是绝大多数用户进程使用的调度类。
Idle 调度类 当没有其他任务可运行时,CPU 执行 idle 任务 , 空闲线程 。

posted @ 2026-09-17 00:49  超级麋鹿  阅读(0)  评论(0)    收藏  举报