calc_global_load_tick是计算整个系统的负载,这个函数在scheduler_tick中被周期性的调用
calc_global_load_tick
/** Called from scheduler_tick() to periodically update this CPU's* active count.*/
void calc_global_load_tick(struct rq *this_rq)
{long delta;if (time_before(jiffies, this_rq->calc_load_update))return;delta = calc_load_fold_active(this_rq, 0);/* 全局变量:calc_load_tasks是整系统多个cpu(nr_running+nr_uninterruptible)任务数量的总和,多cpu在访问calc_load_tasks变量时使用原子操作来互斥*/if (delta)atomic_long_add(delta, &calc_load_tasks);this_rq->calc_load_update += LOAD_FREQ;
}
calc_load_fold_active
long calc_load_fold_active(struct rq *this_rq, long adjust)
{long nr_active, delta = 0;nr_active = this_rq->nr_running - adjust;nr_active += (long)this_rq->nr_uninterruptible;if (nr_active != this_rq->calc_load_active) {delta = nr_active - this_rq->calc_load_active;this_rq->calc_load_active = nr_active;}return delta;
}