2013-10-04 7 views
5

Ich habe über Linux Kernel und CFS Scheduler im Kernel gelesen. Ich bin auf vruntime (virtuelle Laufzeit) gestoßen, das ist das Kernkonzept hinter CFS Scheduler. Ich lese von "Linux Kernel Entwicklung" und auch von anderen Blogs im Internet, konnte aber nicht die grundlegenden Berechnungen hinter dem vruntime verstehen. Ist vruntime zu einem bestimmten Prozess gehören oder gehört es zu einer Gruppe von Prozess mit dem gleichen nette Werte. Was ist der Gewichtungsfaktor und wie wird er berechnet? Ich habe all diese Konzepte durchgegangen, konnte es aber nicht verstehen. Was ist der Unterschied zwischen vruntime und * min_vruntime *?Was ist das Konzept von Vruntime in CFS

Antwort

9

vruntime ist per-thread; Es ist ein Mitglied, das in task_struct verschachtelt ist.

Im Wesentlichen ist vruntime ein Maß für die "Laufzeit" des Threads - die Zeit, die es auf dem Prozessor verbracht hat. Der Kern von CFS ist es, allen gerecht zu sein. Daher läuft die Algo-Art auf eine einfache Sache hinaus: (unter den Aufgaben einer gegebenen Runqueue) ist die Aufgabe mit der niedrigsten Vruntime die Aufgabe, die am meisten verdient, zu laufen, daher wähle sie als "nächste" aus. (Die tatsächliche Implementierung erfolgt mit einem RBTree für Effizienz).

Unter Berücksichtigung verschiedener Faktoren - wie Priorität, netter Wert, Cgroups usw. - ist die Berechnung von vruntime nicht so einfach wie ein einfaches Inkrement. Ich würde vorschlagen, den relevanten Abschnitt in "Professional Linux Kernel Architecture", Mauerer, Wrox Press zu lesen - es wird sehr ausführlich erklärt.

Pl siehe unten einen kurzen Versuch, etwas davon zusammenzufassen.

Andere Ressource: Documentation/scheduler/sched-design-CFS.txt

Quick Zusammenfassung - vruntime Berechnung: (basierend auf dem Buch)

  • Die meiste Arbeit in kernel/sched_fair.c getan wird: __ update_curr ()

  • Angerufener Timer Tick

  • Updates die physische und virtuelle Zeit ‚aktuelle‘ hat auf dem Prozessor nur ausgegeben

  • Für Aufgaben, die auf Standard-Priorität ausgeführt werden, das heißt, schön Wert 0, verbrachte die physische und virtuelle Zeit ist

  • identisch

    Nicht also für Aufgaben auf anderen Prioritätsstufen (nett); somit wird die Berechnung der vruntime durch die Priorität des Stroms beeinflusst, der einen Lastgewichtungsfaktor verwendet

    delta_exec = (unsigned lang) (jetzt - curr-> exec_start); // ... delta_exec_weighted = calc_delta_fair (delta_exec, curr); curr-> vruntime + = delta_exec_gewichtet;

einige Runden und Überlaufprüfung Vernachlässigt, was calc_delta_fair tut, ist zu den Wert durch die folgende Formel berechnen:

delta_exec_weighed = delta_exec * (NICE_0_LOAD/curr->load.weight) 

Die Sache ist, wichtigere Aufgaben (diejenigen mit einem niedrigen nice-Wert) wird größere Gewichte haben; Mit den obigen Gleichungen wird also die für sie berechnete Vruntime kleiner sein (so dass sie auf der RBTe mehr in die Warteschlange eingereiht werden!).

+0

Was ist der Zweck der min_vruntime? – iammurtaza

+0

@iammurtaza: Die min vruntime (ich nehme den einstellbaren/proc/sys/kernel/sched_min_granularity_ns) ist normalerweise (auf dem letzten Ubuntu mindestens) ~ 2.25ms. Wenn dies nicht der Fall wäre, könnten zwei Tasks alle paar Mikrosekunden an und von dem Prozessor "pingen". Eine Mindestgarantie für den Verbleib in der CPU ist erforderlich, um dieses Thrash-Verhalten zu mildern. – kaiwan

1

Die Vruntime ist die virtuelle Laufzeit eines Prozesses, mit dem Sie verfolgen können, wie viel Zeit ein Prozess ausgeführt hat. Die vruntime ist ein Mitglied der in include/linux/sched.h definierten Sched_entity-Struktur.

Die min_vruntime repräsentiert die minimale vruntime einer cfs runqueue. Sie stellt das Minimum aller vruntime der Prozesse dar, die in dieser cfs-Runqueue eingeplant sind. Die min_vruntime ist ein Member der cfs_rq-Struktur, definiert in include/linux/sched.h

Der Zweck von min_vruntime ist die Auswahl des nächsten Prozesses in der cfs runqueue zur Ausführung. Um allen Prozessen gerecht zu werden, wählt der CFS-Scheduler den Prozess mit der minimalen vruntime aus, die zuerst ausgeführt werden soll.

Der Link include/linux/sched.h ist http://lxr.free-electrons.com/source/include/linux/sched.h

Verwandte Themen