上下文:
进程 1 在核心 0 上执行。核心 1 处于空闲状态。
现在,进程 1 使用 sched_setaffinity()
将其 CPU 关联更改为内核 1。
问题:
哪些内核函数将进程 1 迁移到核心 1 上执行?
以下是从内核中sched_setaffinity
系统调用入口点开始的调用序列:
- sys_sched_setaffinity。
- sched_setaffinity。
- __set_cpus_allowed_ptr。
在最后一个函数中,有两种情况,如第 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
进行迁移,这将按顺序调用以下函数:
- migration_cpu_stop。
- __migrate_task。
- move_queued_task。
最后一个函数 move_queued_task
是实际将任务从当前运行队列移动到目标运行队列的函数。请注意,这与从 __set_cpus_allowed_ptr
的另一个分支调用的函数相同。该分支处理任务处于任何其他状态的情况。