Linux 内核如何在多个内核之间迁移进程



上下文:

进程 1 在核心 0 上执行。核心 1 处于空闲状态。

现在,进程 1 使用 sched_setaffinity() 将其 CPU 关联更改为内核 1。

问题:

哪些内核函数将进程 1 迁移到核心 1 上执行?

以下是从内核中sched_setaffinity系统调用入口点开始的调用序列:

  1. sys_sched_setaffinity。
  2. sched_setaffinity。
  3. __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 进行迁移,这将按顺序调用以下函数:

  1. migration_cpu_stop。
  2. __migrate_task。
  3. move_queued_task。

最后一个函数 move_queued_task 是实际将任务从当前运行队列移动到目标运行队列的函数。请注意,这与从 __set_cpus_allowed_ptr 的另一个分支调用的函数相同。该分支处理任务处于任何其他状态的情况。

相关内容

  • 没有找到相关文章

最新更新