Was ist ein Race Condition?

0
168
Juice Dash/Shutterstock.com< /figure>

Haben Sie schon einmal ein Rennen gefahren? Wenn ja, wissen Sie bereits, dass manchmal ein Fotofinish erforderlich ist, um den Gewinner zu ermitteln! Was aber, wenn zwei Personen gleichzeitig im Ziel ankommen? Willkommen bei Race-Conditions.

Was sind Computer-Threads?

Um eine Race-Condition zu erklären, wollen wir müssen zuerst ein wenig verstehen, wie Computer intern funktionieren. Wenn Sie ein Betriebssystem verwenden, werden Sie verschiedene Aktionen ausführen, wie das Öffnen eines Befehlsterminalfensters, das Öffnen eines Browsers usw. Jede dieser Aktionen führt zu einer Reaktion des Betriebssystems, um einen neuen Computer-/Computer-Thread zu starten.

Ein Thread ist ein Computer-/Computerprozess, der die verschiedenen Schritte (Programmierschritte, die ursprünglich im Quellcodeformat geschrieben und regelmäßig von einem Compiler kompiliert wurden) ausführt/ausführt, die erforderlich sind, um die Aufgabe auszuführen, die Sie dem Betriebssystem oder der darauf ausgeführten Software gestellt haben .

In Linux wird ein solcher Thread eindeutig durch eine PID (Process Identifier) ​​identifiziert. Um mehr über PIDs in Linux zu erfahren, lesen Sie unsere Artikel Grundlagen der Bash-Automatisierung und Skripterstellung (Teil 3) und Funktionsweise von Linux-Signalen: SIGINT, SIGTERM und SIGKILL.

In Windows wird ein Thread auch durch eine Prozess-ID eindeutig identifiziert (siehe die Spalte PID im Windows Task-Manager), obwohl die Implementierung der Prozessbehandlung zwischen Linux und Windows unterschiedlich ist; unterschiedlicher zugrunde liegender Code, unterschiedliche PID-Interaktionstools usw. und eingeschränkte Kompatibilität. Außerdem ist die Windows-Prozess-ID PID nicht zu verwechseln mit der Produkt-ID PID (gleicher Begriff, andere Bedeutung) oder VID(Hersteller-ID). Die beiden letzteren beziehen sich auf die Identifizierung von Geräten und haben nichts mit der Prozessverwaltung zu tun.

Wenn ein Thread startet, kann er selbst andere Threads starten. Der ursprüngliche Thread wird oft als Haupt- oder Eltern-Thread bezeichnet. Wenn Sie beispielsweise auf das Symbol Ihres bevorzugten Webbrowsers klicken, wird sofort ein Thread (der Hauptthread) gestartet, und dieser Thread startet sehr schnell mehrere Unterthreads oder untergeordnete Threads und wird somit zum übergeordneten Thread.

Werbung

Sie können auch an Threads wie Läufer in einem Rennen denken. Stellen Sie sich beispielsweise einen ausgelasteten Datenbankserver vor, der viele verschiedene verbundene Clients bedient. Jeder dieser Client-Threads (beachten Sie die Verwendung des Wortes Thread) hat (in vielen Fällen) für sich allein mindestens einen Thread auf dem Datenbankhostserver und/oder innerhalb der Datenbanksoftware selbst (dh zwei Threads, einer protokolliert in das Betriebssystem und einen in die Datenbanksoftware).

Der Datenbankserver versucht, alle diese Threads gleichzeitig zu bedienen – daher der Begriff gleichzeitige Prozesse oder gleichzeitige Threads und wenn es Fehler in der Datenbanksoftware (oder dem Betriebssystem usw.) gibt, kann es früher oder später zu einer Race Condition kommen.

Was ist eine Rennbedingung?

Eine einfache Möglichkeit, dies auf Läufer zu beziehen, die in einem Rennen laufen, besteht darin, sich ein Fotofinish vorzustellen, bei dem zwei Läufer wirklich zum gleichen Zeitpunkt die Ziellinie überqueren. Es ist möglich, wenn auch ziemlich unwahrscheinlich, dass dies bei menschlichen Rassen vorkommt. Für Computer, die Tausende von Operationen pro Millisekunde verarbeiten, wird dies viel machbarer.

Stellen Sie sich als weiteres Beispiel einen Staffellauf vor, bei dem Läufer einen Staffelstab (den auffälligen farbigen Stock) von einer Person zur nächsten weitergeben. Stellen Sie sich jetzt vor, dass einer der Rennteilnehmer einen Fehler macht und es jetzt zwei Läufer gibt, die meinen, sie sollten den roten Staffelstab holen.

Ein bedeutendes Ereignis bei einem Staffellauf ist die Staffelstabübergabe, da dies bedeuten kann, dass der bisherige Stabhalter aufhören kann zu laufen und es nun an dem neuen Stabhalter liegt, sein Bestes zu geben. Jetzt greifen zwei Läufer nach dem Staffelstab. Es wird eine interessante Situation im Fernsehen zu sehen (wenn Sie so etwas mögen), aber es ist klar, dass es einige Auswirkungen geben wird.

Im Wesentlichen ist eine Race Condition ein Fehler, ein Fehler oder ein Fehler im Computersystemcode, der unvorhersehbare Ergebnisse hervorruft: eine unerwartete Abfolge von Ereignissen. Es wird normalerweise durch zwei Threads verursacht, die in irgendeiner Weise in Konflikt geraten, da mehr als zwei Threads am tatsächlichen Konflikt beteiligt sein können und oft mehr als zwei Threads in der fehlerhaften Software ausgeführt werden.

Werbung

In unserem Beispiel menschlicher Rasse, wir hatten zwei Personen, die ungefähr gleichzeitig auf ein Objekt zugegriffen haben, und die Korruption(ein Computerbegriff, der darauf hinweist, dass einige Daten beschädigt waren, wo sich solche Daten im Speicher oder auf der Festplatte oder in der CPU usw. befinden könnten) geschah in dem Moment, in dem zwei Personen (oder zwei Threads in Computeranalogie) versuchten, greifen Sie den Staffelstab und es kam zu Konflikten. Computertechnisch versuchten zwei Threads, einen Speicherplatz zu schreiben, der normalerweise nur von einem Thread (einem Runner) beschrieben werden sollte.

Rennbedingungen können in verschiedenen Bereichen auftreten, wie in der Elektronik, in der Computersoftware und im allgemeinen Leben. Beispielsweise ist eine Anrufkollision ein Telekommunikationsbegriff, um die Situation zu beschreiben, in der ein Kommunikationskanal an beiden Enden gleichzeitig belegt ist. In der Computersoftware – einer der prominentesten Bereiche der Rennbedingungen – Es gibt eine Vielzahl von Race-Conditions.

Als weiteres Beispiel für Race-Conditions innerhalb einer Computersoftware stellen Sie sich zwei Rechen-Threads vor, die mit einem gegebenen Speicherplatz arbeiten. Ein Benutzer hat gerade ein Formular festgeschrieben und die Backend-Software schreibt dieses Formular in den Speicher. Gleichzeitig liest ein anderer Benutzer die Felder dieses Formulars aus demselben Speicherplatz aus. Je nachdem, was passiert, kann der lesende Benutzer ein teilweise falsches Formular mit teilweise aktualisierten Informationen erhalten.

Verhindern von Wettlaufbedingungen: Thread-Sicherheit

In der IT-Branche wurde viel über Wettlaufbedingungen diskutiert. Je nach verwendeter Programmiersprache gibt es möglicherweise umfangreiche oder wenige Vorkehrungen für den Umgang mit Racebedingungen. Ein häufig verwendeter Begriff ist Thread-Sicherheit oder eine Thread-Safe-Anwendung oder Programmiersprache [Konstrukt]. Solche Begriffe werden verwendet, um anzuzeigen, ob ein Stück Code oder eine Software insgesamt threadsicher ist, dh so geschrieben, dass Race-Conditions vermieden oder sogar verhindert werden.

Wenn Software als thread-safe gilt, gilt sie als frei von Race-Conditions . In vielen Fällen ‘erachtet‘ thread-safe ist das Beste, was Entwickler liefern können, und das umso mehr, wenn viele Threads und Interaktionen möglich sind. Die Komplexität vieler Threads, die mit vielen Ressourcen arbeiten, kann leicht zu einer Myriade von Code-Handling und einer noch größeren Myriade von möglichen Race-Conditions werden.

Verschiedene Programmierkonstrukte können verwendet werden, um Race-Conditions zu verhindern. Zum Beispiel Semaphoren und Mutexe. Die Komplexität der Verwendung solcher Konstrukte hängt von der verwendeten Programmiersprache und ihrer nativen Unterstützung für eine verbesserte Thread-Behandlung ab. In C++ kann man sich zum Beispiel die Klasse std::mutex ansehen, um eine Mutex-Sperre (d. h. mutually exclusive) zu implementieren. In Bash findet man ein solches Konstrukt jedoch nicht nativ.

Werbung

Weitergehend kann man auch überlegen, welche bestimmten Konstrukte, Funktionen oder sogar ausführbaren Dateien und Bibliotheken bereits Thread-sicher sind, und dann solche Konstrukte, Funktionen, ausführbaren Dateien und Bibliotheken als Grundlage für den Aufbau eines neuen Konstrukts, einer neuen Funktion, ausführbaren Datei, einer Bibliothek verwenden , oder ein vollständiges Softwarepaket.

Die Implementierung selbst grundlegender Thread-Sicherheitshandhabungskonstrukte kann eine komplexe Angelegenheit sein. Betrachten Sie zum Beispiel die Schwierigkeit, ein Semaphor in Bash zu implementieren.

Zusammenfassung

In diesem Artikel haben wir Computer-Threads untersucht und Rennbedingungen. Wir haben uns Analogien zu Laufrennen und Staffelrennen im menschlichen Leben angeschaut, um einige grundlegende Rennbedingungen zu untersuchen, die in Computern auftreten können. Schließlich haben wir die Thread-Sicherheit, die verschiedenen Implementierungen der Behandlung von Race-Conditions in Programmiersprachen und die Vermeidung von Race-Conditions untersucht.

Wenn Ihnen dieser Artikel gefallen hat, lesen Sie die Funktionsweise von Logic Gates: ODER , AND, XOR, NOR, NAND, XNOR und NOT Artikel.