2013-02-25 7 views
5

私はLinuxカーネルの初心者です。 現在、私はアイドルコードを調べ、質問をしました。 プロセッサが独自の実行キューにタックを持っていない場合、 がアイドルモード、特定のWFI(割り込みのためのwating)になることがあります。 WFI状態に留まった後に、他のプロセッサ(アイドルではない)が のタスクをこれにアイドル状態のプロセッサ(負荷バランスによって)に広げたいと思うかもしれませんが、これはX86ではなく、 。その時、ビジー状態のプロセッサー は、タスクをイミグレートします。私の視点では、タスクが移行されるとき、アイドルプロセッサ はタスクを処理するためにimmidiatleyを起動する必要があります。右?しかし、私は アイドル状態のプロセッサーを目覚めさせるコードは見つけられませんでしたが、アイドル状態のプロセッサーの実行キューにタスクを登録するコードしか見つかりませんでした。新しいタスクが作成されたら、Linuxカーネルはアイドル状態のプロセッサをどのように起動させますか?

私は新しいタスクが与えられたときに起床するプロセッサの後ろにどのメカニズムがあるのか​​知っています。 それはちょうど1つの待ち行列から他の待ち行列にタスクを移動させます。 いくつかの予期しないIRQによって目を覚ますまで待ち​​ますか?

私に真実を表示してください:)

答えて

6

WFIは、ARMのための特別なコプロセッサ命令です。たとえば、

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

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

特別なidleタスクがARM上でWFI命令を実行します(作業が必要ない場合)。 idleタスクは非常に優先度の低いLinuxタスクで、他に何もない場合にスケジューリングされます。 WFIidleによって行われた場合、何らかの作業が行われていないときには(おそらくタイマー)割り込みが発生します。 SMPの場合、移行可能な他のプロセスがある場合はidleにはなりません。スケジューラがこれをチェックします。負荷が高くなると、ビジー状態のプロセッサはwakeになります。割り込みのあるARMの場合通常、この処理はアーチ/ アーチ/kernel/processes.cです。例えば、x86default_idle()です。 x86の仕組みはわかりませんが、ソースを見ることができます。

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

他の関連するメカニズムがあるcpufreqcpuidlekernel/powerなど

真実が常にある主観/客観的かつ確かグローバルではありません。metricを表示し、の真実を表示することができます。

0

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

= > thread's task_struct->flags |= PF_WAKE_UP_IDLE; 
+0

これはスレッドウェイクアップ用であり、CPUウェイクアップ用ではありません。 PF_WAKE_UP_IDLEフラグは、Linuxカーネル3.18以降では存在しません。 – Zhifei

0

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

0

smp_send_reschedule()は、アイドル状態のプロセッサにIPI_RESCHEDULEを送信します。これはwfiから目を覚ますでしょう。いくつかの場所から呼び出され、その一例はwake_up_process -> try_to_wake_up -> try_to_wake_up -> ttwu_queue -> ttwu_queue_remote(カーネル3.4の関数名)です。

関連する問題