try_to_wake_up() は CPU 実行キューにジョブをどこに追加しますか?

try_to_wake_up() は CPU 実行キューにジョブをどこに追加しますか?

私は理解しようとしてきました。Linuxカーネルのtry_to_wake_up()関数少し良い。概念的にプロセスを起動するには、プロセスをCPU実行キューに追加する必要があると思いますが、これがどこで発生するのかを把握するのが困難です。

    //try_to_wake_up()

    if (p == current) {
        /* I omitted some comments here*/

        success = 1;
        cpu = task_cpu(p);        //task_cpu(p) returns READ_ONCE(p->cpu);
        trace_sched_waking(p);    //This is just a logging call
        p->state = TASK_RUNNING; 
        trace_sched_wakeup(p);    //Another logging call
        goto out;
    }

だからジョブCPU()CPU実行キューはまったく変更されていないようで、タグを見てみたところ、呼び出しになりますね。ttwu_stat():

/*I omitted some intermediate code here*/
out:
    if (success)
        ttwu_stat(p, cpu, wake_flags);
    preempt_enable();

    return success;

しかし、私が見に行ったときttwu_stat()、これはこれに対する一連の呼び出しのようです。__schedstat_inc入力パラメータにマクロを追加するだけです。

それでは、実際にはtask_struct * pをCPU実行キューに追加する場所はどこですか?

どんなアイデアにも感謝します。

ありがとうございます。

ベストアンサー1

引用符付きコードブロックは、省略されたコメントに記載されているように特別なケースです。

         * We're waking current, this means 'p->on_rq' and 'task_cpu(p)
         * == smp_processor_id()'. Together this means we can special
         * case the whole 'p->on_rq && ttwu_remote()' case below
         * without taking any locks.

覚醒するジョブは現在のジョブなので、すでに実行キュー(p->on_rq)にあるため、実行キューに追加する必要はありません。

実行キューにジョブを追加するプロセスもっと下へ:

    cpu = select_task_rq(p, p->wake_cpu, SD_BALANCE_WAKE, wake_flags);

これにより、ジョブが実行キューに追加され、ジョブがスケジュールされたCPUが返されるため、必要に応じて移行を処理できます。

この#ifdef CONFIG_SMP条件には説明が必要です。 SMPがサポートされていない場合のマルチタスクできない同時に実行すると、現在のジョブを起動できないことがわかっているため、処理する必要がある唯一のケースはI / O待機です。

おすすめ記事