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.
Antworten:
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.
quelle
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.
quelle
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:
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.
quelle
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.
quelle
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.
quelle