【内核调度、负载计算】【update_curr】

本文深入探讨Linux内核调度中的负载计算,重点在于基于pelt的负载计算方法。update_curr函数在任务队列的插入和移除时更新当前任务的运行时间统计。calc_delta_fair计算delta值,考虑权重对vruntime的影响,确保公平性。同时,update_min_vruntime在CPU间迁移任务时调整min_vruntime,确保正确选择下一个执行的任务。
摘要由CSDN通过智能技术生成

负载计算,这里指的是基于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);
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值