Linux内核深度解析
上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 装载程序时负载均衡