Linux调度分析(9)调度core之IDLE过程

当CPU上没有可运行的task时,CPU会执行idle线程,这个过程称为进入idle过程;当有中断产生或其他方式将CPU从idle唤醒,这个过程称为退出idle过程。
IDLE线程在系统启动时创建,PID号是0,它的调度类为idle,优先级最低。
image
IDLE线程主要做如下:
(1) 检查是否进行idle前的balance,CFS调度类在调度时会检查是否需要balance,并设置对应标志,在idle前检查是否进行balance;
(2) 循环检查是否需要重新调度,如果需要的话退出循环,不进入idle;否则尝试进入idle;
(3) 若cpu_idle_force_poll为true或tick_check_broadcast_expired即存在IPI中断在路上时,调用cpu_idle_poll,进入poll模式,而不进入idle;否则调用cpuidle_idle_call进入idle;
(4) 当外部中断或其他原因从idle唤醒后,从cpuidle_idle_call退出,检查是否需要重新调度,一般这时需要,调用schedule_idle()在退出idle后重新调度。

进入IDLE前的balance

IDLE前的balance目前仅针对CFS task。仅当NOHZ_NEWILB_KICK被设置时才检查是否达到下一次balance的时间,若达到通过sched_balance_domains进行负载均衡。
CFS task在schedule()时尝试进行sched_balance_rq(),这同样也是负载均衡,若此时已经进行,则不设置标志NOHZ_NEWILB_KICK,即不要求在idle前进行负载均衡;否则需要进行负载均衡。
image

IDLE POLL

在cpu_idle_force_poll=true即强制要求poll模式,或有IPI中断在路上时,不进入深度休眠,而是cpu_relax()等待重新调度的标志。

IDLE流程

image
函数cpuidle_idle_call()过程如下:
(1) 若已经设置重新调度标志,则直接返回,不尝试进入idle;
(2) 若需要进入s2idle,则执行进入s2idle的流程,这里不做分析;
(3) 若需要进入idle,首先调用cpuidle_select()选择idle state;
(4) 需要stop tick时,调用tick_nohz_idle_stop_tick()停止tick;否则调用tick_nohz_idle_retain_tick()恢复tick;
(5) 调用call_cpuidle()进入idle状态;
(6) 调用cpuidle_reflect()告诉governor本次进入的idle state

posted @ 2026-01-20 12:14  耳朵一样  阅读(0)  评论(0)    收藏  举报