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

时间:2018-04-07 11:55:00

标签: linux-kernel scheduler multicore

上下文

Process-1正在core-0上执行。 Core-1闲置。

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

问题:

哪个内核函数迁移进程-1以在core-1上执行?

1 个答案:

答案 0 :(得分:1)

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

  1. sys_sched_setaffinity
  2. sched_setaffinity
  3. __set_cpus_allowed_ptr
  4. 在最后一个函数中,有两种情况,如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按顺序调用以下函数:

    1. migration_cpu_stop
    2. __migrate_task
    3. move_queued_task
    4. 最后一个函数__set_cpus_allowed_ptr是将任务从当前runqueue实际移动到目标runqueue的函数。请注意,这与从df[['name','full_name','club']] = df[['name','full_name','club']].fillna('') d = {'Points':'sum', 'Start':'sum', 'Sub':'sum', 'club':'first'} df = (df.groupby(['name','full_name'], sort=False, as_index=False) .agg(d) .reindex(columns=df.columns)) with pd.option_context('display.expand_frame_repr', False): print (df) name full_name club Points Start Sub 0 S. Mustafi Shkodran Mustafi Arsenal 74 26 2 1 Bruno Bruno SorianoLlido Villarreal CF 43 15 16 2 Bruno Bruno Gonzalez Cabrera Getafe CF 43 15 16 3 Oscar Oscar dos Santos Emboaba 17 5 10 4 Oscar Oscar Rodriguez Arnaiz Real Madrid CF 17 5 10 5 C. Bravo Claudio Bravo Manchester City 62 23 8 6 Naldo Ronaldo Aparecido Rodrigues FC Schalke 04 58 19 1 7 Naldo Edinaldo Gomes Pereira RCD Espanyol 58 19 1 8 G. Castro Gonzalo Castro Borussia Dortmund 158 46 12 9 Juanfran Juan Francisco Torres Belen Atletico Madrid 160 55 10 10 Juanfran Juan Francisco Moreno Fuertes RC Coruna 160 55 10 的另一个分支调用的函数相同。该分支处理任务处于任何其他状态的情况。