上QQ阅读APP看书,第一时间看更新
2.9.2 对调度器的扩展
在SMP系统上,调度类增加了以下方法:
kernel/sched/sched.h
struct sched_class {
…
#ifdef CONFIG_SMP
int (*select_task_rq)(struct task_struct *p, int task_cpu, int sd_flag, int flag
s);
void (*migrate_task_rq)(struct task_struct *p);
void (*task_woken) (struct rq *this_rq, struct task_struct *task);
void (*set_cpus_allowed)(struct task_struct *p,
const struct cpumask *newmask);
#endif
…
};
(1)select_task_rq方法用来为进程选择运行队列,实际上就是选择处理器。
(2)migrate_task_rq方法用来在进程被迁移到新的处理器之前调用。
(3)task_woken方法用来在进程被唤醒以后调用。
(4)set_cpus_allowed方法用来在设置处理器亲和性的时候执行调度类的特殊处理。
以下两种情况下,进程在内存和缓存中的数据是最少的,是有价值的实现负载均衡的机会。
(1)调用fork或clone以创建新进程,如图2.38所示。
图2.38 创建新进程时负载均衡
(2)调用execve装载程序,如图2.39所示。
图2.39 装载程序时负载均衡