Unterschied zwischen angenehmen Prioritäten in Linux- und RT-Prioritäten

Unter Linux steuert der Scheduler, welcher Stream wie lange ausgeführt wird. Zwei widersprüchliche Anforderungen müssen berücksichtigt werden: Eingabe / Ausgabe und Rechenleitfähigkeit.

Die Ausführungsreihenfolge basiert auf der Richtlinie und Planung der Priorität jedes Threads. In Linux Version 2.2 ist eine Tabellenrichtlinie implementiert. Linux bietet 6 Richtlinien: SCHED_FIFO, SCHED_RR, SCHED_DEADLINE, SCHED_DEADLINE, SCHED_OTHER, SCHED_BATCH und SCHED_IDLE. Diese Richtlinien sind in zwei Gruppen unterteilt, mit Ausnahme von SCHED_DEADLINE. SCHED_OTHER, SCHED_IDLE und SCHED_BATCH gehören zur normalen Richtlinie, und SCHED_FIFO, SCHED_RR ist in Echtzeit. SCHED_DEADLINE-Themen sind spezielle und vorrangige Themen.

Jeder Thread hat einen Wert für "sched_priority" und Themen mit einem höheren Wert für "sched_priority" als andere. sched_priority wird manchmal als Echtzeitpriorität bezeichnet, da sie hauptsächlich zum Auswählen der Ausführungsreihenfolge von Threads mithilfe von Echtzeitrichtlinien verwendet wird. Normale Richtlinienlaufzeit table_priority-Werte sind 0, und der Wert der in Echtzeit verwendeten Themen beträgt normalerweise 1 bis 99. System. Der Wert von Sched_priority kann von der Funktion sched_setscheduler zusammen mit der Richtlinie festgelegt und von der Funktion sched_getscheduler überprüft werden.

Wenn der Wert Sched_priority Echtzeitflüssen entspricht, wird der Standardthread für andere Threads als guter Wert bezeichnet. Der Lieblingsbereich liegt zwischen -20 (hohe Priorität) und +19 (niedrige Priorität). Der Vergnügungswert kann durch eine nette Funktion oder eine Setpriority-Funktion eingestellt und durch die getpriority-Funktion überprüft werden.

Wie führt Linux Threads in Echtzeit und gemäß Ihren bevorzugten Prioritäten aus? In Echtzeit gibt es keine Einschränkungen für die Laufzeit, und Linux führt im Wesentlichen einen Thread mit dem höchsten Prioritätswert in Echtzeit aus, entweder bevor der Thread die Selbstausführung abschließt oder bevor ein Thread mit höherer Priorität verwendet wird. Dies führt jedoch häufig zu Problemen, denn wenn unerwünschte Echtzeitflüsse zu funktionieren beginnen und nie enden, können Sie sie nur stoppen, indem Sie zu anderen Prioritäten wechseln. Seit Version 2.6.25 gibt es also andere Funktionen, um unerwünschtes Echtzeit-Streaming zu stoppen, z. B. die Vorbegrenzung der Wiedergabezeit mithilfe von RLMIT_RTTIME. Eine sorgfältige Verwendung von Echtzeit wird jedoch nicht empfohlen, da Linux über ein intelligentes Planungssystem namens "Full Fair Planner" (CFS) für einfache Streams verfügt, das in Version 2.6.23 des Linux-Kernels eingeführt wurde. Das CFS bestimmt, welcher Thread wie lange ausgeführt werden soll.

CFS verwendet ein rot-schwarzes Baumdatensystem, einen der Binärbäume, für eine faire Planung. Das CFS hat einen Zeitplan für jede Aufgabe, und das CFS erstellt zur Laufzeit einen rot-schwarzen Baum von Aufgaben. Der Baum wird ausgewählt, um die Aufgabe mit der minimalen Ausführungszeit auszuführen. Nach der Implementierung fügt CFS der Task die Ausführungszeit hinzu und gibt sie entsprechend der Ausführungszeit an den rot-schwarzen Baum zurück. Auf diese Weise können Sie lange Schlafaufgaben ausführen, sobald Sie sie benötigen. Jedes Mal, wenn das CFS eine Aufgabe abschließt, muss es die Aufgabe an den Baum zurückgeben und nach der nächsten Aufgabe mit der minimalen Ausführungszeit suchen. Dies erfordert die Strukturierung von Daten, die selbst im schlimmsten Fall nicht lange halten. Dies ist einer der Gründe, warum ein roter Baum angenommen wird. Im rot-schwarzen Baum ist jeder Knoten rot oder schwarz, und die untergeordneten Knoten des roten Knotens sind immer schwarz. Noch wichtiger ist, dass jeder Pfad vom angegebenen Knoten zur nächsten Generation die gleiche Anzahl schwarzer Knoten enthält. Dies führt zu einem kritischen Merkmal des rot-schwarzen Baums, bei dem der Pfad von der Wurzel zum längsten Blatt doppelt so lang ist wie der Pfad von der Wurzel zum nächsten Blatt nicht doppelt so lang garantiert die schlechteste Zeit zum Betreten. , und O (log n) werden gelöscht und verwendet, um ihren Plan für CFS zu aktualisieren.

Nachdem wir nun wissen, wie CFS seine Ausführungsreihenfolge definiert, fahren wir mit der Definition von CFS für jede Ausführungszeit fort. Jede Ausführungszeit wird berechnet, indem das Gleichgewicht von 4 Faktoren berechnet wird: Zielwartezeit, minimale Granularität, erwartete Anzahl von Aufgaben und angenehme Werte von Aufgaben. Das Zielzeitlimit ist der Zeitpunkt, zu dem jede Aufgabe mindestens einmal ausgeführt werden muss. Die minimale Tiefe ist die kürzeste Ausführungszeit unterhalb der Ausführungszeit, was zu hohen Kosten für den Schaltkontext führt. Grundsätzlich wird das Zielzeitlimit gemäß den gewünschten Werten in jede Aufgabe unterteilt, sodass jede Aufgabe unter dem Minimum liegt. Eine hohe Ziellatenz führt zu längeren Laufzeiten, insbesondere für Aufgaben mit hoher Priorität, und maximale Granularität führt unabhängig von günstigen Werten zu einer gleichen Ausführungszeit.

Zusammenfassend ist der Unterschied zwischen einer angenehmen Priorität und einer Echtzeitpriorität wie folgt. Erstens, gute Priorität für normale Aufgaben, Echtzeitpriorität ist für Echtzeitaufgaben in einer klaren Sicht. Zweitens ist eine angenehme Priorität die Zeit, die für die Ausführung benötigt wird, und die Ausführungsreihenfolge, die vom CFS festgelegt werden muss. Andererseits ist die Echtzeitpriorität der Wert zum Bestimmen der Ausführungsreihenfolge, und das Timing der Aufgaben in Echtzeit ist nicht begrenzt, bis sie von anderen Aufgaben ausgeführt werden, die priorisiert sind. Obwohl beide als Priorität bezeichnet werden, gilt eine gute Priorität für die Zeit- und Echtzeit-Prioritätsreihenfolge.