// 周期调度器
// 调用路径: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
调度子系统3_周期调度器
最新推荐文章于 2024-05-30 17:45:19 发布
本文详细介绍了Linux内核中的周期调度器工作原理,包括scheduler_tick函数的任务,如更新运行队列的clock、负载,处理进程运行时间更新,并触发负载平衡。此外,还解析了update_cpu_load函数如何更新队列负载以及calc_load_account_active函数如何计算系统负载,关注于就绪进程和不可中断睡眠进程的考量。
摘要由CSDN通过智能技术生成