2010-06-20 11 views
31

Könnte jemand hier etwas Licht darüber werfen, wie die NASA ihre Raumfahrzeugarchitektur gestaltet, um sicherzustellen, dass sie in der Lage sind, Fehler im eingesetzten Code zu beheben?Software, die bei einer Milliarde Meilen flickt

Ich habe gebaut nie „Echtzeit“ Typsysteme und dies ist eine Frage, die nach der Lektüre dieses Artikels in den Sinn gekommen ist:

http://pluto.jhuapl.edu/overview/piPerspective.php?page=piPerspective_05_21_2010

„Einer der ersten großen Dinge, die wir‘ ll tun, wenn wir das Raumschiff bis nächste Woche wache fast 20 kleinere Fehlerkorrekturen und andere Verbesserungen Code unserer Fehlerschutz (oder „Autopilot response“) Software das Hochladen wird.“

+0

Nette Frage! "Über den Tellerrand hinaus denken" auf die nächste Ebene: Raum die letzte Grenze ;-). –

+0

Keine direkte Antwort auf die Frage, aber interessant für die Schritt für Schritt Beschreibung der Fehlersuche: http://spaceflightnow.com/mars/mera/040126spirit.html – starblue

+0

Vielen Dank für Ihre Anregungen. Was mache ich aber? Alle Ihre Antworten sind exzellent und hilfreich. Ich weiß nicht, wen ich als richtige Antwort markieren soll? Ganz zu schweigen davon, dass es nicht wirklich eine "richtige" Antwort auf diese Frage gibt und alle angeführten Punkte gültig sind. –

Antwort

14

Ich war ein Entwickler auf öffentliche Telefon-Switching-System-Software, die ziemlich strenge Einschränkungen in Bezug auf Zuverlässigkeit, Verfügbarkeit, Überlebensfähigkeit und Leistung hat, die sich annähern, was Raumfahrzeugsysteme benötigen. Ich habe nicht an Raumfahrzeugen gearbeitet (obwohl ich während meiner Zeit bei IBM mit vielen ehemaligen Shuttle-Programmierern gearbeitet habe), und ich kenne VXworks, das Betriebssystem vieler Raumfahrzeuge (einschließlich der Mars-Rover, die einen phänomenalen Betriebsrekord haben) nicht).

Eine der Hauptanforderungen für die Patchfähigkeit ist, dass ein System von Grund auf für das Patchen entwickelt werden sollte. Dies schließt die Modulstruktur ein, so dass neue Variablen hinzugefügt und Methoden ersetzt werden können, ohne laufende Operationen zu unterbrechen. Dies bedeutet oft, dass sowohl der alte als auch der neue Code für eine geänderte Methode resident sind, und der Patch-Vorgang aktualisiert einfach den Verteilungsvektor für die Klasse oder das Modul.

Es ist nur verpflichtend, dass die Patch- (und Unpatching-) Software in das Betriebssystem integriert ist.

Als ich an Telefonsystemen arbeitete, verwendeten wir im Allgemeinen Patch- und Modulaustauschfunktionen im System, um unsere neuen Funktionen zu laden und zu testen, sowie Fehlerbehebungen, lange bevor diese Änderungen für Builds eingereicht wurden. Jeder Entwickler muss mit dem Patchen und Ersetzen von Modulen im Rahmen seiner Daly-Arbeit vertraut sein. Es baut eine Vertrauensstufe in diesen Komponenten auf und stellt sicher, dass der Patch- und Ersetzungscode routinemäßig ausgeführt wird.

Tests sind bei diesen Systemen weitaus strenger als bei jedem anderen Projekt. Vollständige und teilweise Modelle des Bereitstellungssystems werden leicht verfügbar sein. Es wird wahrscheinlich auch Umgebungen mit virtuellen Maschinen geben, in denen die gesamte Ladung ausgeführt und getestet werden kann.Testpläne auf allen Ebenen oberhalb des Komponententests werden geschrieben und formal überprüft, genauso wie formale Code-Inspektionen (und diese werden auch Routine sein).

Fehlertolerantes Systemdesign, einschließlich Software-Design, ist unerlässlich. Ich weiß nichts über Raumfahrzeugsysteme, aber etwas wie Hochverfügbarkeitscluster ist wahrscheinlich Standard, mit der zusätzlichen Fähigkeit, synchron und unsynchron zu laufen, und mit der Fähigkeit, Informationen während eines Failovers zwischen den Seiten zu übertragen. Ein weiterer Vorteil dieser Systemstruktur besteht darin, dass Sie das System teilen können (falls erforderlich), die inaktive Seite mit einer neuen Softwareladung neu laden und es im Produktionssystem testen, ohne mit dem Systemnetzwerk oder -bus verbunden zu sein. Wenn Sie zufrieden sind, dass die neue Software ordnungsgemäß ausgeführt wird, können Sie einfach einen Failover durchführen.

Wie beim Patchen sollte jeder Entwickler wissen, wie Failovers durchgeführt werden, und sollte dies sowohl während der Entwicklung als auch beim Testen tun. Darüber hinaus sollten Entwickler jedes Softwareaktualisierungsproblem kennen, das ein Failover erzwingen kann. Sie sollten wissen, wie Patches und Modulaustausch geschrieben werden, um wann immer möglich Failovers zu vermeiden.

Im Allgemeinen werden diese Systeme von Grund auf (Hardware, Betriebssystem, Compiler und möglicherweise Programmiersprache) für diese Umgebungen entwickelt. Ich würde Windows, Mac OSX, Linux oder irgendeine Unix-Variante nicht für ausreichend robust halten. Ein Teil davon sind Echtzeitanforderungen, aber das ganze Problem der Zuverlässigkeit und Überlebensfähigkeit ist ebenso wichtig.

UPDATE: Als ein weiterer Punkt von Interesse, hier ist ein blog by one of the Mars rover drivers. Dies gibt Ihnen eine Perspektive auf das tägliche Leben der Aufrechterhaltung eines operierenden Raumfahrzeugs. Ordentliches Zeug!

+1

Das ist die original Erlang Demo, die präsentiert einige dieser Ideen. http://video.google.com/videoplay?docid=-5830318882717959520# – liori

3

Nun, ich bin sicher, sie haben Simulatoren zum Testen und Mechanismen für Hot-Patching. Schauen Sie sich den verlinkten Artikel an - es gibt einen ziemlich guten Überblick über das Design des Raumfahrzeugs. Abschnitt 5 diskutiert die Berechnungsmaschinerie.

http://www.boulder.swri.edu/pkb/ssr/ssr-fountain.pdf

Beachtenswert:

  • Redundante Prozessoren
  • Befehlsumschaltung durch den Uplink-Karte, die nicht Prozessor Hilfe benötigt
  • Zeit verzögerten Regeln
5

I‘ Ich werde auch niemals ein Echtzeitsystem bauen, aber in diesem System vermute ich ihr System m hätte keinen Speicherschutzmechanismus. Sie brauchen es nicht, da sie ihre eigene Software selbst geschrieben haben. Ohne Speicherschutz ist es für ein Programm trivial, den Speicherort eines anderen Programms zu schreiben, und dies kann zum Hot-Patch eines laufenden Programms verwendet werden (das Schreiben eines sich selbst modifizierenden Codes war in der Vergangenheit eine beliebte Technik ohne Speicherschutz die gleichen Techniken, die für selbstmodifizierenden Code verwendet werden, können verwendet werden, um den Code eines anderen Programms zu modifizieren.

Linux konnte kleinere Kernel patchen ohne Neustart für einige Zeit mit Ksplice tun. Dies ist für den Einsatz in Situationen erforderlich, in denen Ausfallzeiten katastrophal sein können. Ich habe es selbst nie benutzt, aber ich denke, die Technik, die sie benutzt im Grunde genommen ist dies:

Ksplice Patches auf den Linux-Kernel ohne einen Neustart des Computers anwenden können. Ksplice nimmt als Eingabe eine einheitliche diff und den ursprünglichen Kernel-Quellcode, und es aktualisiert den laufenden Kernel in Speicher. Die Verwendung von Ksplice erfordert keine Vorbereitung, bevor das System ursprünglich gebootet wird (der laufende Kernel muss nicht speziell kompiliert worden sein, zum Beispiel). Um ein Update zu generieren, muss Ksplice bestimmen, welcher Code im Kernel durch den Quellcode Patch geändert wurde. Ksplice führt diese Analyse auf der ELF-Objektcodelayer, eher als auf der C-Quellcodeebene.

Um einen Patch anzuwenden, friert Ksplice zuerst die Ausführung eines Computers ein, so dass das einzige laufende Programm ist. Das System verifiziert, dass keine Prozessoren mitten in der Ausführung von Funktionen waren, die durch den Patch modifiziert werden. Ksplice modifiziert den Anfang der geänderten Funktionen, so dass sie stattdessen auf neue, aktualisierte Versionen dieser Funktionen zeigen, und ändert Daten und Strukturen im Speicher, die geändert werden müssen. Schließlich setzt Ksplice jeden Prozessor fort, wo er ausging.

(aus Wikipedia)

2

habe ich nicht auf Raumschiff gearbeitet, aber die Maschinen, die ich einen stabilen Leerlaufzustand zu haben gebaut hat gearbeitet habe alle worden, wo es möglich ist, die Maschine kurz abgeschaltet Patche die Firmware. Die Systeme, die "Live" -Updates aufgenommen haben, sind solche, die in interagierende Komponenten aufgeteilt wurden, wo Sie ein Segment des Systems lange genug herunterbringen können, um es zu aktualisieren, und die anderen Komponenten normal weiterarbeiten können, da sie die vorübergehende Ausfallzeit tolerieren können der bedienten Komponente.

Eine Möglichkeit besteht darin, parallele (redundante) Funktionen zu verwenden, z. B. parallele Maschinen, die alle die gleiche Aufgabe ausführen, sodass der Prozess um die in Betrieb befindliche Maschine geroutet werden kann. Der Vorteil dieses Ansatzes besteht darin, dass Sie ihn für längere Zeit herunterfahren können, um einen größeren Service zu erhalten, beispielsweise regelmäßige vorbeugende Wartung von Hardware. Sobald Sie diese Möglichkeit haben, ist die Unterstützung der Ausfallzeit für einen Firmware-Patch ziemlich einfach.

1

Einer der Ansätze, die in der Vergangenheit verwendet wurden, ist die Verwendung von LISP.

Verwandte Themen