Race Condition Fehler


Eine Race Condition kann man auf Deutsch als Lauf(zeit)bedingung oder auch als Konkurrenzverhalten übersetzen.

Bei modernen Betriebssystemen sind im Normalfall mehrere Tasks "gleichzeitig" aktiv und nutzen zum Teil identische Ressourcen. Hierbei ergibt sich das Problem, dass sichergestellt werden muss, dass ein Task die Ressource in einem wohldefinierten Zustand vorfindet. Hierzu ein kleines Beispiel:

Task 1 sei ein von einem Benutzer gestarteter Editor um eine Tabelle zu bearbeiten, Task 2 sei ein ebensolcher Editor, der von einem anderen Benutzer aufgestartet wird. Task 1 öffnet eine Datei um 9:49h, Task 2 öffnet dieselbe Datei um 9:50h. Nachdem der Benutzer von Task 2 seine Änderungen vorgenommen hat, will er um 9:53h die Daten sichern und das Programm beenden. Der Benutzer von Task 1 ist erst um 9:54h fertig und will nun seinerseits die Daten sichern. Die Problematik, die sich hieraus ergibt liegt auf der Hand.

Es gibt nun diverse Ansatzmöglichkeiten um dieses Problem zu lösen, doch in der Regel laufen diese in etwa auf folgendes Schema hinaus:

Ein Task, der eine Ressource nutzen möchte, schaut nach, ob diese Ressource von einem anderen Task benutzt wird. Ist dies nicht der Fall, meldet er dem System, dass er die Ressource nutzen möchte und reserviert diese. Und genau an dieser Stelle wird es heikel. Da der Vorgang des Meldens und des Reservierens nicht Atomar ist (sprich: keine unteilbare Einheit bildet), verstreicht zwichen diesen beiden eine Zeitspanne von X sec. (X>0). Greift nun genau X-Y sec. (mit X>Y>0) nach der ersten Routine des Tasks ein weiteres Programm auf diese Ressource zu, so passiert folgendes:

Der erste Task geht davon aus, dass er alleiniger Nutzer der Ressource ist (Der Task hatte ja schon nachgeschaut bevor das zweite Programm Ansprüche meldete). Das zweite Programm hingegen bekommt vom System die Meldung, dass es sich in Konkurrenz zu Task 1 befindet. Wenn jetzt das zweite Programm in einer Zeit Y-Z (mit Y>Z>0) die Ressource belegen kann, dann ist dieses Programm in der Lage die Daten der Ressource beliebig zu ändern, während der erste Task weiterhin von deren Konsistenz ausgeht.


Obgleich es nun ausgeklügelte Methoden gibt, um genau dieses oben genannte Szenario zu vermeiden, so kommt es in der Praxis leider immer wieder zu solchen Situationen. Man spricht in einem solchen Fall dann von sogenannten Race Condition Fehlern. Diese führen normalerweise zu merkwürdigen und bisweilen nicht nachvollziehbaren Fehlern. Im günstigsten Fall blockieren sich die beiden Programme gegenseitig. In einem ungünstigeren Fall arbeitet mindestens eins der beiden Programme nicht mehr so wie es vorgesehen ist, da die Daten ja "irgendwie" falsch sind. Im ungünstigsten Fall jedoch ist das zweite Programm, welches Zugriff auf die Ressource bekommt, von einem Cracker derart gestaltet worden, dass es das erste Programm gezielt, mithife der Änderung der Daten, manipulieren kann. Und genau in diesem Fall führt ein Race Condition Fehler nicht nur einfach zu einem instabilen Verhalten des Systems, sondern ermöglicht die Komprommitierung des Selben.

Ein Race Condition Fehler ist also in jedem Fall ein unerwünschtes Ärgernis. Aus diesem Grund sollte man als Systemadministrator ein Sofwarepaket welches einen solchen Fehler aufweist schnellstmöglich ersetzten. Im Gegensatz zu einem Design Fehler reicht es hierfür einen vom Hersteller bereitgestellten Patch einzuspielen.

Kontaktadresse







Valid HTML 4.01!