4.1 Eingebettete Betriebssysteme
223
Vertiefende Informationen über die hier angesprochenen Standardthemen im Systemsoftwarebereich finden sich in Betriebssystem-Lehrbüchern wie z.B. dem Buch
von Tanenbaum [525]2.
Die folgenden Eigenschaften sind für eingebettete Betriebssysteme wesentlich:
• Die große Vielfalt eingebetteter Systeme resultiert in einer großen Vielfalt von
Anforderungen an die Funktionalität eingebetteter Betriebssysteme. Aus Effizienzgründen ist es nicht möglich, ein System einzusetzen, das alle Eigenschaften
zur Verfügung stellt. Die meisten Anwendungen benötigen ein kleines Betriebssystem. Daher sollten Betriebssysteme eine flexible Maßschneiderung auf die
gegebene Anwendung zulassen. Konfigurierbarkeit ist daher eine der wichtigsten Eigenschaften eingebetteter Betriebssysteme. Konfigurierbarkeit lässt sich mit
einer Reihe von Techniken realisieren, wie z.B.3:
– Objektorientierung zur Ableitung geeigneter Unterklassen. Von einer allgemeinen Scheduler-Klasse könnten z.B. Scheduler mit bestimmten Eigenschaften abgeleitet werden. Allerdings erfordern objektorientierte Ansätze oft
zusätzlichen Aufwand. So erzeugt zum Beispiel das dynamische Binden von
Methoden zusätzlichen Aufwand zur Laufzeit. Vorschläge zur Reduktion dieses Aufwandes existieren4. Dennoch können der verbleibende Aufwand und
die potentiell schlechte Vorhersage des Zeitverhaltens für performanzkritische
Systeme möglicherweise nicht tragbar sein.
– Aspektorientierte Programmierung [351]: dieser Ansatz erlaubt es, Aspekte von Software, die orthogonal zueinander sind, unabhängig voneinander zu
beschreiben und automatisch in alle relevanten Teile des Programmcodes einzubauen. So könnte Profiling-Code in einem eigenen Modul beschrieben sein,
das dann automatisch zu allen relevanten Teilen des Quellcodes hinzugefügt
oder aus diesen entfernt werden kann. Die CiAO-Betriebssystemfamilie wurde
auf diese Weise entworfen [352].
– Bedingte Übersetzung: Hier kommt ein Makro-Präprozessor zum Einsatz,
dessen Befehle #if und #ifdef verwendet werden.
– Erweiterte Auswertung zur Übersetzungszeit (engl. compile time evaluation): ein Betriebssystem könnte konfiguriert werden, indem bestimmte Variablen vor der Übersetzung mit konstanten Werten belegt werden. Ein Compiler
könnte dann das Wissen über diese Werte so weit wie möglich ausnutzen. Hier
könnten auch erweiterte Compiler-Optimierungen nützlich sein. Wenn ein
bestimmter Funktionsparameter beispielsweise stets einen konstanten Wert
besitzt, könnte dieser Parameter aus der entsprechenden Parameterliste entfernt werden. Die sogenannte partielle Evaluation [277] stellt eine Umgebung
für solche Compileroptimierungen zur Verfügung. Weiterführende Ansätze
könnten zudem dynamische Daten durch statische Daten ersetzen [25]. Ein
2 Studierende, die bisher keine Vorlesung über Betriebssysteme gehört haben, sollten eines dieser
Standardwerke zu Rate ziehen, bevor sie hier weiterlesen.
3 Diese Liste ist nach der Position der Technik im Entwicklungsprozess geordnet.
4 https://github.com/lefticus/cppbestpractices/blob/master/08-Considering_Performance.md ist ein
Beispiel dafür.
223
Vertiefende Informationen über die hier angesprochenen Standardthemen im Systemsoftwarebereich finden sich in Betriebssystem-Lehrbüchern wie z.B. dem Buch
von Tanenbaum [525]2.
Die folgenden Eigenschaften sind für eingebettete Betriebssysteme wesentlich:
• Die große Vielfalt eingebetteter Systeme resultiert in einer großen Vielfalt von
Anforderungen an die Funktionalität eingebetteter Betriebssysteme. Aus Effizienzgründen ist es nicht möglich, ein System einzusetzen, das alle Eigenschaften
zur Verfügung stellt. Die meisten Anwendungen benötigen ein kleines Betriebssystem. Daher sollten Betriebssysteme eine flexible Maßschneiderung auf die
gegebene Anwendung zulassen. Konfigurierbarkeit ist daher eine der wichtigsten Eigenschaften eingebetteter Betriebssysteme. Konfigurierbarkeit lässt sich mit
einer Reihe von Techniken realisieren, wie z.B.3:
– Objektorientierung zur Ableitung geeigneter Unterklassen. Von einer allgemeinen Scheduler-Klasse könnten z.B. Scheduler mit bestimmten Eigenschaften abgeleitet werden. Allerdings erfordern objektorientierte Ansätze oft
zusätzlichen Aufwand. So erzeugt zum Beispiel das dynamische Binden von
Methoden zusätzlichen Aufwand zur Laufzeit. Vorschläge zur Reduktion dieses Aufwandes existieren4. Dennoch können der verbleibende Aufwand und
die potentiell schlechte Vorhersage des Zeitverhaltens für performanzkritische
Systeme möglicherweise nicht tragbar sein.
– Aspektorientierte Programmierung [351]: dieser Ansatz erlaubt es, Aspekte von Software, die orthogonal zueinander sind, unabhängig voneinander zu
beschreiben und automatisch in alle relevanten Teile des Programmcodes einzubauen. So könnte Profiling-Code in einem eigenen Modul beschrieben sein,
das dann automatisch zu allen relevanten Teilen des Quellcodes hinzugefügt
oder aus diesen entfernt werden kann. Die CiAO-Betriebssystemfamilie wurde
auf diese Weise entworfen [352].
– Bedingte Übersetzung: Hier kommt ein Makro-Präprozessor zum Einsatz,
dessen Befehle #if und #ifdef verwendet werden.
– Erweiterte Auswertung zur Übersetzungszeit (engl. compile time evaluation): ein Betriebssystem könnte konfiguriert werden, indem bestimmte Variablen vor der Übersetzung mit konstanten Werten belegt werden. Ein Compiler
könnte dann das Wissen über diese Werte so weit wie möglich ausnutzen. Hier
könnten auch erweiterte Compiler-Optimierungen nützlich sein. Wenn ein
bestimmter Funktionsparameter beispielsweise stets einen konstanten Wert
besitzt, könnte dieser Parameter aus der entsprechenden Parameterliste entfernt werden. Die sogenannte partielle Evaluation [277] stellt eine Umgebung
für solche Compileroptimierungen zur Verfügung. Weiterführende Ansätze
könnten zudem dynamische Daten durch statische Daten ersetzen [25]. Ein
2 Studierende, die bisher keine Vorlesung über Betriebssysteme gehört haben, sollten eines dieser
Standardwerke zu Rate ziehen, bevor sie hier weiterlesen.
3 Diese Liste ist nach der Position der Technik im Entwicklungsprozess geordnet.
4 https://github.com/lefticus/cppbestpractices/blob/master/08-Considering_Performance.md ist ein
Beispiel dafür.
