有三种情况需要为task选择cpu:刚创建的进程(fork),刚exec的进程(exec),刚被唤醒的进程(wakeup)他们都会调用select_task_rq,对于cfs,就是select_task_rq_fair。 staticintselect_task_rq_fair(structtask_struct *p,intprev_cpu,intwake_flags) {intsync = (wake_flags & WF_SYNC) && !(current->flags &P...
void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);//向该调度类的runqueue(就绪队列)中删除进程 void (*check_preempt_curr)(struct rq *rq, struct task_struct *p, int flags);//当一个进程被唤醒或者创建的时候,需要检查当前进程是否可以抢占当前cpu上正在运行的进程,如果可以...
select_task_rq_fair(structtask_struct*p,intprev_cpu,intsd_flag,intwake_flags){...if(sd_flag&SD_BALANCE_WAKE){record_wakee(p);want_affine=!wake_wide(p)&&!wake_cap(p,cpu,prev_cpu)...1&&cpumask_test_cpu(cpu,&p->cpus_allowed);}for_each_domain(cpu,tmp){if(want_affine&&(tmp->f...
.select_task_rq=select_task_rq_fair, .migrate_task_rq=migrate_task_rq_fair, .rq_online=rq_online_fair, .rq_offline=rq_offline_fair, .task_dead=task_dead_fair, .set_cpus_allowed=set_cpus_allowed_common,#endif.set_curr_task=set_curr_task_fair, .task_tick=task_tick_fair, .task_fork...
pick_next_task:从调度类中选出下一个要运行的进程 put_prev_task:将进程放回到调度类中 select_task_rq:为进程选择一个合适的cpu的运行队列 migrate_task_rq:迁移到另外的cpu运行队列 pre_schedule:调度以前调用 post_schedule:通知调度器完成切换 task_waking、task_woken:用于进程唤醒 set_cpus_allowed:修改进...
.put_prev_task = put_prev_task_fair, #ifdef CONFIG_SMP .select_task_rq = select_task_rq_fair, .migrate_task_rq = migrate_task_rq_fair, .rq_online = rq_online_fair, .rq_offline = rq_offline_fair, .task_dead = task_dead_fair, ...
在调度核心代码kernel/sched/core.c中,使用的方式是task->sched_class->xxx_func,其中task表示的是描述任务的结构体struct task_struck,在该结构体中包含了任务所使用的调度器,进而能找到对应的函数指针来完成调用执行,有点类似于C++中的多态机制。 2.2 rq/cfs_rq/task_struct/task_group/sched_entity ...
->select_task_rq_fair //kernel/sched/fair.c ->find_idlest_cpu ->group = find_idlest_group(sd, p, cpu) //调度域中选择 最空闲的调度组 ->new_cpu = find_idlest_group_cpu(group, p, cpu) //调度组中选择最空闲的cpu 4.加入运行队列 ...
int pulled_task = 0; u64 curr_cost = 0; this_rq->idle_stamp = rq_clock(this_rq); /* 如果该CPU平均空闲时间小于/proc中的配置值或者该cpu调度域中所有cpu都是idle状态,那么不需要负载均衡了*/ if (this_rq->avg_idle < sysctl_sched_migration_cost || ...
在下次task被唤醒时,select_task_rq_fair根据cpu_allowed里的掩码来确定将其置于哪个CPU的运行队列,一个进程在某一时刻只能存在于一个CPU的运行队列里。 在Nginx中,使用了CPU亲和度来完成某些场景的工作: worker_processes 4; worker_cpu_affinity 0001001001001000; ...