__schedule
1.完成一些必要的检查, 并设置进程状态, 处理进程所在的就绪队列
2.调度全局的pick_next_task选择抢占的进程
2.1
如果当前cpu上所有的进程都是cfs调度的普通非实时进程, 则直接用cfs调度找到进程
如果无程序可调度则找到 idle进程
2.2
否则从优先级最高的调度器类sched_class_highest(目前是stop_sched_class)开始依次遍历所有调度器类的pick_next_task函数, 选择最优的那个进程
3.context_switch 完成进程上下文切换
3.1 调用switch_mm_irqs_off,把虚拟内存从一个进程映射切换到新进程中
3.2 调用switch_to,从上一个进程的处理器状态切换到新进程的处理器状态。
这包括保存、恢复栈信息和寄存器信息
调度器与调度策略
level1 : 6种调度策略
SCHED_NORAML
SCHED_BATCH
SCHED_IDLE
SCHED_RR
SCHED_FIFO
SCHED_DEADLINE
level2 : 调度器类
CFS : 封装了 SCHED_NORAML SCHED_BATCH
RT : 封装了 SCHED_RR SCHED_RR
IDLE : 封装了 SCHED_IDLE
STOP :
DEADLINE:
调度时机
分两种情况
1.一般来说,直接调度就行了
2.但是有的会分为两步,先置位 need_sched , 然后再某个时机判断 need_sched,然后调度