负载计算,这里指的是基于pelt的负载计算,在很多时候都会用到,基于之前的负载均衡的地方,在dequeue_entity和enqueue_entity都调用了update_curr函数进行负载的更新
update_curr
Update the current task's runtime statistics.
/*
* Update the current task's runtime statistics.
*/
static void update_curr(struct cfs_rq *cfs_rq)
{
struct sched_entity *curr = cfs_rq->curr;
u64 now = rq_clock_task(rq_of(cfs_rq));
u64 delta_exec;
if (unlikely(!curr))
return;
/* (3.2.1.1) 计算cfs_rq->curr se的实际执行时间 */
delta_exec = now - curr->exec_start;
if (unlikely((s64)delta_exec <= 0))
return;
curr->exec_start = now;
schedstat_set(curr->statistics.exec_max, max(delta_exec, curr->statistics.exec_max));
curr->sum_exec_runtime += delta_exec;// (1) 累计当前进程的实际运行时间
// 更新cfs_rq的实际执行时间cfs_rq->exec_clock
schedstat_add(cfs_rq, exec_clock, delta_exec);
/* (3.2.1.2) 计算cfs_rq->curr se的虚拟执行时间vruntime */
curr->vruntime += calc_delta_fair(delta_exec, curr);// (2) 累计当前进程的vruntime
update_min_vruntime(cfs_rq);
/* (3.2.1.3) 如果se对应的是task,而不是task_group,
更新task对应的时间统计
*/
if (entity_is_task(curr)) {
struct task_struct *curtask = task_of(curr);
trace_sched_stat_runtime(curtask, delta_exec, curr->vruntime);
// 更新task所在cgroup之cpuacct的某个cpu运行时间ca->cpuusage[cpu]-&

本文深入探讨Linux内核调度中的负载计算,重点在于基于pelt的负载计算方法。update_curr函数在任务队列的插入和移除时更新当前任务的运行时间统计。calc_delta_fair计算delta值,考虑权重对vruntime的影响,确保公平性。同时,update_min_vruntime在CPU间迁移任务时调整min_vruntime,确保正确选择下一个执行的任务。
最低0.47元/天 解锁文章
225

被折叠的 条评论
为什么被折叠?



