2013-02-25 20 views
5

Ich bin ein Neuling auf Linux Kernel. Derzeit habe ich in Idle-Codes untersucht und hatte eine Frage. Wenn der Prozessor keine Funktionen in seiner eigenen Runqueue hat, kann er in den Leerlaufmodus wechseln, spezifische WFI (für Interrupt). (Alles, was ich erwähnte, ist über ARM-Architektur nicht X86. So etwas ist falsch für X86.) Nach dem Bleiben im WFI-Zustand, möglicherweise andere Prozessor (nicht im Leerlauf) ihre Aufgabe zu diesem Leerlauf-Prozessor (nach Lastbalance) zu verbreiten . Zu dieser Zeit macht ein beschäftigt Prozessor Aufgabe imitiert. Aus meiner Sicht sollte der untätige Prozessor bei der Imigration der Task sofort aufwachen, um die Task zu verarbeiten. Recht? Ich konnte jedoch keine Codes finden, die Leerlaufprozessor aufwecken, sondern nur Codes über das Registrieren der Task zur RunQueue des Leerlaufprozessors gefunden haben.Wie aktiviert der Linux-Kernel den Leerlaufprozessor, wenn eine neue Aufgabe erstellt wurde?

Ich würde gerne wissen, welcher Mechanismus hinter Aufwachen Prozessor steht, wenn neue Aufgabe gegeben wird. Oder es einfach Aufgabe von einer Warteschlange auf andere zu verschieben, als es sein, bis durch aufgeweckt einige unvorhersehbare IRQ?

Bitte zeigen Sie mir die Wahrheit :)

Antwort

6

WFI ist eine spezielle Co-Prozessor Anweisung für die ARM. Zum Beispiel

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

Es hat nichts mit Linux (direkt) zu tun.

Es gibt eine spezielle idle Aufgabe, die die WFI Anweisung auf dem ARM ausführt, wenn keine Arbeit zu tun ist. Die Task idle ist die Linux-Task mit der niedrigsten Priorität, die geplant ist, wenn es nichts anderes gibt. Wenn WFI von idle durchgeführt wird, werden einige Treiber (möglicherweise ein Timer) unterbrechen, wenn keine Arbeit zu tun ist. In dem SMP-Fall wird es nicht zu idle wechseln, wenn andere Prozesse vorhanden sind, die migriert werden können; Der Scheduler prüft dies. Wenn eine Last hoch wird, benötigt der ausgelastete Prozessor die anderen wake; Im Falle eines ARM mit einem Interrupt. Normalerweise ist diese Handhabung in arch/Bogen /kernel/process.c. Zum Beispiel hat die x86default_idle(). Ich weiß nicht genau, wie die x86 funktioniert, aber Sie können auf die Quelle schauen.

Für Ihre Frage Wie weckt Linux-Kernel Leerlauf-Prozessor auf, wenn neue Aufgabe erstellt?, die Antwort ist es nicht. Nur fork() (und einige ähnliche Funktionen) können eine neue Aufgabe erstellen; ursprünglich aus der init Aufgabe und dann eines seiner Kinder. Wenn Sie einen Job cron haben, hat es einen Timer geplant, bevor es zu sleep/idle geht. Dieser Timer wird das System aufwecken, cron neu planen und dann cronfork() aufrufen, um die neue Aufgabe zu erstellen.

Weitere ähnliche Mechanismen sind cpufreq, cpuidle, kernel/power usw.

Die Wahrheit ist immer Ziel/subjektive und schon gar nicht globale.Zeigen Sie mir die metric für die Wahrheit und ich kann Ihnen die Wahrheit zeigen.

0

setzen Sie einfach die CPU-Flagge wie unten Code nach dem Erstellen des Threads.

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

Dies ist für Thread aufwachen, nicht für CPU-Wakeup. Das PF_WAKE_UP_IDLE-Flag ist im Linux-Kernel 3.18 und höher nicht vorhanden. – Zhifei

0

Blick auf select_task_rq_fair(), die CFS :: select_task_rq() -Methode ist. Dies ist der am meisten repräsentative Fall, in dem der Scheduler die Leerlaufaufgabe zum erneuten Ausbalancieren von Laufwarteschlangen aktiviert.

0

smp_send_reschedule() sendet IPI_RESCHEDULE an den Prozessor, der im Leerlauf ist. Dies wird von wfi aufwachen. Es wird von einigen Orten aufgerufen, ein Beispiel ist wake_up_process -> try_to_wake_up -> try_to_wake_up -> ttwu_queue -> ttwu_queue_remote (Funktionsnamen aus Kernel 3.4).