Betriebssysteme // Kapitel 7: Synchronisation
Was ist eine Race-Condition?
Ein Fehlerzustand, bei dem das Ergebnis eines Programms vom zeitlichen Ablauf (Timing) verschiedener Threads oder Prozesse abhängt, meist wenn diese ungeordnet auf geteilte Daten zugreifen.
Was definiert einen 'Kritischen Abschnitt'?
Ein Codebereich, in dem auf gemeinsame Ressourcen zugegriffen wird. Es darf sich immer nur ein Prozess gleichzeitig in seinem kritischen Abschnitt befinden, um Inkonsistenzen zu vermeiden.
Wie unterscheidet sich ein Mutex von einem Semaphor?
Ein Mutex (Mutual Exclusion) ist wie ein Schlüssel für eine Toilette: Nur einer kann ihn haben, und derselbe muss ihn zurückgeben. Ein Semaphor ist wie ein Korb mit Eintrittskarten: Es können mehrere verfügbar sein, und es ist egal, wer die Karte zurücklegt.
Wann und warum nutzt man Condition Variables statt nur Mutexe?
Mutexe schützen Daten nur vor gleichzeitigem Zugriff. Condition Variables erlauben es Threads, effizient (ohne CPU-Last) zu warten, bis ein bestimmter Zustand eintritt (z.B. 'Daten sind da'), anstatt ständig zu prüfen (Busy Waiting).
Was sind die Voraussetzungen für einen Deadlock?
1. Mutual Exclusion (Ressourcen sind exklusiv). 2. Hold and Wait (Prozesse halten Ressourcen und warten auf weitere). 3. No Preemption (Ressourcen werden nicht zwangsweise entzogen). 4. Circular Wait (Kreisförmige Warteabhängigkeit).
Was ist ein Livelock?
Ein Zustand, in dem Prozesse zwar aktiv sind und CPU-Zeit verbrauchen (z.B. höfliches Ausweichen im Flur), aber keinen logischen Fortschritt machen.
Warum muss eine Condition-Variable immer zusammen mit einem Mutex verwendet werden?
Der Mutex schützt die Prüfung der Bedingung (z.B. 'ist Queue leer?'). Ohne Mutex könnte zwischen der Prüfung der Bedingung und dem 'Schlafenlegen' (wait) ein Signal eintreffen, das dann verloren geht (Lost Wakeup Problem).
Was passiert, wenn ein Prozess 'down()' auf einem Semaphor mit Wert 0 aufruft?
Der Prozess wird blockiert (schlafen gelegt), bis ein anderer Prozess 'up()' aufruft und den Zähler erhöht.
Warum ist 'Busy Waiting' (aktives Warten) in den meisten Fällen schlecht, aber manchmal (z.B. Spinlocks) doch nützlich?
Schlecht: Es verschwendet CPU-Zyklen, während man auf ein Ereignis wartet. Manchmal nützlich: Wenn die Wartezeit extrem kurz ist (kürzer als ein Kontextwechsel), kann es effizienter sein als den Prozess schlafen zu legen.
Wie kann die Hierarchie von Ressourcen (z.B. Mutex A immer vor Mutex B sperren) Deadlocks verhindern?
Sie verhindert die Bedingung der 'zirkulären Abhängigkeit'. Wenn alle Prozesse Ressourcen in der gleichen Reihenfolge anfordern, kann kein Zyklus entstehen.