Linux内核如何在多核间迁移进程?
How does Linux kernel migrate the process among multiple cores?
上下文:
进程 1 正在核心 0 上执行。 Core-1 空闲。
现在,process-1 使用 sched_setaffinity()
将其 CPU affinity 更改为 core-1。
问题:
哪些内核函数将 process-1 迁移到 core-1 上执行?
这里是从内核中的sched_setaffinity
系统调用入口点开始的调用顺序:
在最后一个函数中,有两种情况,如line 1101处的代码所示:
if (task_running(rq, p) || p->state == TASK_WAKING) {
// ...
stop_one_cpu(cpu_of(rq), migration_cpu_stop, &arg);
// ...
} else if (task_on_rq_queued(p)) {
rq = move_queued_task(rq, &rf, p, dest_cpu);
}
如果要迁移的任务当前运行或正在唤醒,则通过调用stop_one_cpu
进行迁移,依次调用以下函数:
最后一个函数 move_queued_task
是实际将任务从当前运行队列移动到目标运行队列的函数。请注意,这与从 __set_cpus_allowed_ptr
的另一个分支调用的函数相同。该分支处理任务处于任何其他状态的情况。
上下文:
进程 1 正在核心 0 上执行。 Core-1 空闲。
现在,process-1 使用 sched_setaffinity()
将其 CPU affinity 更改为 core-1。
问题:
哪些内核函数将 process-1 迁移到 core-1 上执行?
这里是从内核中的sched_setaffinity
系统调用入口点开始的调用顺序:
在最后一个函数中,有两种情况,如line 1101处的代码所示:
if (task_running(rq, p) || p->state == TASK_WAKING) {
// ...
stop_one_cpu(cpu_of(rq), migration_cpu_stop, &arg);
// ...
} else if (task_on_rq_queued(p)) {
rq = move_queued_task(rq, &rf, p, dest_cpu);
}
如果要迁移的任务当前运行或正在唤醒,则通过调用stop_one_cpu
进行迁移,依次调用以下函数:
最后一个函数 move_queued_task
是实际将任务从当前运行队列移动到目标运行队列的函数。请注意,这与从 __set_cpus_allowed_ptr
的另一个分支调用的函数相同。该分支处理任务处于任何其他状态的情况。