6

私は Linux カーネルの初心者です。現在、アイドルコードを調べて質問がありました。プロセッサが独自のランキューにタスクを持たない場合、プロセッサは特定の WFI (割り込み待ち) のアイドル モードに入る可能性があります。(私が言及したのは、X86ではなくARMアーキテクチャに関することだけです。したがって、X86には何か問題があります。)WFI状態にとどまった後、おそらく他のプロセッサ(アイドル状態ではない)がタスクをこのアイドル状態のプロセッサに(ロードバランスによって)分散させたいと考えています。その際、ビジーなプロセッサはタスクを移行させます。私の見解では、タスクが移行されると、アイドル状態のプロセッサが即座にウェイクアップしてタスクを処理する必要があります。右?ただし、アイドル状態のプロセッサをウェイクアップするコードは見つかりませんでしたが、アイドル状態のプロセッサのランキューにタスクを登録するコードのみが見つかりました。

新しいタスクが与えられたときにプロセッサを起動するメカニズムの背後にあるものを知りたいです。それとも、予測不可能な IRQ によって目が覚めるまで、タスクをあるキューから別のキューに移動するだけですか?

真実を見せてください:)

4

4 に答える 4

6

WFIARM 用の特別なコプロセッサ命令です。例えば、

 ENTRY(cpu_arm946_do_idle)
         mcr     p15, 0, r0, c7, c0, 4           @ Wait for interrupt
         mov     pc, lr

Linux とは (直接) 関係ありません。

行う作業がない場合、ARM で命令を実行する特別なidleタスクがあります。WFIこのidleタスクは、優先度が最も低い Linux タスクであり、他に何もない場合にスケジュールされます。WFIが によって行われた場合idle、行う作業がない場合に一部のドライバーが (おそらくタイマーで) 中断します。SMP の場合、idle移行できるプロセスが他にある場合は移行しません。スケジューラはこれをチェックします。負荷が高くなると、使用中のプロセッサが他のプロセッサを必要とwakeします。割り込みのあるARMの場合。通常、この処理はarch/ arch /kernel/process.cにあります。たとえば、x86にはdefault_idle(). x86動作しますが、ソースを見ることができます。

あなたの質問に対して、新しいタスクが作成されたときに、Linuxカーネルはアイドル状態のプロセッサをどのように起動しますか? 、答えはそうではありません。fork()新しいタスクを作成できるのは (およびいくつかの同様の関数)だけです。最初はinitタスクから、次にその子の 1 つです。cronジョブがある場合は、に進む前にタイマーがスケジュールされていsleep/idleます。このタイマーは、システムを起動し、再スケジュールcronしてからcronを呼び出しfork()、新しいタスクを作成します。

その他の関連するメカニズムは、、、cpufreqなどですcpuidlekernel/power

真実は常に客観的/主観的あり、確かにグローバルではありませ真実を見せください.metric

于 2013-02-26T18:17:07.120 に答える
0

CFS::select_task_rq() メソッドである select_task_rq_fair() を見てください。これは、実行キューのバランスを再調整するためにスケジューラがアイドル状態のタスクを起動する最も代表的なケースです。

于 2014-10-16T13:27:18.627 に答える
0

スレッドを作成した後、以下のコードのように CPU のフラグを設定するだけです。

 = > thread's task_struct->flags |= PF_WAKE_UP_IDLE;
于 2014-07-02T06:28:53.533 に答える