Linux操作系统支持SMP,并且同时会运行多个进程,这些进程是如何在多个CPU之间调度的,如何进行负载均衡?
进程在如下时机决定在哪个CPU运行
1.进程被唤醒的时候,比如进程收到网络数据包,或者完成磁盘IO操作
2.进程刚被fork出来
Linux通过select_task_rq函数决定进程在哪一个CPU上进行运行。该函数在./kernel/sched/core.c中实现。
int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags)
select_task_rq的调用时机:
wake_up_new_task: 进程刚被fork出来
try_to_wake_up:进程被唤醒的时候
select_task_rq函数在决定进程在哪个CPU上运行会考虑哪些因素?
static int select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_flags)
{
int cpu = smp_processor_id();
for_each_domain(cpu, tmp) {
if (!(tmp->flags & SD_LOAD_BALANCE))
break;