创建进程
fork()
clone()
vfork()
用户(程序)调用
启用系统调用
kernel_clone()
copy_process()
wake_up_new_task()
就绪进程
位于rq(就绪/运行队列)
睡眠进程
位于wq(等待队列)
_scheduled()
深度睡眠
轻度睡眠
中度睡眠
调度器调度
pick_next_task()
选出rq中下一进程
context_switch()
当前与下一进程上下文切换
下一进程转入运行态
TASK_INTERRUPTIBLE
TASK_KILLABLE
TASK_UNINTERRUPTIBLE
受信号影响
deactivate_task()
转入睡眠,移出rq
接受信号
中断请求
返回rq
主调度器
任务完成
退出进程
do_exit()
返还占有资源
如果成为僵尸进程
release_task()
0号继承僵尸并将其释放
CFS调度策略
原理
nice值
影响使用CPU占比
不再直接影响划分时间片大小
目标延迟
最小调度周期
最小粒度(下界)
时间片的替代
优先级
通过vrentime反应
高者增慢,优先取最小
存储结构
红黑树
实现
_scheduled()
pick_next_task()
pick_next-task_fair()
pick_next_etnity()
找出rcnode最左叶子节点
sched_entity
gruop_node
on_rq
run_node
exec_start
load
sum_exec_runtime
权重
红黑树中节点
所在进程组
标记是否处于红黑树运行队列
vruntime
pre_sum_exec_runtime
进程开始运行时间
进程总运行时间
虚拟运行时间
上个调度周期中的总运行时间
__scheduled()
入参:preempt
true
false
被动调度
主动调度
pick_next_task()
pick_next-task_fair()
pick_next_etnity()
找出rcnode最左叶子节点
sched_entity
gruop_node
所在进程组
on_rq
标记是否处于红黑树运行队列
run_node
红黑树中节点
exec_start
进程开始运行时间
load
权重
sum_exec_runtime
进程总运行时间
vruntime
虚拟运行时间
pre_sum_exec_runtime
上个调度周期中的总运行时间
context_switch()
虚拟存储切换
寄存器切换
switch_to()
kernel->user
user->user
user->kernel
kernel->kernel
lazy
lazy+mmgrab()
switch+mmdrop()
switch