私は理解しようとしてきました。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待機です。