Unter der Zuverlässigkeit eines Systems versteht man die bedingte Wahrscheinlichkeit, daß ein System in einem Zeitintervall von Null bis t funktionstüchtig ist
unter der Voraussetzung, daß es bei t=0 funktionstüchtig war.
Nicht zu verwechseln ist dieser Begriff mit der Verfügbarkeit eines Systems. Diese gibt den zeitlichen Anteil des intakten Betriebszustandes an der
gesamten Betrachtungsdauer an. Eine hohe Zuverlässigkeit ist wesentlich schwieriger erreichbar als eine hohe Verfügbarkeit, da die Verfügbarkeit problemlos erhöht werden kann, indem man z. B. die Reparaturzeiten niedrig
hält. Zur Steigerung der Zuverlässigkeit eines Systems bieten sich zwei grundsätzliche Wege an: die Fehlervermeidung und die Fehlertoleranz.
Bild 1. Prinzipielle Struktur einer HMR-Anordnung
Fehlervermeidung
Die Methode der Fehlervermeidung versucht durch Perfektion beim Entwurf und der Herstellung der Systeme Fehler a priori auszuschließen. Perfektion erfordert neben einer
umfassenden Spezifikation beispielsweise eine sorgfältige Auswahl der Bauelemente, die sichere Dimensionierung der Schaltungen und eine sorgfältige Prüfung des Systems. Hohe Entwurfs- und Herstellungskosten
sind die Folge. Außerdem ist bei der Komplexität heutiger Systeme eine vollständige Prüfung aus zeitlichen und finanziellen Gründen kaum möglich. Auch kann man oftmals schon beim Entwurf eines Systems keine optimale
Lösung finden, da einschränkende, sich gegenseitig negativ beeinflussende Randbedingungen den Entwickler zu einem nicht optimalen Kompromiß zwingen können.
Beispielsweise kann die Belastung von
Bustreiberstufen und damit deren Lebensdauer durch möglichst hohe Abschlußwiderstände reduziert werden; um ein System jedoch möglichst störfest zu gestalten, ist ein niederohmiger Aufbau von Vorteil.
Man
erkennt, daß das Auftreten von Fehlern selbst durch noch so große Sorgfalt bei der Konzeption eines Systems nicht auszuschließen ist. Tritt eine bösartige Störung auf, so fällt das System aus und ist erst
nach einer manuell durchgeführten Reparatur wieder einsatzbereit.
Fehlertoleranz
Als Fehlertoleranz bezeichnet man die Fähigkeit eines Systems, auch mit einer begrenzten Anzahl
fehlerhafter Subsysteme die spezifizierte Funktion zu erfüllen. Das System soll selbständig auf einen auftretenden Fehler reagieren können, ohne daß es nach außen hin zu einem Fehlverhalten kommt. Eine wesentliche
Voraussetzung hierfür ist das Vorhandensein von Redundanz, etwa in Form zusätzlicher Komponenten oder Programme. Unter Redundanz sind alle bei Fehlerfreiheit entbehrlichen Mittel zu verstehen, die im
Fehlerfall die ausgefallenen Anwendungsfunktionen erbringen oder Verfahren zur Fehlerdiagnose oder -behandlung durchführen. Man unterscheidet statische und dynamische Redundanz.
Statische Redundanz
Sind
die zusätzlichen Mittel ständig an der Ausführung der vorgesehenen Aufgaben beteiligt, so spricht man von statischer (funktionsbeteiligter, aktiver) Redundanz. Mehrere Komponenten eines Systems führen dieselbe
Funktion simultan aus. Fällt eine Komponente aus, wird dieser Fehler durch die verbleibenden Komponenten direkt kompensiert und führt daher nicht unmittelbar zu einer von außen erkennbaren Reaktion. Man sagt hierzu
auch, der Fehlzustand der ausgefallenen Komponente wird maskiert.
Eine bekannte Anwendung findet sich im Verfahren der N-fach modularen Redundanz (NMR). N Komponenten führen gleichzeitig
dieselbe Funktion aus. Die Ausgangssignale dieser Komponenten werden einem Vergleichselement, dem sogenannten »Voter« zugeführt, der eine Mehrheitsentscheidung durchführt. Damit die Mehrheitsentscheidung
leicht getroffen werden kann, wird die Anzahl der identischen Komponenten meist ungerade gewählt.
Werden N=2n+1 Komponenten eingesetzt, so kann der Voter eine (n+1)-aus-N Mehrheitsentscheidung treffen. Weisen also
weniger als (n+1) Komponenten einen Fehler auf, ist der Voter in der Lage, den oder die Fehler zu maskieren und damit zu tolerieren. Erst bei (n+1) oder mehr fehlerhaften Komponenten wird auch das Ausgangssignal des
Voters fehlerhaft.
Die wesentlichen Eigenschaften statisch redundanter Anordungen sind, daß aufgrund der maskierenden Wirkung der Eintritt eines Fehlerfalls keine Unterbrechung der Funktionsausführung zur
Folge hat und die Leistungsfähigkeit des Systems vorhanden bleibt. Nachteilig ist der hohe Aufwand. Alle Komponenten, deren Zuverlässigkeit erhöht werden soll, müssen mindestens in doppelter Ausführung vorhanden sein.
Außerdem muß ein fehlerfreies Arbeiten des Voters unbedingt sichergestellt sein. Bild 1 zeigt die prinzipielle Struktur einer NMR-Anordnung.
Die Zuverlässigkeit statisch redundanter Anordnungen kann durch
diversitäre Realisierung eines Systems weiter erhöht werden. Diversität bezeichnet die redundante Implementierung einer Nutzfunktion durch mehrere verschiedenartig entworfene Subsysteme. Der
Grundgedanke ist hierbei, daß durch unabhängigen Entwurf ein identisches Fehlverhalten aller Subsysteme ausgeschlossen werden kann. Diese Methode wird vor allem bei Software-Systemen eingesetzt, da Fehler, die in
der Software auftreten, meistens auf Entwurfsfehler zurückzuführen sind. Der Nachteil diversitärer Systeme sind die hohen Entwurfskosten, die ein Vielfaches gegenüber den Entwurfskosten einer nicht diversitären
Realisierung ausmachen.
Dynamische Redundanz
Im Gegensatz zur statischen Redundanz ist bei der dynamischen Redundanz nur ein einziges Modul an der Erbringung einer Funktion beteiligt. Wird während des Betriebs in
diesem Modul ein Fehler festgestellt, so erfolgt eine Umschaltung auf ein intaktes Reservemodul (Bild 2). Die vorhandene Redundanz wird sehr gut genutzt, da immer nur ein Modul aktiv sein muß und deshalb bei n
vorhandenen Reservemodulen insgesamt n-1 Ausfälle tolerierbar sind. Die Reservemodule können im fehlerfreien Fall zusätzliche Funktionen erbringen, was zur Leistungssteigerung des Gesamtsystems beiträgt. Im Fehlerfall
ist dann ein stufenweiser Leistungsabfall festzustellen (graceful degradation), weil die redundanten Module die Aufgaben des defekten Subsystems übernehmen müssen.
Bild 2: Dynamische Redundanz
Da die nötigen Aktionen zur Behandlung von Fehlern immer einen zusätzlichen Aufwand für ein System bedeuten, gehen diese mit einem zeitlich beschränkten Leistungsabfall einher. Dies ist z. B.
an einer größeren Reaktionszeit oder einer verkleinerten Speicherkapazität des Systems zu erkennen. Die Reservemodule können aber auch bis zu ihrer Benutzung abgeschaltet bleiben. Dadurch werden sie geschont, und
die Leistungsaufnahme des Gesamtsystems wird reduziert.
Da hier die Maskierung von Fehlern nicht vorgesehen ist, erfordert das Verfahren der dynamischen Redundanz in jedem Fall eine Erkennung und eine
Behandlung auftretender Fehler. Wird ein Fehler nicht erkannt, so kann es zu einer weitreichenden Fehlerfortpflanzung kommen, in deren Verlauf beispielsweise falsche Steuersignale ausgegeben oder wichtige
Speicherinhalte überschrieben werden. Die Fehlerbehandlung sorgt für die Übertragung der Aufgaben auf redundante Subsysteme und die Kompensierung eventuell aufgetretener Fehlerauswirkungen, so daß in einem
fehlerfreien Zustand eine Weiterbearbeitung erfolgen kann.
Die Anwendung dynamischer Redundanz erhöht in erster Linie die Verfügbarkeit eines Systems. Nach erfolgreicher automatischer Behebung eines
Fehlers kann das System sofort weiter genutzt werden, bis sämtliche redundanten Module aufgebraucht sind. Erhält der Benutzer zusätzlich noch Informationen darüber, daß ein Fehler vorliegt und in welchem Subsystem der
Fehler aufgetreten ist und ist es möglich, dieses Subsystem während des laufenden Betriebs auszutauschen (not replace) oder zu reparieren (on-line-Reparatur), trägt dies zur weiteren Erhöhung der Verfügbarkeit bei. Die
Zuverlässigkeit eines Systems wird dann erhöht, wenn neben der automatischen Fehlererkennung und -behebung gewährleistet wird, dass sich das System nach außen hin immer korrekt verhält, also im System
auftretende Fehler von außen nicht erkennbar sind und keine falschen Ausgaben bewirken.
Bevor im nächsten Abschnitt eine Übersicht über Verfahren zur Fehlererkennung gegeben wird, sei zur Vollständigkeit noch erwähnt,
dass statische und dynamische Redundanz kombiniert eingesetzt werden können, um die Vorteile beider Verfahren zu vereinen. Man spricht in diesem Fall von Hybridredundanz.
Fehlererkennung
Die Fehlererkennung liefert eine Aussage darüber, ob alle Subsysteme fehlerfrei sind. Ist dies nicht der Fall, bleibt offen, welche Subsysteme fehlerhaft sind. Die hier aufgeführten Möglichkeiten zur Erkennung von
Fehlern in Rechensystemen zerfallen in zwei große Klassen; die Klasse der passiven und die Klasse der aktiven Fehlererkennung.
Bild 3: Methoden der Fehlererkennung
Die
passive Fehlererkennung
beeinflußt nicht den normalen Betrieb des zu überwachenden Rechensystems. Sie versucht Informationen über mögliche Fehlzustände zu erhalten, indem die Abläufe im System beobachtet und ständig die Istwerte anhand der bekannten Sollwerte überprüft werden. Dadurch ist eine unmittelbare Fehlererkennung möglich, die keiner Unterbrechung des Systembetriebes bedarf.
Nicht alle Fehler sind mit passiven Methoden zu erkennen. Um weitere Fehler aufzudecken, kann ein Subsystem in bestimmten Zeitabständen durch eine aktive Fehlererkennung
überprüft werden. Hierbei wird die Reaktion des Subsystems auf bestimmte Testeingaben beobachtet und analysiert. Durch diese Vorgehensweise können auch Störungen aufgespürt werden, die sich noch nicht als Fehler ausgewirkt haben.
Meist ist eine Testausführung parallel zum normalen Rechenbetrieb nicht möglich, so daß ein Subsystem während der Testphase nicht oder nur eingeschränkt für den normalen Betrieb einsetzbar ist. Eine
damit verbundene Leistungsminderung des Gesamtsystems wird wegen der höheren Fehlererfassung (Fehlerüberdeckung, »coverage«) der Tests in Kauf genommen. Bild 3 zeigt einführend einen Überblick über die im
folgenden genannten Methoden der Fehlererkennung.
Fehlererkennung auf physikalischer Ebene
Die Ursachen für ein fehlerhaftes Systemverhalten sind in den meisten Fällen auf Störungen in den physikalischen Bauteilen
(faults) zurückzuführen. Diese Störungen kann man meist erkennen, wenn man bestimmte charakteristische Kenngrößen des Bauteils kontinuierlich oder in bestimmten Zeitabständen erfasst und überprüft, ob sie
sich in einem vorgegebenen Sollbereich befindenden. Typische Kenngrößen sind Spannung, Stromstärke, Kapazität oder Temperatur. Die Methoden sind vielseitig und unterscheiden sich stark nach dem zu überwachenden
Subsystem. Aus diesem Grunde soll hier die Fehlererkennung auf physikalischer Ebene nicht genauer untersucht werden.
Fehlererkennung durch redundante Codes
Eine sehr effektive Möglichkeit zur Erkennung und
Maskierung von Fehlern stellt die Verwendung redundanter Codes dar. Redundante Codes werden hauptsächlich bei der Informationsübertragung und -speicherung eingesetzt, wobei je nach Verfahren
zusätzliche Hardware, Software und/oder Zeiteinheiten erforderlich sind.
Das Konzept redundanter Codes ba siert darauf, daß die Menge der gültigen Codeworte nur eine Teilmenge T der Menge M aller
möglichen Bikombinationen bildet (Bild 4). Je größer die Redundanz des Codes ist, desto kleiner ist die Mächtigkeit der Teilmencre T im Verhältnis zur Mächtigkeit der Menge M. Entsprechend steigt die
Wahrscheinlichkeit dafür, dass ein fehlerhaftes Codewort nicht wieder Element der Teilmenge T ist, so dass bei einer Prüfung der Fehler entdeckt werden kann.
Bild 4. Menge der Codeworte im Verhältnis zu der Menge der Datenworte
Ist eine Menge T von Codewörtern der Länge m gegeben und stellen alle der möglichen 2m
Bitkombinationen gültige Codewörter dar, so er hält man eine Obermenge M am einfachsten, indem man k Kontrollstellen an die Codewörter aus T anfügt. Die Codewörter aus M haben dann eine Länge von n = m + k, und der Quotient k/n gibt die relative Redundanz des redundanten Codes an. Der entstandene redundante Code heißt
separierbar, da jedes Codewort aus zwei Teilen besteht, den ursprünglichen Datenbits und den angehängten Prüfbits.
Bild 5. Zahl der Prüfbits eines SEC-/DED-Codes in Abhängigkeit von der Anzahl der Datenbits
.
Kann zudem jedes Prüfbit eindeutig als eine lineare Kombination aus einigen der Datenbits errechnet werden, dann liegt ein linear separierbarer
Code vor. Separierbare und linear separierbare Codes erleichtern das Decodieren der Codewörter beim Empfänger. Beim Decodiervorgang werden aus dem empfangenen Datenwort anhand der bekannten Rechenregeln des vereinbarten redundanzerzeugenden Codes wiederum k hypothetische Prüfstellen aus den eventuell verfälschten m Nachrichtenstellen abgeleitet. Danach werden diese ermittelten Prüfstellen mit den übertragenen Prüfstellen verglichen. Das Ergebnis sind k Vergleichsdaten, die als
Syndrom bezeichnet werden.
Die kleinste Distanz zwischen zwei beliebigen Wörtern eines Codes wird Hamming-Abstand d
genannt. Diese kleinste Distanz ergibt sich aus der Anzahl der Binärstellen, die mindestens verfälscht werden müssen, um ein gültiges Codewort in ein anderes gültiges Codewort zu überführen.
Ein wichtiges
Merkmal eines fehlerprüfenden Codes ist die Anzahl e der sicher erkennbaren Fehler und die Zahl f der rekonstruierbaren Fehler; e und f geben hierbei an, wieviele Binärstellen eines Codewortes höchstens verfälscht sein
dürfen, um eine Verfälschung sicher erkennen bzw. beheben zu können. Bei einem gegebenen Hamming-Abstand d lassen sich e und f direkt angeben. Es gelten folgende Zusammenhänge:
- e := d-1
- f :=(d-1)/2 für ungerades d
- f :=(d-2)/2 für gerades d
Ein Code mit einein geraden Hamming-Abstand d läßt sich für die Korrektur nicht voll nutzen, da verfälschte Codewörter entstehen können, die den gleichen Abstand von zwei verschiedenen gültigen Codewörtern
haben und die deshalb keinem Korrekturbereich eindeutig zugeordnet werden können.
Ein f Fehler korrigierender Code mit ungeradem Hamming-Abstand ordnet einem gültigen Codewort alle die n-stelligen
Nachrichten zu, die sich höchstens um f Binärstellen von diesem unterscheiden. Hierzu gehören das Codewort selbst, n Binärwörter, die sich in einer Binärstelle vom Codewort unterscheiden, (n) Binärwörter, die sich in
zwei Stellen unterscheiden, usw., also insgesamt
- Summe (v = 0 bis f) (n über v)
n-stellige Binärwörter. Da der Code 2m gültige Codewörter enthält und bei n Stellen maximal 2n unterschiedliche Binärwörter realisiert werden können, gilt
- 2n ist größer gleich 2m mal Summe (v = 0 bis f) (n über v)
und mit n = m + k:
- 2k ist größer gleich Summe (v = 0 bis f) (n über v)
Gleichung (vi) zeigt, daß die Vorgabe von f direkt den nötigen Mindestaufwand an Redundanz, also die Anzahl der nötigen Prüfstellen k, bestimmt.
Für die am weitesten verbreiteten, einen Fehler
korrigierenden (f=1) und zwei Fehler erkennenden Codes (SEC-/DED-Codes, eng. single error correction/double error detection) ergibt sich aus (vi):
- 2k ist größer gleich m + k + 1
Einige Werte dieser Gleichung zeigt die Tabelle in Bild 5. Daraus kann man erkennen, daß der relative Anteil der Prüfbits mit größer werdender Gesamtwortbreite sinkt. Allerdings bringt eine größere
Gesamtwortbreite auch ein erhöhtes Risiko für nicht mehr korrigier- oder erkennbare Mehrfachbitfehler mit sich.
Ein einfaches Codierverfahren stellt die Zweifachübertragung dar. Verschiedene Variationen
dieses Verfahrens sind bekannt und im Einsatz. Sie werden gesondert in Folge 3 dieser Serie betrachtet. In der nächsten Folge werden verschiedene redundante Codes erläutert.
Fortsetzung folgt