linux调度策略分为下面几种
调度类 | 调度策略 | 使用范围 | 说明 |
---|---|---|---|
stop | 无 | 最高优先级的进程,比deadline 进程的优先级高 | 1.可以抢占任何进程。 2. 用于负载均衡机制中的进程迁移、softlockup检测、cpu热插拔、RCU等 |
deadline | SCHED_DEADLINE | 最高优先级的实时进程,优先级为-1 | 用于调度有严格时间要求的实时进程,如视频编解码 |
realtime | SCHEDFIFO SCHED_RR | 普通实时进程,优先级为0 ~ 99 | 用于普通的实时进程,如IRQ线程化。SCHED_FIFO 是一种实时调度类,采用先进先出(FIFO)调度策略。具有较高优先级的进程将一直运行,直到主动释放 CPU 或者有更高优先级的进程准备运行。 SCHED_RR 是一种实时调度类,采用循环(Round-Robin)调度策略。每个进程被分配一个时间片,时间片用完后,进程被放回队列的尾部,同时其他进程得到机会运行。 SCHED_RR 调度类适用于实时系统和需要平衡实时任务响应性和公平性的应用领域。 |
CFS | SCHED_NORMAL SCHED_BATCH SCHED_IDLE | 普通进程,优先级为100 ~ 139 | 由CFS来调度。 SCHED_NORMAL: 是 Linux 默认的调度类,也称为 CFS(完全公平调度器)。 SCHED_BATCH: 适用于没有用户交互行为的后台进程,如高吞吐量场景。 SCHED_IDLE: 这类调度策略被用于系统中优先级最低的任务,只有在没有任何其他任务可运行时,调度器才会将运行该类任务 |
idle | 无 | 最低优先级的进程 | 当就绪队列中没有其他进程时进入idle调度类。idle调度类会让CPU进入低功耗模式。 注意:不要将这类调度类与 CFS 中的 SCHED_IDLE 混淆。 |
调度器的存在形式
调度器并非以进程或者线程的形式存在,有两种方法激活调度器
1. 主动调度
主动调度执行的函数是schedule,调度触发场景有如下几种
- IO等待
- 加锁失败等各种阻塞操作
- 用户空间主动调用sched_yield
2. 被动调度
周期性调度器执行函数scheduler_tick,调度触发场景有如下几种
- 定时器周期性调度
- 唤醒进程时发现新进程需要抢占当前进程
- 迁移进程时发现新进程需要抢占当前进程
- 改变进程优先级时发现新进程需要抢占当前进程
调度器要解决的问题
1. 让多个任务共享cpu时间,所有任务可以并发执行。
2. 任务之间可以有优先级,可以区别对待,但是不允许某个任务运行超出预期时间,也要确保所有任务都有机会执行,低优先级任务不至于饥饿。