Linux调度分析(8)调度core之调度时钟
调度时钟为调度的硬件基础,它为per-CPU设备。在ARM64中为arch_timer,13号中断。
调度时钟的模式arch_timer
CONFIG_HZ_PERIODIC=y: 不忽略任何调度时钟,导致比较耗电
CONFIG_NO_HZ_IDLE=y:对于idle CPU忽略调度时钟
CONFIG_NO_HZ_FULL=y:对于idle CPU或只有一个runnable task运行的CPU忽略调度时钟
调度时钟中断处理
当tick时钟中断到达时,处理如下:

- 调用run_local_timers处理timer,如果有超时timer,触发TIMER_SOFTIRQ软中断处理;
- 处理IRQ WORK
- 调用sched_tick处理调度相关
- 调用run_posix_cpu_timers处理posix cpu timer
IRQ WORK
IRQ WORK线程为Per-CPU内核线程,FIFO,处理每个CPU上的IRQ WORK。
当IRQ WORK为IRQ_WORK_LAZY时,放到lazy_list中,待tick时钟达到时在时钟中断处理函数中处理irq_work_tick;
否则放入到raised_list中,发送IPI中断,在IPI中断处理函数处理raised_list上的IRQ WORK(同时也处理可能存在的lazy_list)

内核中其他模块可以通过init_irq_work()初始化IRQ WORK, 通过irq_work_queue()触发IRQ WORK。
sched_tick调度相关的处理
在调度时钟中断中主要处理调度相关的事情如下:
- 负载更新和计算
- CPU时钟更新
- 检查是否调度(进程时间片)
- 负载均衡

浙公网安备 33010602011771号