创建进程

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