it-swarm.com.de

echtzeitplanung in Linux

Heute Morgen habe ich über die Echtzeitplanung von Linux gelesen. Gemäß dem Buch "Linux-Systemprogrammierung von Robert Love" gibt es dort zwei Hauptpläne. Einer ist SCHED_FIFO, Fifo und der zweite ist SCHED_RR, der Round Robin. Und ich habe verstanden, wie ein Fifo- und ein Rr-Algorithmus funktionieren. Aber da wir den Systemaufruf haben,

sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp)

wir können die Zeitplanungsrichtlinie für unseren Prozess explizit festlegen. In einigen Fällen können zwei von root ausgeführte Prozesse unterschiedliche Zeitplanungsrichtlinien haben. Als einen Prozess mit SCHED_FIFO und einen anderen mit SCHED_RR und mit derselben Priorität. Welcher Prozess wird dann zuerst ausgewählt? der FIFO klassifizierte Prozess oder der RR klassifizierte Prozess? Warum?

Betrachten Sie diesen Fall. Es gibt drei Prozesse A, B, C. Alle haben die gleiche Priorität. A und B sind RR-klassifizierte Prozesse und C ist FIFO. A und B sind lauffähig (beide laufen also abwechselnd in einem Zeitintervall). Und momentan läuft A. Jetzt wird C lauffähig. In diesem Fall ob

1. A will preempt for C, or
2. A will run until its timeslice goes zero and let C run. Or
3. A will run until its timeslice goes zero and let B run.
   a) here after B runs till its timeslice becomes zero and let C run or
   b) after B runs till its timeslice becomes zero and let A run again (then C will starve untill A and B finishes)
20
theB

In der Echtzeitplanung haben FIFO und RR nicht genau dieselbe Bedeutung wie bei der Nicht-Echtzeitplanung. Prozesse werden immer auf FIFO-Weise ausgewählt, jedoch ist das Zeitquantum für SCHED_FIFO im Gegensatz zum Zeitquantum für SCHED_RR nicht begrenzt.

SCHED_FIFO-Prozesse setzen SCHED_RR-Prozessen derselben Priorität nicht voraus.

sched_setscheduler (2) - Linux-Manpage

...

"Die Zeitplanungsrichtlinie eines Prozesses bestimmt, wo er in die Liste der Prozesse mit gleicher statischer Priorität eingefügt wird und wie er sich innerhalb dieser Liste bewegt. Alle Zeitpläne sind vorrangig: Wenn ein Prozess mit einer höheren statischen Priorität zur Ausführung bereit ist, wird der derzeit ausgeführte Prozess ausgeführt Der Prozess wird unterbunden und für die statische Prioritätsstufe an die Warteliste zurückgegeben. Die Planungsrichtlinie bestimmt nur die Reihenfolge innerhalb der Liste der ausführbaren Prozesse mit gleicher statischer Priorität. "

...

"Ein SCHED_FIFO-Prozess wird ausgeführt, bis er entweder von einer E/A-Anforderung blockiert wird, von einem Prozess mit höherer Priorität abgelehnt wird oder dass sched_yield (2) aufgerufen wird."

...

"Wenn ein SCHED_FIFO-Prozess lauffähig wird, wird er am Ende der Liste mit Priorität eingefügt."

...

"SCHED_RR: Round Robin-Planung

SCHED_RR ist eine einfache Erweiterung von SCHED_FIFO. Alles, was oben für SCHED_FIFO beschrieben wurde, gilt auch für SCHED_RR, mit der Ausnahme, dass jeder Prozess nur für ein maximales Zeit-Quantum ausgeführt werden darf. Wenn ein SCHED_RR-Prozess für einen Zeitraum läuft, der gleich oder länger als das Zeitquantum ist, wird er am Ende der Liste mit Priorität gesetzt. Ein SCHED_RR-Prozess, der durch einen Prozess mit höherer Priorität abgelöst wurde und anschließend die Ausführung als laufenden Prozess fortsetzt, wird den nicht abgelaufenen Teil seines Round-Robin-Zeit-Quantums vervollständigen. "

14
svenfx

man sched_setscheduler erläutert diese Planungsrichtlinien ausführlich.

In diesem speziellen Fall wird keiner der beiden Echtzeitprozesse den anderen vorziehen, da beide die gleiche Priorität haben. Ein SCHED_FIFO -Prozess wird ausgeführt, bis er sich selbst blockiert. Ein SCHED_RR -Prozess wird ausgeführt, bis er sich selbst blockiert oder sein Zeitquant abläuft.

10

Nach der Manpage denke ich, 1 ist die Antwort. A, B sind RR-Richtlinien, C sind FIFO Richtlinien. Da RR auch ein Erweiterungs-FIFO ist, sind alle von ihnen Klasse FIFO.

Da alle dieselbe Priorität haben und die Manpage "Ein Aufruf von sched_setscheduler () oder sched_setparam (2) setzt den durch pid identifizierten Prozess SCHED_FIFO (oder SCHED_RR) an den Anfang der Liste, wenn er ausführbar war Infolgedessen wird der aktuell ausgeführte Prozess möglicherweise vorgezogen, wenn er dieselbe Priorität hat. (POSIX.1-2001 gibt an, dass der Prozess an das Ende der Liste gelangen soll.)

Sobald sched_setscheduler aufgerufen wird, um die Richtlinie von C als FIFO festzulegen, gibt C A frei.

1
annabel1832

Ich verstehe die zwei verschiedenen Klassen so, dass ein Prozess SCHED_FIFO vom Kernel niemals vorbelegt wird. Auch wenn ein anderer "SCHED_FIFO" -Klassenprozess wartet, bis er an der Reihe ist ...

Während sich die SCHED_RR-Richtlinie die CPU-Ressourcen ein wenig mehr teilt. Der Scheduler lässt den SCHED_RR-Prozess für eine bestimmte Zeitspanne laufen, bevor er ihn vorbelegt, um einen weiteren SCHED_RR-Prozess zu aktivieren. Das ist genau Round Robin.

SCHED_FIFO ist "stärker" in dem Sinne, dass, wenn ein SCHED_FIFO-Prozess dem Kernel niemals nachgibt () oder einen Systemaufruf auf einem Single-Core-Gerät aufruft, alle Ihre anderen Echtzeitprozesse möglicherweise niemals ausgeführt werden.

0
yves Baumes