Echtzeit-Betriebssystem
A Echtzeit-Betriebssystem (RTOs) ist ein Betriebssystem (Os) für Echtzeit Anwendungen, die Daten und Ereignisse verarbeitet, die zeitliche Einschränkungen kritisch definiert haben. Ein RTOs unterscheidet sich von a Zeitteilung Betriebssystem wie UNIX, das die gemeinsame Nutzung von Systemressourcen mit einem Scheduler, Datenpuffer oder fester Aufgabenpriorisierung in einer Multitasking- oder Multiprogrammierungsumgebung verwaltet. Die Anforderungen an die Verarbeitungszeit müssen vollständig verstanden und gebunden sein, anstatt nur minimal aufbewahrt zu werden. Alle Verarbeitung muss innerhalb der definierten Einschränkungen auftreten. Echtzeit-Betriebssysteme sind ereignisgesteuert und PräventivDies bedeutet, dass das Betriebssystem in der Lage ist, die relevante Priorität von konkurrierenden Aufgaben zu überwachen und Änderungen an der Aufgabenpriorität vorzunehmen. Ereignisorientierte Systeme wechseln zwischen Aufgaben, die auf ihren Prioritäten basieren, während Zeitaustauschsysteme die Aufgabe basierend auf der Uhr schalten Interrupts.
Eigenschaften
Ein wesentliches Merkmal eines RTOs ist die Ebene seiner Konsistenz in Bezug auf die Zeit, die benötigt wird, um die Anwendung zu akzeptieren und zu vervollständigen Aufgabe; Die Variabilität ist 'Jitter'.[1] Ein "hartes" Echtzeit-Betriebssystem (Hard RTOS) hat weniger Jitter als ein "sanftes" Echtzeit-Betriebssystem (Soft RTOs). Eine späte Antwort ist eine falsche Antwort in einem harten RTOs, während eine späte Antwort in einem weichen RTOs akzeptabel ist. Das Hauptdesignziel ist nicht hoch Durchsatz, sondern eine Garantie von a weich oder hart Leistungskategorie. Ein RTOs, das normalerweise eine Frist einhalten kann oder im Allgemeinen einhalten kann deterministisch Es ist ein hartes Betriebssystem in Echtzeit.[2]
Ein RTOs hat einen fortgeschrittenen Algorithmus für Planung. Die Scheduler-Flexibilität ermöglicht eine breitere Computer-System-Orchestrierung von Prozessprioritäten, aber ein Echtzeit-Betriebssystem ist häufiger an einen engen Satz von Anwendungen gewidmet. Schlüsselfaktoren in einem Echtzeit-Betriebssystem sind minimal Latenz unterbrechen und minimal Latenzschaltwechsellatenz; Ein Echtzeit-Betriebssystem wird mehr dafür bewertet, wie schnell oder wie vorhersehbar es reagieren kann, als für die Menge an Arbeit, die es in einem bestimmten Zeitraum leisten kann.[3]
Siehe das Vergleich von Echtzeit-Betriebssystemen Für eine umfassende Liste. Siehe auch die Liste der Betriebssysteme Für alle Arten von Betriebssystemen.
Designphilosophien
Ein RTOs ist ein Betriebssystem, in dem die Zeit, die für den Verarbeiten eines Eingangsstimulus benötigt wird, geringer als die Zeit, die bis zum nächsten Eingangsstimulus desselben Typs abgelaufen ist.
Die häufigsten Designs sind:
- Ereignisgesteuert - Schalte Aufgaben Nur wenn ein Ereignis mit höherer Priorität gewartet werden muss; genannt präventive Prioritätoder vorrangige Planung.
- Time-Sharing-Schaltets auf einem regelmäßigen Takt-Interrupt und bei Ereignissen; genannt Runde Robin.
Zeitteilung Designs wechseln die Aufgaben öfter als streng benötigt, geben aber reibungsloser Multitaskingund geben der Illusion, dass ein Prozess oder ein Benutzer die alleinige Verwendung einer Maschine verwendet.
Frühzeitig CPU -Designs benötigte viele Zyklen, um Aufgaben zu wechseln, in denen die CPU nichts anderes nützlich sein konnte. Da das Umschalten so lange dauerte, versuchten frühe OSS, die Verschwendung der CPU -Zeit zu minimieren, indem unnötige Aufgabenschaltungen vermieden wurden.
Planung
In typischen Designs hat eine Aufgabe drei Staaten:
- Ausführen (Ausführung auf der CPU);
- Bereit (bereit, ausgeführt zu werden);
- Blockiert (auf ein Ereignis warten, zum Beispiel I/A).
Die meisten Aufgaben sind die meiste Zeit blockiert oder bereit, da im Allgemeinen nur eine Aufgabe gleichzeitig ausgeführt werden kann Zentralprozessor. Die Anzahl der Elemente in der Ready -Warteschlange kann je nach Anzahl der Aufgaben, die das System ausführen muss, und der Art des Schedulers, den das System verwendet, stark variieren. Bei einfacheren nicht preemptiven, aber dennoch Multitasking-Systemen muss eine Aufgabe ihre Zeit auf der CPU auf andere Aufgaben aufgeben, was dazu führen kann,Ressourcenhunger).
Normalerweise wurde die Datenstruktur der Bereitschaftsliste im Scheduler so konzipiert, dass die Zeit der schlimmsten Zeit im kritischen Abschnitt des Schedulers aufgewendet wird. Die Datenstruktur hängt auch von der maximalen Anzahl von Aufgaben ab, die sich auf der fertigen Liste befinden können.
Wenn es nie mehr als ein paar Aufgaben auf der fertigen Liste gibt, dann a doppelt verknüpfte Liste von Bereitschaftsaufgaben sind wahrscheinlich optimal. Wenn die Bereitschaftsliste normalerweise nur wenige Aufgaben enthält, aber gelegentlich mehr enthält, sollte die Liste nach Priorität sortiert werden. Auf diese Weise erfordert das Finden der höchsten Prioritätsaufgabe, die die gesamte Liste durchträgt. Das Einfügen einer Aufgabe erfordert dann das Gehen der Fertigliste, bis sie entweder das Ende der Liste oder eine Aufgabe mit niedrigerer Priorität als die der eingefügten Aufgabe erreicht haben.
Es muss darauf geachtet werden, während dieser Suche nicht die Präsentation zu hemmen. Längere kritische Abschnitte sollten in kleine Stücke unterteilt werden. Wenn ein Interrupt auftritt, der eine Aufgabe mit hoher Priorität während des Einsetzens einer Aufgabe mit niedriger Priorität bereitstellt, kann diese Aufgabe mit hoher Priorität eingefügt und unmittelbar vor der Einfügung der Aufgabe mit niedriger Priorität ausgeführt werden.
Die kritische Reaktionszeit, die manchmal als Flyback -Zeit bezeichnet wird, ist die Zeit, die es benötigt, um eine neue Bereitschaftsaufgabe zu starten und den Zustand der höchsten Prioritätsaufgabe für das Laufen wiederherzustellen. In einem gut konzipierten RTOs wird die Vorbereitung einer neuen Aufgabe pro Anweisungen pro refer-zahlreicher Eintritt 3 bis 20 erfolgen, und die Wiederherstellung der Bereitschaftsaufgabe mit höchster Priorität wird 5 bis 30 Anweisungen erfordern.
In fortgeschritteneren Systemen teilen sich Echtzeitaufgaben Computerressourcen mit vielen Aufgaben mit Nicht-Real-Zeit, und die fertige Liste kann willkürlich lang sein. In solchen Systemen wäre eine als verknüpfte Liste implementierte Scheduler -Ready -Liste unzureichend.
Algorithmen
Einige häufig verwendete RTOS -Planungsalgorithmen sind:
- Kooperative Planung
- Präventivplanung
- Rate-monotonische Planung
- Round-Robin-Planung
- Priorität vorbeugende Planung, eine Umsetzung von Präventive Zeitschneide
- Festpreisplanung mit aufgeschobener Präsentation
- Nicht preemptive Planung von Festpriorität
- Kritische Abschnitt vorbeugende Planung
- Statische Zeitplanung
- Erste Frist zuerst sich nähern
- Stochastisch Digraphen mit Multi-Threaded Graph Traversal
Kommunikation und Ressourcenaustausch in Verbindung
Ein Multitasking -Betriebssystem wie Unix ist arm bei Echtzeitaufgaben. Der Scheduler hat Arbeitsplätzen mit der niedrigsten Nachfrage auf dem Computer höchste Priorität. Daher gibt es keine Möglichkeit, sicherzustellen, dass ein zeitkritischer Job Zugriff auf genügend Ressourcen hat. Multitasking -Systeme müssen die Freigabe von Daten und Hardware -Ressourcen zwischen mehreren Aufgaben verwalten. In der Regel ist es für zwei Aufgaben unsicher, gleichzeitig auf dieselben spezifischen Daten oder Hardware -Ressource zuzugreifen.[4] Es gibt drei gemeinsame Ansätze, um dieses Problem zu lösen:
Zeitweise Maskieren/Deaktivieren von Interrupts
Allgemeine Betriebssysteme erlauben normalerweise keine Benutzerprogramme nicht zu maskieren (deaktivieren) Interrupts, weil das Benutzerprogramm die CPU so lange steuern könnte, wie es wünscht. Einige moderne CPUs erlauben es nicht Benutzermodus Code zur Deaktivierung von Interrupts als solche Steuerung wird als wichtige Betriebssystemressource angesehen. Viele eingebettete Systeme und RTOSS ermöglichen es jedoch, dass die Anwendung selbst in die Anwendung laufen Kernelmodus für größere Systemanruf Effizienz und auch den Antrag ermöglichen, eine bessere Kontrolle über die Betriebsumgebung zu haben, ohne dass eine OS -Intervention erforderlich ist.
Bei Single-Processor-Systemen ist eine Anwendung, die im Kernel-Modus und im Masking-Interrupts ausgeführt wird, die niedrigste Overhead-Methode, um den gleichzeitigen Zugriff auf eine gemeinsame Ressource zu verhindern. Während die Interrupts maskiert sind und die aktuelle Aufgabe keinen Blockierungs -Betriebssystemanruf macht, hat die aktuelle Aufgabe exklusiv Verwendung der CPU, da keine andere Aufgabe oder Interrupt die Kontrolle übernehmen kann, also die Kritischer Abschnitt ist geschützt. Wenn die Aufgabe ihren kritischen Abschnitt verlässt, muss sie Interrupts entlarven; Ausstehende Interrupts werden gegebenenfalls ausgeführt. Vorübergehende Maskieren von Interrupts sollten nur durchgeführt werden, wenn der längste Weg durch den kritischen Abschnitt kürzer ist als das gewünschte Maximum Latenz unterbrechen. Typischerweise wird diese Schutzmethode nur verwendet, wenn der kritische Abschnitt nur einige Anweisungen besteht und keine Schleifen enthält. Diese Methode ist ideal zum Schutz von Hardware-Bitkartierregistern, wenn die Bits durch verschiedene Aufgaben gesteuert werden.
Mutexes
Wenn die gemeinsame Ressource reserviert werden muss, ohne alle anderen Aufgaben zu blockieren (z. B. das Warten auf den Schreiben von Flash-Speicher), ist es besser, Mechanismen zu verwenden, die auch für allgemeine Betriebssysteme verfügbar sind, wie z. Mutex und os-sachdierte Interprozess-Messaging. Solche Mechanismen umfassen Systemanrufe und berufen normalerweise den Dispatcher -Code des Betriebssystems beim Ausgang auf, sodass sie in der Regel Hunderte von CPU -Anweisungen zum Ausführen benötigen, während Masking -Interrupts bei einigen Prozessoren nur eine Anweisung dauern.
A (nicht rekursives) Mutex ist entweder gesperrt oder freigeschaltet. Wenn eine Aufgabe den Mutex gesperrt hat, müssen alle anderen Aufgaben darauf warten, dass der Mutex von seinem entsperrt wird Eigentümer - Der ursprüngliche Thread. Eine Aufgabe kann eine Auszeit auf das Warten auf einen Mutex festlegen. Es gibt mehrere bekannte Probleme mit mustex-basierten Designs wie z. Prioritätsinversion und Deadlocks.
Im Prioritätsinversion Eine Aufgabe mit hoher Priorität wartet, da eine Aufgabe mit niedriger Priorität einen Mutex hat, aber die Aufgabe mit niedrigerer Priorität hat keine CPU -Zeit, um ihre Arbeit zu beenden. Eine typische Lösung besteht darin, die Aufgabe zu haben, die einen Mutex "Erben" die Priorität der höchsten Wartezeit besitzt. Dieser einfache Ansatz wird jedoch komplexer, wenn mehrere Ebenen warten: Aufgabe A wartet auf einen von der Aufgabe gesperrten Mustex B, was auf einen von der Aufgabe gesperrten Mustex wartet C. Um mit mehreren Vererbungsebenen zu handeln, wird ein anderer Code im Kontext mit hohem Priorität ausgeführt und kann somit den Hunger von Threads mit mittlerer Priorität verursachen.
In einem Sackgasse, zwei oder mehr Aufgaben sperren mustex ohne Zeitüberschreitungen und warten dann ewig auf das Mutex der anderen Aufgabe, wodurch eine zyklische Abhängigkeit erzeugt wird. Das einfachste Deadlock -Szenario tritt auf, wenn zwei Aufgaben abwechselnd zwei Mutex, jedoch in der entgegengesetzten Reihenfolge sperren. Deadlock wird durch sorgfältiges Design verhindert.
Nachrichtenübergang
Der andere Ansatz zur Ressourcenfreigabe besteht darin, dass Aufgaben Nachrichten in einem organisierten Senden senden Nachrichtenübergang planen. In diesem Paradigma wird die Ressource direkt von nur einer Aufgabe verwaltet. Wenn eine andere Aufgabe die Ressource befragen oder manipulieren möchte, sendet sie eine Nachricht an die Verwaltungsaufgabe. Obwohl ihr Echtzeitverhalten weniger knackig ist als Semaphor Systeme, einfache meldungsbasierte Systeme vermeiden die meisten Protokoll-Deadlock-Gefahren und sind im Allgemeinen besser verhandelt als Semaphor-Systeme. Probleme wie die von Semaphoren sind jedoch möglich. Prioritätsinversion kann auftreten, wenn eine Aufgabe an einer Niedrigprioritätsnachricht arbeitet und eine Meldung mit höherer Priorität (oder eine Meldung, die indirekt von einer Aufgabe mit hoher Priorität entsteht) in ihrer eingehenden Nachrichtenwarteschlange ignoriert. Protokoll -Deadlocks können auftreten, wenn zwei oder mehr Aufgaben aufeinander warten, um Antwortmeldungen zu senden.
Interrupte Handler und der Scheduler
Da ein Interrupt-Handler die höchste Prioritätsaufgabe blockiert, und dass Echtzeit-Betriebssysteme so konzipiert sind, dass die Latenz von Faden auf ein Minimum hält, werden Interrupt-Handler in der Regel so kurz wie möglich gehalten. Der Interrupt -Handler vertieft nach Möglichkeit die gesamte Interaktion mit der Hardware. Normalerweise ist alles, was notwendig ist, das Interrupt anzuerkennen oder zu deaktivieren (so dass es nicht wieder vorkommt, wenn der Interrupt -Handler zurückgibt) und eine Aufgabe zu benachrichtigen, die die Arbeit erledigt werden muss. Dies kann erledigt werden, indem eine Treiberaufgabe unterblockt wird, indem ein Semaphor veröffentlicht, ein Flag festgelegt oder eine Nachricht gesendet wird. Ein Scheduler bietet häufig die Möglichkeit, eine Aufgabe aus dem Interrupt -Handler -Kontext zu entsperren.
Ein Betriebssystem verwaltet Kataloge von Objekten, die es verwaltet, wie Threads, Mutexes, Speicher usw. Aktualisierungen dieses Katalogs müssen streng kontrolliert werden. Aus diesem Grund kann es problematisch sein, wenn ein Interrupt -Handler eine Betriebssystemfunktion aufruft, während die Anwendung auch im Akt ist. Die von einem Interrupt -Handler aufgerufene Betriebssystemfunktion könnte die Objektdatenbank aufgrund der Aktualisierung der Anwendung in einem inkonsistenten Zustand befinden. Es gibt zwei Hauptansätze, um dieses Problem zu lösen: die einheitliche Architektur und die segmentierte Architektur. RTOSS implementiert die Unified Architecture löst das Problem, indem sie einfach Interrupts deaktivieren, während der interne Katalog aktualisiert wird. Der Nachteil ist, dass die Interrupt -Latenz zunimmt und möglicherweise Interrupts verliert. Die segmentierte Architektur führt nicht direkte Betriebssystemanrufe, sondern delegiert das Betriebssystem an einen separaten Handler. Dieser Hundeführer läuft mit einer höheren Priorität als bei jedem Faden, aber niedriger als die Interrupt -Handler. Der Vorteil dieser Architektur besteht darin, dass sie nur sehr wenige Zyklen hinzufügt, um die Latenz zu unterbrechen. Infolgedessen sind OSS, die die segmentierte Architektur implementieren, vorhersehbarer und können im Vergleich zur einheitlichen Architektur mit höheren Interrupt -Raten umgehen.
Ebenso das Systemverwaltungsmodus Auf x86 kompatibler Hardware kann viel Zeit in Anspruch nehmen, bevor die Kontrolle an das Betriebssystem zurückgibt.
Speicherzuweisung
Speicherzuweisung ist in einem Echtzeit-Betriebssystem kritischer als in anderen Betriebssystemen.
Erstens kann es für Stabilität nicht geben Speicherlecks (Speicher, der nach Verwendung zugeteilt, aber nicht befreit wird). Das Gerät sollte auf unbestimmte Zeit funktionieren, ohne jemals einen Neustart zu benötigen. Deshalb, Dynamische Speicherzuweisung ist verpönt. Wenn möglich, werden alle erforderlichen Speicherzuweisungen statisch zum Kompilierungszeit angegeben.
Ein weiterer Grund zur Vermeidung der dynamischen Speicherzuweisung ist die Speicherfragmentierung. Bei häufiger Allokation und Freisetzung kleiner Speicherbrocken kann eine Situation auftreten, sobald der verfügbare Speicher in mehrere Abschnitte unterteilt ist und die RTOs nicht in der Lage sind, einen ausreichend ausreichend kontinuierlichen Speicherblock zuzuweisen, obwohl genügend freies Speicher vorhanden ist. Zweitens ist die Zuteilungsgeschwindigkeit wichtig. Ein Standard -Speicherzuweisungsschema scannt eine verknüpfte Liste unbestimmter Länge, um einen geeigneten freien Speicherblock zu finden.[5] Dies ist in einem RTOs inakzeptabel, da die Speicherzuweisung innerhalb einer bestimmten Zeitspanne auftreten muss.
Da mechanische Festplatten viel längere und unvorhersehbare Reaktionszeiten haben, wird das Austausch gegen Festplattendateien aus den gleichen Gründen wie oben diskutiert nicht verwendet.
Das Einfache Blöcke mit fester Größe Funktioniert ganz gut für einfache eingebettete Systeme wegen seines niedrigen Overhead.
Siehe auch
- Anpassender Partitionsplaner
- Vergleich von Echtzeit-Betriebssystemen
- Daten General RDOs
- Do-178b
- Früheste Frist Erstplanung
- Firmware
- Freertos
- Interruptible Betriebssystem
- Zeitplanung am wenigsten Slack
- Osek
- Posix
- Rate-monotonische Planung
- Roboterbetriebssystem
- Scada
- Synchrone Programmiersprache
- Zeitlich ausgelöste System
- Zeit-Utilitätsfunktion
Verweise
- ^ "Antwortzeit und Jitter".
- ^ Tanenbaum, Andrew (2008). Modern Operating Systems. Upper Saddle River, NJ: Pearson/Prentice Hall. p. 160. ISBN 978-0-13-600663-3.
- ^ "RTOS -Konzepte".
{{}}
: CS1 Wartung: URL-Status (Link) - ^ Phraner, Ralph A. (Herbst 1984). "Die Zukunft von Unix auf dem IBM PC". BYTE. S. 59–64.
- ^ "CS 241, Universität von Illinois" (PDF).