Die vruntime ist die virtuelle Laufzeit eines Prozesses, die beim Nachverfolgen hilft, wie lange ein Prozess ausgeführt wurde. Die vruntime ist ein Mitglied der sched_entity-Struktur, die in include/linux/sched.h
definiert istDie min_vruntime stellt die minimale vruntime einer cfs-Runqueue dar. Sie stellt das Minimum aller vruntime der Prozesse dar, die in dieser cfs-Runqueue geplant sind. Die min_vruntime ist ein Mitglied der cfs_rq-Struktur, die in include/linux/sched.h
definiert istDer Zweck von min_vruntime besteht darin, den nächsten auszuführenden Prozess in der cfs-Runqueue auszuwählen. Um fair gegenüber allen Prozessen zu sein, wählt der CFS-Scheduler den Prozess mit der minimalen Vruntime aus, der zuerst ausgeführt wird.
Der Link zu include/linux/sched.h lautet:https://elixir.bootlin.com/linux/latest/source/include/linux/sched.h
vruntime ist pro Thread; es ist ein Mitglied, das in task_struct verschachtelt ist.
Vruntime ist im Wesentlichen ein Maß für die "Laufzeit" des Threads - die Zeit, die er auf dem Prozessor verbracht hat. Der springende Punkt bei CFS ist es, fair zu allen zu sein; Daher läuft der Algo auf eine einfache Sache hinaus:(unter den Aufgaben in einer bestimmten Runqueue) ist die Aufgabe mit der niedrigsten Vruntime die Aufgabe, die es am meisten verdient, ausgeführt zu werden, wählen Sie sie daher als "nächste" aus. (Die eigentliche Implementierung erfolgt aus Effizienzgründen mit einem rbtree).
Unter Berücksichtigung verschiedener Faktoren – wie Priorität, netter Wert, Cgroups usw. – ist die Berechnung der vruntime nicht so einfach wie ein einfaches Inkrement. Ich würde vorschlagen, den entsprechenden Abschnitt in "Professional Linux Kernel Architecture", Mauerer, Wrox Press zu lesen - er wird sehr detailliert erklärt.
Siehe unten einen kurzen Versuch, einiges davon zusammenzufassen.
Weitere Ressourcen:Documentation/scheduler/sched-design-CFS.txt
Kurze Zusammenfassung - vruntime-Berechnung: (basierend auf dem Buch)
-
Die meiste Arbeit wird in kernel/sched_fair.c:__update_curr()
erledigt -
Angerufen bei Timer-Tick
-
Aktualisiert die physische und virtuelle Zeit, die 'current' gerade auf dem Prozessor verbracht hat
-
Für Aufgaben, die mit der Standardpriorität ausgeführt werden, d. h. mit dem netten Wert 0, ist die physische und die virtuelle aufgewendete Zeit identisch
-
Nicht so für Aufgaben auf anderen (netten) Prioritätsebenen; daher wird die Berechnung der vruntime durch die Priorität des Stroms unter Verwendung eines Lastgewichtungsfaktors beeinflusst
delta_exec =(unsigned long)(now – curr->exec_start);// ...delta_exec_weighted =calc_delta_fair(delta_exec, curr);curr->vruntime +=delta_exec_weighted;
Unter Vernachlässigung einiger Rundungs- und Überlaufprüfungen berechnet calc_delta_fair den durch die folgende Formel gegebenen Wert:
delta_exec_weighed = delta_exec * (NICE_0_LOAD / curr->load.weight)
Die Sache ist die, dass wichtigere Aufgaben (diejenigen mit einem niedrigeren netten Wert) größere Gewichte haben; daher wird ihnen durch die obigen Gleichungen die zugerechnete vruntime kleiner sein (wodurch sie weiter links im rbtree eingereiht werden!).