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

Linux kernel Linux内核如何在多个内核之间迁移进程?,linux-kernel,scheduler,multicore,Linux Kernel,Scheduler,Multicore,上下文: 进程1正在核心0上执行。核心1处于空闲状态 现在,process-1使用sched_setaffinity()将其CPU关联更改为core-1 问题: 哪些内核函数将进程1迁移到内核1上执行?以下是从内核中的sched_setaffinity系统调用入口点开始的调用序列: 在最后一个函数中,有两种情况,如代码所示: 如果要迁移的任务当前正在运行或正在唤醒,则通过调用stop\u one\u cpu来迁移该任务,这将按顺序调用以下函数: 最后一个函数,move_queued_

上下文:

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

现在,process-1使用
sched_setaffinity()
将其CPU关联更改为core-1

问题:


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

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

  • 在最后一个函数中,有两种情况,如代码所示:

    如果要迁移的任务当前正在运行或正在唤醒,则通过调用
    stop\u one\u cpu
    来迁移该任务,这将按顺序调用以下函数:


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

    感谢您对Hadi的详细解释。我看到了进程是如何移动到core-1的运行队列的。然而,我想知道core-1是如何意识到有一个新任务添加到它的队列中,然后执行这个任务的?@S.Wan这是调度程序负责的。它在每个内核上的每个计时器滴答声处调用,并检查本地内核上运行的当前进程是否为交换进程(空闲进程)。如果是,它将检查本地核心的运行队列是否包含除交换程序之外的任何可运行进程。如果确实如此,它将调度运行队列中的另一个进程在核心上运行,而不是在交换程序上运行。
    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);
    }