Wie funktioniert sched_setaffinity() arbeiten?
Ich versuche zu verstehen, wie die linux-syscall-sched_setaffinity() funktioniert. Dies ist ein follow-on aus meine Frage hier.
Habe ich diese Anleitung, die erläutert, wie die syscall-und hat eine Recht ordentliche (arbeiten!) Beispiel.
Also ich habe die Linux 2.6.27.19 kernel-Quellen.
Habe ich ein 'grep' für Linien, die mit diesem syscall, und ich bekam die 91 Ergebnisse. Nicht vielversprechend.
Letztendlich bin ich aber versuchen zu verstehen, wie der kernel ist in der Lage, den instruction pointer für einen bestimmten Kern (oder Prozessor.)
Ich bin vertraut mit, wie die single-core-single-thread-Programme arbeiten. Man könnte Ausgabe ein "jmp foo' instruction, und das ist im Grunde legt die IP mit der Speicheradresse von 'foo' label. Aber wenn man mehrere Kerne hat man zu sagen, "Holen sich die nächste Instruktion in Speicher-Adresse foo, und setzen Sie den instruction-pointer für core Nummer 2 zu beginnen Ausführung."
Wo, in den Assembler-code, werden wir angeben, welche Kern führt, dass die operation?
Zurück zu den kernel-code: was ist hier wichtig? In der Datei 'kernel/sched.c' hat eine Funktion sched_setaffinity(), gibt aber den Typ "long" - was im Widerspruch mit seiner Handbuch Seite. Also, was ist hier wichtig? Welche dieser Module zeigt die Montage Anweisungen erteilt? Was Moduls ist das Lesen der 'task_struct' Blick auf die 'cpus_allowed" Mitglied, und dann übersetzen, dass in einer Anweisung? (Hab ich auch blätterte in der glibc-source - aber ich denke, es macht einfach einen Aufruf der kernel-code, um diese Aufgabe zu erfüllen.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
sched_setaffinity()
einfach sagt der Planer, welche CPUs ist, dass der Prozess/thread ausgeführt werden darf, dann fordert ein re-schedule.Den scheduler eigentlich läuft das auf eine jede der CPUs, so dass es eine chance bekommt, zu entscheiden, welche Aufgabe als Nächstes ausgeführt, dass insbesondere auf die CPU.
Wenn du daran interessiert bist, wie können Sie tatsächlich rufen einige-code auf anderen CPUs, ich schlage vor, Sie nehmen einen Blick auf
smp_call_function_single()
. Im Beispiel möchten wir nennen so etwas auf einer anderen CPU, das erfordertgeneric_exec_single()
. Der letztere fügt einfach die Funktion auf der Ziel-CPU ' s call queue und Kräfte einer Terminänderung durch einige IPI Zeug (wenn die Warteschlange leer war).Bottom line ist: es gibt keine wirkliche SMP-Variante der
_jmp_
Unterricht. Stattdessen code läuft auf anderen CPUs arbeitet, um die Aufgabe zu erledigen.Ich denke, das, was Sie nicht verstehen ist, dass der kernel läuft auf alle die CPU-Kerne. Bei jedem timer-interrupt (~1000 pro Sekunde), wird der scheduler läuft auf jeder CPU und wählt einen Prozess zu führen. Es gibt keine CPU, die irgendwie sagt, die anderen, um zu starten einen Prozess.
sched_setaffinity()
funktioniert nur durch ankreuzen auf den Prozess. Der scheduler liest die flags und wird nicht ausgeführt, dass auf die CPU auf, wenn es nicht dafür eingestellt ist.Gibt es keine assembly aktiv beteiligt. Jede Aufgabe (thread) zugeordnet ist, eine einzelne CPU (oder Kern in Ihren Bedingungen) zu einem Zeitpunkt. Stoppen der Ausführung auf einem bestimmten Prozessor und fortsetzen auf einem anderen, der die Aufgabe hat zu "migrieren" (auch diese). Wenn eine Aufgabe migriert von einer CPU auf eine andere, den scheduler picks die CPU, die ist mehr im Leerlauf unter den CPUs erlaubt
sched_setaffinity()
.Gibt es keine Magie Montageanleitung ausgestellt. Der kernel hat eine low-level-Ansicht der hardware, jede CPU ist ein separates Objekt, ganz anders als das, wie es aussieht, für user-space-Prozesse (die im user-space, CPUs sind fast unsichtbar).
Check this out: B Bedienung-System-Programmier-Richtlinien