![Linux内核深度解析](https://wfqqreader-1252317822.image.myqcloud.com/cover/741/30210741/b_30210741.jpg)
上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所示。
![](https://epubservercos.yuewen.com/A23B56/16568261904470706/epubprivate/OEBPS/Images/figure_0111_0001.jpg?sign=1738886438-tyMOBFcn3eJtHtePuhiuFJ5L5DzKJhXJ-0-2b90f488db7bf75e8074762dc8d12e41)
图2.38 创建新进程时负载均衡
(2)调用execve装载程序,如图2.39所示。
![](https://epubservercos.yuewen.com/A23B56/16568261904470706/epubprivate/OEBPS/Images/figure_0111_0002.jpg?sign=1738886438-xCt2yEJjiT1AtxJ5mzH5mDmKv86cAK6o-0-619b9c0f0dd3b6714432e487638e5c1c)
图2.39 装载程序时负载均衡