Eine Semaphore ist ein Synchronisationsmechanismus, der in der Informatik und Betriebssystemtheorie verwendet wird, um den Zugriff auf gemeinsame Ressourcen in einem parallelen oder verteilten System zu steuern. Semaphoren sind besonders nützlich, um Race Conditions und Deadlocks zu vermeiden.
Angenommen, wir haben eine Ressource, die von mehreren Threads verwendet werden kann. Eine Semaphore kann diese Ressource schützen:
// PHP-Beispiel zur Verwendung von Semaphoren (pthreads extension erforderlich)
class SemaphoreExample {
private $semaphore;
public function __construct($initial) {
$this->semaphore = sem_get(ftok(__FILE__, 'a'), $initial);
}
public function wait() {
sem_acquire($this->semaphore);
}
public function signal() {
sem_release($this->semaphore);
}
}
// Hauptprogramm
$sem = new SemaphoreExample(1); // Binäre Semaphore
$sem->wait(); // Kritischen Abschnitt betreten
// Zugriff auf gemeinsame Ressource
$sem->signal(); // Kritischen Abschnitt verlassen
Semaphoren sind ein mächtiges Werkzeug, um die parallele Programmierung sicherer und kontrollierbarer zu machen, indem sie helfen, Synchronisationsprobleme zu lösen.
"No Preemption" (keine Unterbrechung) ist ein Konzept in der Informatik und Betriebssystemen, das beschreibt, dass ein laufender Prozess oder Thread nicht gewaltsam von der CPU entzogen werden kann, bevor er freiwillig seine Ausführung beendet oder in einen wartenden Zustand wechselt. Dieses Konzept wird häufig in Echtzeit-Betriebssystemen und in bestimmten Scheduling-Strategien verwendet.
Zusammengefasst bedeutet "No Preemption", dass Prozesse oder Threads nicht unterbrochen werden, bevor sie ihre aktuelle Aufgabe abgeschlossen haben, was bestimmte Vorteile in Bezug auf Vorhersagbarkeit und geringeren Overhead bietet, aber auch Nachteile hinsichtlich Reaktionsfähigkeit und Systemstabilität mit sich bringen kann.
"Hold and Wait" ist eine der vier notwendigen Bedingungen für das Auftreten eines Deadlocks in einem System. Diese Bedingung beschreibt eine Situation, in der ein Prozess, der bereits mindestens eine Ressource hält, zusätzlich auf weitere Ressourcen wartet, die von anderen Prozessen gehalten werden. Dies führt zu einer Situation, in der keiner der Prozesse seine Ausführung fortsetzen kann, weil jeder auf Ressourcen wartet, die von anderen Prozessen gehalten werden.
"Hold and Wait" tritt auf, wenn:
Betrachten wir zwei Prozesse P1P_1 und P2P_2 und zwei Ressourcen R1R_1 und R2R_2:
In diesem Szenario warten beide Prozesse auf Ressourcen, die von dem jeweils anderen Prozess gehalten werden, wodurch ein Deadlock entsteht.
Um "Hold and Wait" und damit Deadlocks zu vermeiden, können verschiedene Strategien angewendet werden:
Ressourcenanforderung vor Start der Ausführung:
function requestAllResources($process, $resources) {
foreach ($resources as $resource) {
if (!requestResource($resource)) {
releaseAllResources($process, $resources);
return false;
}
}
return true;
}
Ressourcenfreigabe vor neuen Anforderungen:
function requestResourceSafely($process, $resource) {
releaseAllHeldResources($process);
return requestResource($resource);
}
Prioritäten und Zeitstempel:
function requestResourceWithPriority($process, $resource, $priority) {
if (isHigherPriority($process, $resource, $priority)) {
return requestResource($resource);
} else {
// Warte oder Abbruch
return false;
}
}
Bankiers-Algorithmus:
"Hold and Wait" ist eine Bedingung für Deadlocks, bei der Prozesse Ressourcen halten und gleichzeitig auf weitere Ressourcen warten. Durch geeignete Strategien zur Ressourcenzuweisung und -verwaltung kann diese Bedingung vermieden werden, um die Systemstabilität und Effizienz zu gewährleisten.