Rassenbedingung

Rennbedingung in einer Logikkreis. Hier, t1 und t2 repräsentieren Ausbreitungsverzögerungen der logischen Elemente. Wenn der Eingangswert A Änderungen von niedrig zu hoch, der Schaltkreis gibt einen kurzen Dauer aus (∆t1 + ∆t2) - ∆t2 = ∆t1.

A Rassenbedingung oder Rassengefahr ist der Zustand eines Elektronik, Software, oder andere System wo das inhaltliche Verhalten des Systems ist abhängig über die Sequenz oder das Timing anderer unkontrollierbarer Ereignisse. Es wird a Insekt Wenn ein oder mehrere der möglichen Verhaltensweisen unerwünscht sind.

Der Begriff Rassenbedingung war bereits 1954 in Gebrauch, zum Beispiel in David A. Huffman's Doktorarbeit "Die Synthese sequentieller Schaltkreise".[1]

Rennbedingungen können insbesondere in auftreten Logikschaltungen, Multithread, oder verteilt Softwareprogramme.

In Elektronik

Ein typisches Beispiel für eine Rassenbedingung kann auftreten, wenn a Logik -Tor Kombiniert Signale, die auf verschiedenen Wegen aus derselben Quelle gereist sind. Die Eingänge zum Gate können sich bei Reaktion auf eine Änderung des Quellsignals zu geringfügigen Zeiten ändern. Die Ausgabe kann sich für einen kurzen Zeitraum in einen unerwünschten Zustand ändern, bevor er sich in den entworfenen Zustand zurücklässt. Bestimmte Systeme können solche tolerieren Glitches Aber wenn diese Ausgabe als Funktion funktioniert Taktsignal Für weitere Systeme, die Speicher enthalten, kann das System beispielsweise schnell von seinem entworfenen Verhalten abweichen (tatsächlich wird der temporäre Fehler zu einem dauerhaften Fehler).

Betrachten Sie zum Beispiel einen Zwei-Eingaberchen Und Tor mit der folgenden Logik gefüttert:

Ein logisches Signal bei einem Eingang und seiner Negation, (Das ist a Boolesche Negation), auf eine andere theoretisch, gibt es nie einen echten Wert aus: Wenn jedoch Änderungen des Wertes von Nehmen Sie sich länger an, um sich zum zweiten Eingang zu vermehren als der erste wann Änderungen von False zu True, dann wird eine kurze Zeit erfolgt, in der beide Eingaben wahr sind, und so wird auch die Ausgabe des Gate wahr sein.[2]

Kritische und nicht kritische Formen

A Kritische Rassenbedingung tritt auf, wenn die Reihenfolge, in der interne Variablen geändert werden Zustandsmaschine wird in.

A Nichtkritische Rassenbedingung tritt auf, wenn die Reihenfolge, in der interne Variablen geändert werden, nicht den eventuellen Zustand bestimmt, in dem die Zustandsmaschine endet.

Statische, dynamische und wesentliche Formen

A Statische Rasse tritt auf, wenn ein Signal und seine Komplement kombiniert werden.

A Dynamische Rassenbedingung tritt auf, wenn es zu mehreren Übergängen führt, wenn nur einer beabsichtigt ist. Sie sind auf die Wechselwirkung zwischen Toren zurückzuführen. Es kann durch Verwendung von nicht mehr als zwei Gating -Ebenen beseitigt werden.

Ein Wesentliche Rassenbedingung tritt auf, wenn ein Eingang zwei Übergänge in weniger als der gesamten Rückkopplungsausbreitungszeit aufweist. Manchmal werden sie mit Induktion geheilt Verzögerungslinie Elemente, um die Zeitdauer eines Eingangssignals effektiv zu erhöhen.

Problemumgehungen

Designtechniken wie z. Karnaugh Maps Ermutigen Sie Designer, Rassenbedingungen zu erkennen und zu beseitigen, bevor sie Probleme verursachen. Häufig logische Redundanz Kann hinzugefügt werden, um einige Arten von Rennen zu beseitigen.

Sowie diese Probleme können einige logische Elemente eingeben metastabile Zustände, die weitere Probleme für Schaltungsdesigner verursachen.

In Software

Eine Rennbedingung entsteht in der Software, wenn ein Computerprogramm mehrere Codepfade enthält, die gleichzeitig ausgeführt werden. Wenn die mehreren Codepfade unterschiedlich viel Zeit benötigen als erwartet, können sie in einer anderen Reihenfolge als erwartet fertig sein, was aufgrund eines unerwarteten Verhaltens Softwarefehler verursachen kann.

Kritische Rassenbedingungen verursachen ungültige Ausführung und Software -Fehler. Kritische Rassenbedingungen treten häufig auf, wenn die Prozesse oder Fäden von einem gemeinsamen Zustand abhängen. Operationen auf gemeinsamen Staaten werden in durchgeführt Kritische Abschnitte das muss sein gegenseitig exklusiv. Das Versäumnis, dieser Regel zu befolgen, kann den gemeinsamen Staat korrumpieren.

Ein Datenrennen ist eine Art Rennbedingung. Datenrennen sind wichtige Teile verschiedener formeller Speichermodelle. Das in der definierte Speichermodell C11 und C ++ 11 Standards geben an, dass ein C- oder C ++ - Programm mit einem Datenrennen enthält undefiniertes Verhalten.[3][4]

Eine Rennbedingung kann schwer zu reproduzieren und zu debuggen sein, da das Endergebnis ist Nichtdeterministisch und hängt vom relativen Zeitpunkt zwischen störenden Threads ab. Probleme dieser Art können daher verschwinden, wenn Sie im Debug -Modus laufen, zusätzliche Protokollierung hinzufügen oder einen Debugger anbringen. Ein Fehler, der beim Debuggenversuchen so verschwindet, wird oft als "als" bezeichnet "Heisenbug". Es ist daher besser, Rennbedingungen durch sorgfältiges Softwaredesign zu vermeiden.

Beispiel

Nehmen wir an, dass zwei Threads jeweils den Wert einer globalen Ganzzahlvariablen durch 1. im Idealfall die folgende Abfolge von Operationen erfolgen würden:

Thread 1 Thread 2 Integer Wert
0
Wert lesen 0
Wert erhöhen 0
Schreib zurück 1
Wert lesen 1
Wert erhöhen 1
Schreib zurück 2

In dem oben gezeigten Fall beträgt der Endwert wie erwartet 2. Wenn die beiden Threads jedoch gleichzeitig ohne Verriegelung oder Synchronisation laufen, könnte das Ergebnis der Operation falsch sein. Die alternative Abfolge von Operationen unten zeigt dieses Szenario:

Thread 1 Thread 2 Integer Wert
0
Wert lesen 0
Wert lesen 0
Wert erhöhen 0
Wert erhöhen 0
Schreib zurück 1
Schreib zurück 1

In diesem Fall beträgt der Endwert 1 anstelle des erwarteten Ergebniss von 2. Dies tritt auf, da sich hier die Inkrementoperationen nicht gegenseitig ausschließen. Beide -ausschließenden Operationen sind diejenigen, die beim Zugriff auf einige Ressourcen wie einen Speicherort nicht unterbrochen werden können.

Datenrennen

Nicht alle betrachten Datenrennen als Teilmenge der Rassenbedingungen.[5] Die genaue Definition des Datenrennens ist spezifisch für das verwendete formale Parallelitätsmodell, aber normalerweise bezieht es sich auf eine Situation, in der ein Speichervorgang in einem Thread möglicherweise versuchen könnte, gleichzeitig auf einen Speicherort zuzugreifen, in dem ein Speichervorgang in einem anderen Thread ist Schreiben Sie an diesen Speicherort in einem Kontext, in dem dies gefährlich ist. Dies impliziert, dass sich ein Datenrennen von einer Rennbedingung unterscheid atomare Operationen.

Dies kann gefährlich sein, da auf vielen Plattformen, wenn zwei Threads gleichzeitig an einen Speicherort schreiben, möglich sein kann, dass der Speicherort einen Wert hält, der eine willkürliche und bedeutungslose Kombination der Bits entspricht, die die Werte darstellen, die die Werte darstellen, die die Werte darstellen, die die Werte darstellen, die sich darstellen Jeder Thread versuchte zu schreiben; Dies könnte zu einer Speicherbeschäftigung führen, wenn der resultierende Wert einer, den keiner der Thread zu schreiben versuchte (manchmal wird dies als "zerrissenes Schreiben" bezeichnet). Wenn ein Thread aus einem Ort liest, während ein anderer Thread darauf schreibt, kann es möglich sein, dass das Lese einen Wert zurückgibt, der eine willkürliche und bedeutungslose Kombination der Bits darstellt, die den Wert darstellen, den der Speicherort vor dem Schreiben gehalten hat. und der Bits, die den Wert darstellen, der geschrieben wird.

Auf vielen Plattformen werden spezielle Speichervorgänge für den gleichzeitigen Zugriff bereitgestellt. In solchen Fällen ist der gleichzeitige Zugriff mit diesen speziellen Vorgängen in der Regel sicher, aber der gleichzeitige Zugriff unter Verwendung anderer Speichervorgänge ist gefährlich. Manchmal werden solche besonderen Vorgänge (die für den gleichzeitigen Zugang sicher sind) genannt Atomic oder Synchronisation Operationen, während die gewöhnlichen Operationen (die für den gleichzeitigen Zugang nicht sicher sind) genannt werden Daten Operationen. Dies ist wahrscheinlich der Grund, warum der Begriff ist Daten Rennen; auf vielen Plattformen, wo nur eine Rennbedingung besteht Synchronisation Operationen können nicht deterministisch, aber ansonsten sicher sein. aber a Daten Rasse könnte zu Gedächtnisverfälschung oder undefiniertem Verhalten führen.

Beispieldefinitionen von Datenrennen in bestimmten Parallelitätsmodellen

Die genaue Definition des Datenrennens unterscheidet sich von formalen Parallelitätsmodellen. Dies ist wichtig, da das gleichzeitige Verhalten häufig nicht intuitiv ist und manchmal formale Argumentation angewendet wird.

Das C ++ StandardIn Entwurf N4296 (2014-11-19) definiert das Datenrennen wie folgt in Abschnitt 1.10.23 (Seite 14)[6]

Zwei Aktionen sind potenziell gleichzeitig wenn

  • Sie werden von verschiedenen Fäden durchgeführt, oder
  • Sie werden nicht ausgelöst und mindestens einer wird von einem Signalhandler durchgeführt.

Die Ausführung eines Programms enthält a Datenrennen Wenn es zwei potenziell gleichzeitige widersprüchliche Aktionen enthält, von denen mindestens eines nicht atomarisch ist, und auch nicht vor dem anderen, außer dem Sonderfall für signalische Handler, die unten beschrieben wurden [weggelassen]. Ein solches Datenrennen führt zu undefiniertem Verhalten.

Die Teile dieser Definition in Bezug auf Signalhandler sind idiosynkratisch zu C ++ und sind nicht typisch für Definitionen von Datenrennen.

Das Papier Erkennen von Datenrennen auf schwachen Speichersystemen[7] Bietet eine andere Definition:

"Zwei Speicheroperationen Konflikt Wenn sie auf denselben Ort zugreifen und mindestens einer von ihnen eine Schreiboperation ist ... "Zwei Speicheroperationen, x und y, in einer nacheinander konsistenten Ausführungsform ein Rennen 〈x, y〉, IFF x und y Konflikt, und sie werden nicht von der HB1 -Beziehung der Ausführung angeordnet. Die Rasse 〈x, y〉 ist a Datenrennen IFF ist mindestens eines von x oder y eine Datenoperation.

Hier haben wir zwei Speichervorgänge, die auf denselben Ort zugreifen, von denen eines ein Schreiben ist.

Die HB1 -Beziehung wird an anderer Stelle im Papier definiert und ist ein Beispiel für eine typische "passiert-vor"Beziehung; intuitiv, wenn wir beweisen können, dass wir uns in einer Situation befinden, in der ein Speichervorgang X garantiert bis zur Fertigstellung ausgeführt wird, bevor ein anderer Speichervorgang y beginnt, dann sagen wir, dass" X vor dem y passiert ". Wenn auch nicht" x "x" passiert-vor y "noch" y passiert-vor x ", dann sagen wir, dass x und y" nicht von der Hb1 Ausführung "kann intuitiv als" ... und x und y potenziell gleichzeitig "übersetzt werden.

Das Papier betrachtet nur gefährlich, in denen mindestens einer der Speichervorgänge eine "Datenoperation" ist. In anderen Teilen dieses Papiers definiert das Papier auch eine Klasse von "Synchronisationsoperationen", die im Gegensatz zu "Datenoperationen" sicher für den potenziell gleichzeitigen Gebrauch sind.

Das Java -Sprachspezifikation[8] Bietet eine andere Definition:

Zwei Zugriffe auf (lesen oder schreiben) dieselbe Variable wird als widersprüchlich bezeichnet, wenn mindestens eines der Zugriffe ein Schreiben ist ... wenn ein Programm zwei widersprüchliche Zugriffe (§ 17.4.1) enthält, die nicht von a bestellt werden Vordere Beziehung soll ein Datenrennen enthalten ... ein Datenrennen kann kein falsches Verhalten verursachen, z. B. die falsche Länge für ein Array.

Ein kritischer Unterschied zwischen dem C ++-Ansatz und dem Java-Ansatz besteht darin, dass in C ++ ein Datenrennen ein undefiniertes Verhalten ist, während in Java ein Datenrennen lediglich "Inter-Thread-Aktionen" betrifft.[8] Dies bedeutet, dass in C ++ ein Versuch, ein Programm mit einem Datenrennen zu ausführen unerwünschtes Parallelitätsverhalten ist jedoch ansonsten (vorausgesetzt, dass die Implementierung an der Spezifikation festhält) sicher.

SC für DRF

Eine wichtige Facette von Datenrennen ist, dass in einigen Kontexten ein Programm, das frei von Datenrennen ist, in einem garantiert ausgeführt wird Sequentiell konsistent Art und Weise, die die Argumentation über das gleichzeitige Verhalten des Programms erheblich erleichtert. Formelle Speichermodelle, die eine solche Garantie liefern, sollen einen "SC für DRF" (sequentielle Konsistenz für Datenrennenfreiheit) Eigenschaft aufweisen. Dieser Ansatz soll den jüngsten Konsens erzielt haben (vermutlich im Vergleich zu Ansätzen, die in allen Fällen eine sequentielle Konsistenz garantieren, oder Ansätze, die ihn überhaupt nicht garantieren).[9]

In Java wird beispielsweise diese Garantie direkt angegeben:[8]

Ein Programm wird korrekt synchronisiert, wenn alle nacheinander konsistenten Ausführungen frei von Datenrennen sind.

Wenn ein Programm korrekt synchronisiert ist, scheinen alle Ausführungen des Programms nacheinander konsistent zu sein (§17.4.3).

Dies ist eine äußerst starke Garantie für Programmierer. Programmierer müssen nicht über Neubestände argumentieren, um festzustellen, dass ihr Code Datenrennen enthält. Daher müssen sie nicht über Nachbestellungen argumentieren, wenn sie feststellen, ob ihr Code korrekt synchronisiert ist. Sobald die Feststellung, dass der Code korrekt synchronisiert ist, getroffen wurde, muss der Programmierer nicht befürchten, dass Neubestellungen seinen Code beeinflussen.

Ein Programm muss korrekt synchronisiert werden, um die Arten von kontraintuitivem Verhalten zu vermeiden, die beim Nachbestehen von Code beobachtet werden können. Die Verwendung der korrekten Synchronisation stellt nicht sicher, dass das Gesamtverhalten eines Programms korrekt ist. Die Verwendung ermöglicht es jedoch einem Programmierer, das mögliche Verhalten eines Programms auf einfache Weise zu begründen. Das Verhalten eines korrekt synchronisierten Programms hängt viel weniger von möglichen Neuanordnungen ab. Ohne korrekte Synchronisation sind sehr seltsame, verwirrende und kontraintuitive Verhaltensweisen möglich.

Im Gegensatz dazu erfordert eine Entwurfsspezifikation keine SC für DRF -Eigenschaften, sondern stellt lediglich fest, dass ein Satz vorhanden ist, der es zur Verfügung stellt:

[Hinweis: Es kann gezeigt werden, dass Programme, die mutexes und memory_order_seq_cst orientiert verwenden, um alle Datenrennen zu verhindern und keine anderen Synchronisationsvorgänge zu verwenden aus der letzten Nebenwirkung auf dieses Objekt in dieser Verschachtelung. Dies wird normalerweise als „sequentielle Konsistenz“ bezeichnet. Dies gilt jedoch nur für datenrassenfreie Programme, und datenrassenfreie Programme können die meisten Programmtransformationen nicht beobachten, die die Semantik der einzel-betrügerischen Programme nicht ändern. Tatsächlich sind die meisten Programme mit Single-Thread-Programm weiterhin zulässig, da jedes Programm, das sich unterschiedlich verhält, einen undefinierten Betrieb durchführen muss.

Beachten Sie, dass die C ++ - Entwurfsspezifikation die Möglichkeit von Programmen zugibt, die gültig sind, aber Synchronisierungsvorgänge mit einem anderen Speicher_Order als memory_order_seq_cst verwenden. In diesem Fall kann das Ergebnis ein Programm sein, das korrekt ist, aber für die keine Garantie für nacheinander Konsistenz bereitgestellt wird. Mit anderen Worten, in C ++ sind einige korrekte Programme nicht nacheinander konsistent. Es wird angenommen, dass dieser Ansatz C ++ - Programmierer die Freiheit verleiht, eine schnellere Programmausführung zu wählen, um die einfache Begründung über ihr Programm aufzugeben.[9]

Es gibt verschiedene Theoreme, die häufig in Form von Speichermodellen bereitgestellt werden, die SC für DRF -Garantien bei verschiedenen Kontexten bereitstellen. Die Räumlichkeiten dieser Theoreme legen typischerweise sowohl das Speichermodell (als auch die Implementierung) und auch den Programmierer ein. Das heißt, normalerweise ist es der Fall, dass es Programme gibt, die nicht den Räumlichkeiten des Satzes entsprechen und die nicht nacheinander konsistent ausgeführt werden konnten.

Das DRF1 -Speichermodell[10] Bietet SC für DRF und ermöglicht die Optimierungen der WO (schwache Ordnung), RCSC (Freisetzungskonsistenz mit sequentiell konsistenten Spezialoperationen), VAX-Speichermodell und daten-race-frei-0-Speichermodellen. Das PLPC -Speichermodell[11] Bietet SC für DRF und ermöglicht die Optimierungen der TSO (Gesamtstore -Bestellung), PSO, PC (PC (Prozessorkonsistenz) und RCPC (Freisetzungskonsistenz mit Prozessorkonsistenz spezielle Operationen) Modelle. DRFRLX[12] Bietet eine Skizze eines SC für den DRF -Theorem in Gegenwart entspannter Atomik.

Computersicherheit

Viele Software -Rennbedingungen haben verbunden Computersicherheit Implikationen. Eine Rennbedingung ermöglicht es einem Angreifer mit dem Zugriff auf eine gemeinsame Ressource, um andere Akteure zu veranlassen, die diese Ressource zur Fehlfunktion nutzen, was zu Effekten einschließlich der Auswirkungen führt Denial of Service[13] und Privilegienkalation.[14][15]

Eine bestimmte Art von Rennbedingung besteht darin, ein Prädikat zu überprüfen (z. B. für Authentifizierung), dann auf das Prädikat einwirken, während der Zustand zwischen dem ändern kann Überprüfungszeit und die Gebrauchszeit. Wenn diese Art von Insekt existiert im Sicherheitssensitiv Code, a Sicherheitsanfälligkeit genannt Überprüfungszeit zu Gebrauch (Tacttou) Der Fehler wird erstellt.

Rassenbedingungen werden auch absichtlich zum Erstellen verwendet Hardware -Zufallszahlengeneratoren und physikalisch nicht löste Funktionen.[16] PUFs können erstellt werden, indem Schaltungstopologien mit identischen Pfaden zu einem Knoten entwerfen und sich auf Herstellungsschwankungen verlassen, um zufällig zu bestimmen, welche Pfade zuerst abgeschlossen werden. Durch die Messung der spezifischen Ergebnisse der Rennbedingungen der einzelnen Hersteller kann ein Profil für jeden Stromkreis gesammelt und geheim gehalten werden, um die Identität eines Stromkreises später zu überprüfen.

Dateisysteme

Zwei oder mehr Programme können in ihren Versuchen, ein Dateisystem zu ändern oder zugreifen, zu kollidieren, was zu einer Datenbeschädigung oder einer Berechtigungskalation führen kann.[14] Dateisperrung Bietet eine häufig verwendete Lösung. Ein umständlicheres Mittel besteht darin, das System so zu organisieren, wie ein einzigartiger Prozess (läuft ein Dämon oder ähnliches) hat exklusiven Zugriff auf die Datei, und alle anderen Prozesse, die auf die Daten in dieser Datei zugreifen müssen, tun dies nur über die Interprozess -Kommunikation mit diesem einen Prozess. Dies erfordert eine Synchronisation auf der Prozessebene.

In Dateisystemen gibt es eine andere Form des Rennbedingungen, in denen sich nicht verwandte Programme gegenseitig beeinflussen können, indem sie plötzlich verfügbare Ressourcen wie Festplattenraum, Speicherplatz oder Prozessorzyklen verwenden. Software kann nicht sorgfältig entwickelt werden, um diese Rennsituation zu antizipieren und zu bearbeiten, kann dann unvorhersehbar werden. Ein solches Risiko kann in einem System, das sehr zuverlässig erscheint, für eine lange Zeit übersehen werden. Es können jedoch letztendlich genügend Daten akkumulieren, oder es können genügend andere Software hinzugefügt werden, um viele Teile eines Systems kritisch zu destabilisieren. Ein Beispiel hierfür trat der nahezu Verlust der Mars Rover "Geist" Nicht lange nach der Landung. Eine Lösung besteht darin, dass Software alle Ressourcen anfordert und reserviert, die sie benötigt, bevor sie mit einer Aufgabe beginnen. Wenn diese Anfrage fehlschlägt, wird die Aufgabe verschoben, wodurch die vielen Punkte vermieden werden, an denen ein Fehler aufgetreten sein könnte. Alternativ kann jeder dieser Punkte mit Fehlerbehandlungen ausgestattet werden, oder der Erfolg der gesamten Aufgabe kann danach überprüft werden, bevor sie fortgesetzt werden. Ein häufigerer Ansatz besteht darin, einfach zu überprüfen, ob vor Beginn einer Aufgabe genügend Systemressourcen verfügbar sind. Dies ist jedoch möglicherweise nicht angemessen, da in komplexen Systemen die Aktionen anderer laufender Programme unvorhersehbar sein können.

Networking

Betrachten Sie im Netzwerk ein verteiltes Chat -Netzwerk wie IRC, wo ein Benutzer, der einen Kanal startet, automatisch Channel-Operator-Berechtigungen erwirbt. Wenn zwei Benutzer auf verschiedenen Servern an verschiedenen Enden desselben Netzwerks gleichzeitig versuchen, den gleichnamigen Kanal zu starten, gewährt der jeweilige Server jedes Benutzers jedem Benutzer die Berechtigungen für Kanal-Operator, da keiner der Server die noch erhalten hat Das Signal eines anderen Servers, dass es diesen Kanal zugewiesen hat. (Dieses Problem war weitgehend gelöst durch verschiedene IRC -Server -Implementierungen.)

In diesem Fall einer Rassenbedingung das Konzept des "gemeinsame Ressource"Deckt den Status des Netzwerks ab (welche Kanäle existieren sowie die Benutzer, die sie gestartet haben und daher welche Berechtigungen haben), die jeder Server frei ändern kann, solange er die anderen Server im Netzwerk über die Änderungen signalisiert, damit sie können Aktualisieren Sie ihre Konzeption des Zustands des Netzwerks. Latenz Über das Netzwerk ermöglicht die Art der beschriebenen Rennbedingung. In diesem Fall würde der Anhaufen von Rennbedingungen durch die Auferlegung einer Steuerung über den Zugriff auf die gemeinsame Ressource - die Ernennung eines Servers, um zu steuern, wer die Berechtigungen hält, bedeuten, das verteilte Netzwerk in eine zentralisierte zu verwandeln (zumindest für diesen einen Teil des Netzwerkbetriebs).

Rennbedingungen können auch vorhanden sein, wenn ein Computerprogramm mit geschrieben wird mit Nicht blockierende SockelIn diesem Fall kann die Leistung des Programms von der Geschwindigkeit der Netzwerkverbindung abhängig sein.

Lebenskritische Systeme

Software Fehler in lebenskritische Systeme Kann katastrophal sein. Die Rassenbedingungen gehörten zu den Mängel in der Therac-25 Strahlentherapie Maschine, die zum Tod von mindestens drei Patienten und Verletzungen von mehreren mehr führte.[17]

Ein anderes Beispiel ist das Energiemanagementsystem zur Verfügung gestellt von GE Energie und benutzt von Ohio-basierend FirstEnergy Corp (unter anderen Krafteinrichtungen). Es gab eine Rennbedingung im Alarmsubsystem; Wenn drei schlaffe Stromleitungen gleichzeitig ausgelöst wurden, verhinderte die Erkrankung, dass Warnungen an die Überwachungstechniker angehoben wurden, was ihr Bewusstsein für das Problem verzögerte. Dieser Software -Fehler führte schließlich zum Nordamerikanischer Stromausfall von 2003.[18] GE Energy entwickelte später einen Software -Patch, um den zuvor unentdeckten Fehler zu korrigieren.

Werkzeug

Es gibt viele Software -Tools, um Rennbedingungen in der Software zu erkennen. Sie können weitgehend in zwei Gruppen eingeteilt werden: Statische Analyse Werkzeuge und Dynamische Analyse Werkzeug.

Thread Safety Analysis ist ein statisches Analyse-Tool für annotationsbasierte intra-procedurale statische Analyse, die ursprünglich als Zweig von GCC implementiert ist und jetzt neu implementiert ist Klang, Unterstützung von Pthreads.[19]

Dynamische Analysetools umfassen:

  • Intel Inspector, ein Speicher- und Thread -Überprüfungs- und Debugging -Tool zur Erhöhung der Zuverlässigkeit, Sicherheit und Genauigkeit von C/C ++ - und FORTRAN -Anwendungen; Intel Advisor, ein Stichprobenbasis, eine SIMD -Vektorisierungsoptimierung und Shared Memory -Threading -Hilfstool für C-, C ++, C#und FORTRAN -Softwareentwickler und Architekten;
  • Threadsanitizer, der Binär verwendet (Valgrind-basierend) oder Quelle, Llvm-basierte Instrumentierung und unterstützt PThreads);[20] und Helgrind, a Valgrind Tool zum Erkennen von Synchronisationsfehlern in C-, C ++ - und FORTRAN -Programmen, die die POSIX PThreads -Threading -Primitiven verwenden.[21]
  • Datenrennendetektor[22] ist entwickelt, um Datenrennen in der Go -Programmiersprache zu finden.

Es gibt mehrere Benchmarks

  • DataraceBench[23] ist eine Benchmark-Suite, die so konzipiert ist OpenMP.

In anderen Bereichen

Die Neurowissenschaften zeigen, dass auch Rassenbedingungen im Gehirn von Säugetieren (Ratten) auftreten können.[24][25]

Im UK Railway SignalingEine Rennbedingung würde sich in der Ausführung ergeben Regel 55. Laut dieser Regel würde der Lokomotive Feuerwehrmann, wenn ein Zug von einem Signal auf einer Lauflinie gestoppt würde, zum Signalbox gehen, um den Signalman daran zu erinnern, dass der Zug anwesend war. In mindestens einem Fall bei Winwick 1934 trat ein Unfall auf, weil der Signalman einen weiteren Zug annahm, bevor der Feuerwehrmann ankam. Die moderne Signalpraxis beseitigt den Rennzustand, indem es dem Fahrer ermöglicht, die Signalbox für Radio sofort zu kontaktieren.

Siehe auch

Verweise

  1. ^ Huffman, David A. "Die Synthese von sequentiellen Schaltkreisen."(1954).
  2. ^ Unger, S.H. (Juni 1995). "Gefahren, kritische Rassen und Metastabilität". IEEE -Transaktionen auf Computern. 44 (6): 754–768. doi:10.1109/12.391185.
  3. ^ "ISO/IEC 9899: 2011 - Informationstechnologie - Programmiersprachen - C". ISO.org. Abgerufen 2018-01-30.
  4. ^ "ISO/IEC 14882: 2011". ISO. 2. September 2011. Abgerufen 3. September 2011.
  5. ^ Regehr, John (2011-03-13). "Rennbedingung vs. Datenrennen". Eingebettet in die Wissenschaft.
  6. ^ "Arbeitsentwurf, Standard für die Programmiersprache C ++" (PDF). 2014-11-19.
  7. ^ Adve, Sarita & Hill, Mark & ​​Miller, Barton & H. B. Netzer, Robert. (1991). Erkennen von Datenrennen auf schwachen Speichersystemen. ACM Sigarch Computer Architecture News. 19. 234-243. 10.1109/isca.1991.1021616.
  8. ^ a b c "Kapitel 17. Themen und Schlösser". docs.oracle.com.
  9. ^ a b Adve, Sarita V.; Boehm, Hans-J. (2010). "Semantik gemeinsamer Variablen & Synchronisation (a.k.a. Speichermodelle)" (PDF).
  10. ^ Adve, Sarita (Dezember 1993). Entwerfen von Speicherkonsistenzmodellen für gemeinsame Memory-Multiprozessoren (PDF) (Doktorarbeit). Archiviert (PDF) vom Original am 2021-12-09. Abgerufen 2021-12-09.
  11. ^ Kourosh Gharachorloo und Sarita V. Adve und Anoop Gupta und John L. Hennessy und Mark D. Hill. Programmierung für verschiedene Speicherkonsistenzmodelle, Journal of Parallel and Distributed Computing, 1992, Band 15, Seite 399-407
  12. ^ Sinclair, Matthew David (2017). "Kapitel 3: Effiziente Unterstützung und Bewertung von entspannter Atomik" (PDF). Effiziente Kohärenz und Konsistenz für spezielle Speicherhierarchien (PhD). Universität von Illinois in Urbana-Champaign.
  13. ^ "CVE-2015-8461: Eine Rennbedingung beim Umgang mit Sockelfehlern kann zu einem Ausfall der Behauptung in Resolver.c führen.". Internetsysteme Konsortium. Abgerufen 5. Juni 2017.
  14. ^ a b "Sicherheitsanfälligkeit in rmtree () und remove_tree (): CVE-2017-6512". CPAN. Abgerufen 5. Juni 2017.
  15. ^ "Sicherheit: Status Cache * Sehr groß * Rassenbedingung, wenn das Caching bei Follow_symlink deaktiviert". LightTpd. Abgerufen 5. Juni 2017.
  16. ^ Colesa, Adrian; Tudoran, Radu; Banescu, Sebastian (2008). "Software -Zufallszahlengenerierung basierend auf den Rennbedingungen". 2008 10. Internationales Symposium für symbolische und numerische Algorithmen für wissenschaftliches Computing: 439–444. doi:10.1109/synasc.2008.36. ISBN 978-0-7695-3523-4. S2CID 1586029.
  17. ^ Leveson, Nancy; Turner, Clark S. "Eine Untersuchung von Therac-25-Unfällen-ich". Cures.cs.vt.edu. Archiviert von das Original Am 2017-12-15.
  18. ^ Poulsen, Kevin (2004-04-07). "Verfolgung des Blackout -Fehlers". SecurityFocus. Abgerufen 2011-09-19.
  19. ^ "Thread Safety Analysis - Clang 10 Dokumentation". Clang.llvm.org.
  20. ^ "Threadsanitizer - Clang 10 Dokumentation". Clang.llvm.org.
  21. ^ "Helgrind: Ein Thread -Fehlerdetektor". Valgrind.
  22. ^ "Datenrennendetektor". Golang.
  23. ^ "Data Race Benchmark Suite". 25. Juli 2019 - über Github.
  24. ^ "Wie das Gehirn rennen, um fehlerhafte Bewegungen abzusagen". Neuroskeptisch. Entdecken Sie Magazin. 2013-08-03.
  25. ^ Schmidt, Robert; Leventhal, Daniel K; Mallet, Nicolas; Chen, Fujun; Berke, Joshua D (2013). "Das Abbrechen von Aktionen beinhaltet eine Rasse zwischen Basalganglienwegen". Nature Neurowissenschaften. 16 (8): 1118–24. doi:10.1038/nn.3456. PMC 3733500. PMID 23852117.

Externe Links