// 周期调度器
// 调用路径:update_process_times->scheduler_tick
// 函数任务:
// 1.更新rq的clock
// 2.更新队列负载
// 3.通知调度器类更新进程运行时间
// 4.更新下一次load balance的时间戳
// 5.触发load balance
1.1 void scheduler_tick(void)
{
int cpu = smp_processor_id();
struct rq *rq = cpu_rq(cpu);
//当前运行的进程
struct task_struct *curr = rq->curr;
raw_spin_lock(&rq->lock);
//更新rq的clock
update_rq_clock(rq);
//更新队列负载
update_cpu_load_active(rq);
//更新进程的运行时间
curr->sched_class->task_tick(rq, curr, 0);
raw_spin_unlock(&rq->lock);
#ifdef CONFIG_SMP
//更新下一次load balance的时间戳
rq->idle_balance = idle_cpu(cpu);
//触发load balance软中断
trigger_load_balance(rq, cpu);
#endif
}
// 更新队列负载(rq->cpu_load[])
// 每scheduler tick(TICK_NSEC)被调用一次
// 函数任务:
// 1.更新rq负载
// 1.1 通过CPU_LOAD_IDX_MAX个项记录rq的历史负载信息
// 1.2 更新方法
// cpu_load[0] = load.weight
// cpu_load[1] = (cpu_load[1] + load.weight)/2
// cpu_load[2] = (cpu_load[2]*3 + load.weight)/4
// cpu_load[3] = (cpu_
调度子系统3_周期调度器
最新推荐文章于 2022-01-23 19:41:02 发布