Wie kommt es, dass RTOS als deterministisch angesehen werden?

8

Auf einem PC (natürlich einem Betriebssystem) wird jedes C-Programm hinsichtlich des Timings unbestimmt. Zum Beispiel dauert eine Schleife zwischen 1,2 und 1,3 Sekunden, je nachdem, "wie schnell ich ein anderes Fenster bewege". Dies liegt daran, dass das Betriebssystem Prozesse (oder Threads) die Verarbeitungsleistung gemeinsam nutzt.

Was RTOSs betrifft (auf einem eingebetteten System), wenn wir eine Multithreading-Anwendung schreiben, denke ich, dass dasselbe passiert, abhängig davon, wie viele Threads gleichzeitig ausgeführt werden.

Ich habe keine Instrumente, um dies auf einem eingebetteten System genau zu testen. Also wollte ich fragen. Ist meine Sorge vernünftig oder fehlt mir etwas sehr Grundlegendes?

EDIT : Ich werde ein Beispiel geben. Wir haben Aufgabe1 (dauert 10 ms) und Aufgabe2 (dauert 20 ms). Sie begannen gleichzeitig mit zwei getrennten Threads. Meine Behauptung (auch besorgniserregend, nicht sicher) ist, dass Aufgabe1 mehr als 10 ms dauert, da sie die Verarbeitungsleistung mit Aufgabe2 teilen.

Ozgur
quelle
Der Determinismus beinhaltet die Einstellung (und das Timing) der Eingaben
PlasmaHH
3
Ihnen fehlt die Definition von RTOS. ;-)
DrFriedParts
1
Ein RTOS wird nicht zum Ausführen einzelner Aufgaben verwendet, die die individuellen Timing-Anforderungen erfüllen müssen. Es wird zum Ausführen eines Systems verwendet, das als Ganzes alle Timing-Anforderungen erfüllen muss. Deterministisch bedeutet nicht "unabhängig von allen Umständen", sondern "wenn ich die Umstände hinreichend gut kenne (was definitiv Aufgaben mit höherer Priorität einschließt), kann ich eine Obergrenze vorhersagen."
Wouter van Ooijen

Antworten:

6

Es ist nicht wahr, dass Aufgaben in einem RTOS automatisch deterministisch sind, aber es ist möglich, viel strengere Einschränkungen dafür festzulegen, wann und wie oft Aufgaben ausgeführt werden. Ein RTOS sieht normalerweise harte Prioritäten für Aufgaben vor. Die Bereitschaftsaufgabe mit der höchsten Priorität wird jederzeit ausgeführt. Der Autor des Codes hat auch die vollständige Kontrolle darüber, welche Aufgaben ausgeführt werden. Sie können davon ausgehen, dass es keine Hintergrundaufgaben mit hoher Priorität gibt, die Ihren Code unterbrechen könnten, um beispielsweise Daten auf die Festplatte auszutauschen, es sei denn, Sie haben sie geschrieben.

Darüber hinaus ermöglichen einige RTOS kooperatives Multitasking. Im Gegensatz zum präemptiven Multitasking wird beim kooperativen Multitasking eine Aufgabe so lange ausgeführt, bis sie freiwillig die Kontrolle über die CPU aufgibt.

Nick Johnson
quelle
10

Was RTOSs betrifft (auf einem eingebetteten System), wenn wir eine Multithreading-Anwendung schreiben, denke ich, dass dasselbe passiert, abhängig davon, wie viele Threads gleichzeitig ausgeführt werden.

NEE!

In diesem Fall handelt es sich nicht um ein REAL-TIME OS (RTOS).

Die kurze Antwort lautet, dass die Definition eines RTOS nichts mit Multitasking oder Priorität zu tun hat. Es ist einfach so, dass alle Aufgaben Zeitgarantien haben .

Der Rest von dem, was man bedenkt Eigenschaften eines RTOS (Priorisierung, Aufgabenerfüllung, etc.) sind nur Folgen (oder Funktionen) sein , der Aufbau eines Systems , wo Aufgaben müssen innerhalb des festgelegten Zeitintervall beenden.

Multitasking in einem RTOS ist konzeptionell einfacher als in einem Soft-Time-Betriebssystem, da viele der komplizierten Edge-Cases im Wesentlichen nicht zulässig sind.

DrFriedParts
quelle
Wenn also Aufgabe1 10 ms und Aufgabe2 separat 20 ms dauert. Wenn sie gleichzeitig ausgeführt werden (als zwei separate Threads), wären sie in 10 ms bzw. 20 ms immer noch vollständig?
Ozgur
2
In der Tat besteht der Sinn eines RTOS darin, zu erzwingen, dass Aufgaben mit niedriger Priorität nicht gleichzeitig mit Aufgaben mit hoher Priorität ausgeführt werden.
pjc50
1
@ pjc50 - Ich denke, Ihr Kommentar ist der kritische Punkt, der möglicherweise verloren geht. Die Frage enthält ein grundlegendes Missverständnis. Es gibt keine ‚Aufgabe 1 gestartet und Task 2 gestartet zugleich ‘; Eine Aufgabe mit höherer Priorität (T1) stoppt / beendet eine Aufgabe mit niedrigerer Priorität (T2), bis T1 beendet ist, oder sie wird von einer Aufgabe mit noch höherer Priorität (T0) vorbelegt. Es ist klar, dass kein Betriebssystem Aufgaben auf magische Weise aktivieren kann, die mehr als die verfügbaren Ressourcen benötigen, um ihre Ressourcenbeschränkungen für Timing, Speicherplatz usw. zu erfüllen.
Gbulmer
2
"Kein Betriebssystem kann auf magische Weise Aufgaben aktivieren, die mehr als die verfügbaren Ressourcen benötigen" - in der Tat nicht. Mit einem echten RTOS können Sie jedoch im Voraus feststellen , ob garantiert ist, dass alle Ihre Einschränkungen erfüllt werden.
JimmyB
1
@ozgur: Sie verstehen die Anwendungen, die unter RTOS ausgeführt werden, falsch. Anstatt zwei Aufgaben zu haben, die 10 ms und 20 ms dauern, haben Anwendungen unter RTOS normalerweise Aufgaben, die jeweils 0,01 ms dauern, aber Aufgabe 1 muss ALLE 10 ms ausführen und Aufgabe 2 muss ALLE 20 ms ausführen. Normalerweise lassen wir in Echtzeitanwendungen Threads niemals parallel laufen, um die CPU-Leistung gemeinsam zu nutzen. Stattdessen führen wir einen Thread so kurz wie möglich aus und lassen ihn dann schlafen. Der Punkt des RTOS ist, dass es Garantien gibt, dass wenn ich ihn auffordere, mich in 10
ms
6

Ein RTOS garantiert normalerweise keinen Durchsatz , sondern ermöglicht Ihnen die Garantie der Latenz .

Dies wird normalerweise durch ein Prioritätssystem erreicht, wie hier in FreeRTOS:

Der FreeRTOS-Scheduler stellt sicher, dass Aufgaben im Status "Bereit" oder "Wird ausgeführt" immer Prozessorzeit (CPU) zugewiesen wird, anstatt Aufgaben mit niedrigerer Priorität, die sich ebenfalls im Status "Bereit" befinden. Mit anderen Worten, die Aufgabe, die in den Status "Ausführen" versetzt wird, ist immer die Aufgabe mit der höchsten Priorität, die ausgeführt werden kann.

Angenommen, Sie haben eine Aufgabe mit Priorität 1, die 10 ms für die Behandlung eines Ereignisses benötigt, eine Aufgabe mit Priorität 2, die 100 ms für die Behandlung eines anderen Ereignisses benötigt, und eine Aufgabe mit Hintergrundpriorität 3. Wenn Sie erwarten, dass ein Ereignis mit Priorität 1 nicht mehr als jede Sekunde angezeigt wird , können Sie sagen, dass der schlechteste Fall für die Behandlung eines Ereignisses mit Priorität 2 10 ms + 100 ms ist. Die Aufgabe mit Priorität 3 kann durch Ereignisse willkürlich verlangsamt werden, aber es ist Ihnen egal - weil sie eine niedrige Priorität hat.

pjc50
quelle
Werden in Ihrem Beispiel Task mit Priorität 1 und Task mit Priorität 2 gleichzeitig ausgeführt (zwei Threads wurden gleichzeitig gestartet)?
Ozgur
1
Möglicherweise ja, oder die Priorität 1 beginnt, während die Priorität 2 ausgeführt wird. In diesem Beispiel wird eine einzelne CPU angenommen. Beachten Sie, dass die Beispielspezifikation auch die Anzahl der P1-Tasks begrenzt, die ausgeführt werden können. Wenn Sie alle 10 ms ein P1-Ereignis erhalten und die Verarbeitung 10 ms dauert, wird nie etwas anderes ausgeführt .
pjc50
Okay, hier ist meine Frage. Task1 (10 ms) wurde gleichzeitig gestartet Task2 (100 ms) wurde gestartet. Ich glaube, Aufgabe 1 dauert mehr als 10 ms, da sie die Rechenleistung mit Aufgabe 2 teilen. Ich hoffe, ich habe mich klar ausgedrückt.
Ozgur
Ich denke, der Punkt ist, dass der Scheduler Aufgabe 1 und 2 nicht gleichzeitig ausführen wird. Es wird zuerst Aufgabe 1 (höhere Priorität) ausführen und Aufgabe 2 in die Warteschlange stellen.
10 ms
1
Ja, die Ausführung von Task1 und Task2 wird nicht verschachtelt. Wenn eine P1-Aufgabe ausgeführt werden kann, werden keine P2-Aufgaben geplant, bis sie abgeschlossen sind. Wenn eine P2-Aufgabe bereits ausgeführt wird, wird sie vorbelegt und angehalten, bis alle P1-Arbeiten abgeschlossen sind.
pjc50
4

Ich möchte lieber, dass dies ein Kommentar ist, aber es werden zu viele Zeichen benötigt. Wie auch immer, Ozgur, nach den Fragen in Ihren Kommentarantworten zu urteilen, scheint Ihnen der Punkt zu fehlen, dass Sie nicht einfach sagen können, dass mein Thread so lange dauert, und erwarten, dass er dank des Betriebssystems auf magische Weise in Verbindung mit anderen Threads funktioniert. Sie müssen Ihre Threads entwerfen und auf die Leistung im ungünstigsten Fall analysieren. Wenn der Worst-Case Ihren Anforderungen nicht entspricht, müssen Sie Ihre Threads neu gestalten.

Anstatt einfach zu sagen, dass Thread 1 10 ms dauert und Thread 2 20 ms dauert, müssen Sie auch sagen, dass Thread 1 alle 15 ms ausgeführt werden muss. Thread 2 muss alle 40 ms ausgeführt werden. Thread 3 muss alle 500 ms ausgeführt werden, Thread N muss alle 1500 ms ausgeführt werden. Anschließend legen Sie fest, wie lange es dauern kann, bis jeder Thread im schlimmsten Fall abgeschlossen ist. Sie setzen all das zusammen, identifizieren die schlimmsten Szenarien und müssen dann sicherstellen, dass jeder Thread seine Timing-Anforderungen erfüllt. In dieser Analyse können Sie auch feststellen, ob einige Threads eine höhere Priorität als andere haben müssen, um ihre Timing-Anforderungen zu erfüllen.

Zum Beispiel wird Thread5 ausgeführt und von Thread 4 unterbrochen, der von Thread 3 unterbrochen wird, der von ThreadN unterbrochen wird. Dies könnte ein Worst-Case-Szenario sein. Sie stellen dies alles auf eine Zeitachse und stellen sicher, dass auch in diesem schlimmsten Fall jeder Thread seine Zeitanforderungen erfüllt. Sie können sicherstellen, dass die Threads dieses Worst-Case-Szenario deterministisch abschließen, indem Sie den Scheduler und die Prioritäten in einem Echtzeitbetriebssystem verwenden. Dieser Determinismus macht ein Echtzeit-Betriebssystem aus.

Wenn Sie Threads die gleiche Priorität geben, haben Sie einen Teil (wenn nicht alle) dieses Determinismus verloren, da der Scheduler möglicherweise frei wählen kann, welchen Thread er als Nächstes ausführen möchte.

In einem Betriebssystem wie Windows können Sie nicht nur nicht angeben, wann jeder Thread ausgeführt wird, sondern auch nicht garantieren, dass Ihre Anwendung zu einem beliebigen Zeitpunkt ausgeführt wird. Das Betriebssystem kann Ihre Anwendung anhalten und jederzeit einen Hintergrunddienst ausführen. Mit anderen Worten, es gibt keinen Determinismus. Daher ist Windows kein Echtzeitbetriebssystem. Wenn Ihre Timing-Anforderungen jedoch hoch sind (Thread1 wird alle 10 Sekunden ausgeführt, Thread2 wird alle 15 Sekunden ausgeführt), können Sie Windows im Wesentlichen wie ein Echtzeitbetriebssystem behandeln, solange Sie den Slop berücksichtigen und ungefähr alle 10 oder 15 Sekunden (Geben oder Nehmen Sie ein paar hundert Millisekunden und ein gelegentlich fehlendes Fenster) ist gut genug.

Dunk
quelle
1

Obwohl andere Antworten besagten, dass in der "realen Welt" Ihr Szenario nicht möglich ist, müssen wir ein hypothetisches System aufbauen, um Ihre Frage beantworten zu können .

Unser System besteht aus einer Waffe, die Bälle mit gleichmäßiger Geschwindigkeit schießt, zwei Kisten, die die Bälle "fangen" und mit jedem gefangenen Ball einen Schritt vorrücken. Die Waffe kann auf Feuer in einer der Boxen umgeschaltet werden, verliert jedoch bei jedem Umschalten eine Kugel. Die erste Box benötigt 1000 Schritte (Bälle), um ihr Ende zu erreichen, und Box 2 benötigt 2000.

Szenario 1 (Aufgaben nacheinander):
- Die Waffe schießt 1000 Bälle auf Box 1, wechselt (kostet 1 Ball) und schießt 2000 Bälle auf Box 2, was insgesamt 3001 Bällen entspricht .

Szenario 2 (Aufgaben "gleichzeitig"):
- Die Waffe schießt 5 Bälle auf eine Box, wechselt und schießt 5 Bälle auf die andere Box, um den Anschein von Gleichzeitigkeit zu erwecken . Die Schaltkosten betragen (1000/5 x 2 =) 400 Bälle. Nach dem Schießen von 2400 Bällen erreicht Box 1 sein Ende und Box 2 benötigt zusätzliche 1000 Bälle, um sein Ende zu erreichen, was insgesamt 3400 Bällen entspricht .

Wenn Sie diese Ergebnisse auf Ihr Szenario anwenden, werden Aufgabe 1 und die erste Hälfte von Aufgabe 2 nach 24 ms abgeschlossen, und die zweite Hälfte von Aufgabe 2 wird in weiteren 10 ms für insgesamt 34 ms abgeschlossen. Dies zeigt deutlich, dass die zum Ausführen der Aufgaben erforderliche Zeit aufgrund des Zeitverlusts beim Wechseln zwischen Aufgaben zunimmt . Diese Ergebnisse sind auch äquivalent zu Aufgabe 1 Mitnahmen 12ms und Aufgabe 2 Mitnahmen 22ms, zu vervollständigen.

Guill
quelle
Upvoted. Diese Erklärung machte meine Frage klarer und die Antwort ist offensichtlich.
Ozgur