Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

C Tutorium – Semaphoren – Knut Stolze. 2 Semaphoren Mittel zur Synchronisation mehrerer Prozesse – Zugriff auf Dateien, Shared Memory, … – Werden vom.

Ähnliche Präsentationen


Präsentation zum Thema: "C Tutorium – Semaphoren – Knut Stolze. 2 Semaphoren Mittel zur Synchronisation mehrerer Prozesse – Zugriff auf Dateien, Shared Memory, … – Werden vom."—  Präsentation transkript:

1 C Tutorium – Semaphoren – Knut Stolze

2 2 Semaphoren Mittel zur Synchronisation mehrerer Prozesse – Zugriff auf Dateien, Shared Memory, … – Werden vom Betriebssystem verwaltet Können zur Implementierung von Sperren verwendet werden Verschiedene Variantionen – System V Semaphoren – Posix Semaphoren

3 3 Semaphoren (2) Funktionalität – Setze Semaphore – Warte bis Semaphore frei – Warte bis Semaphore frei und dann setze Operationen auf Semaphoren sind atomar – Ganz oder gar nicht ausgeführt

4 4 Erzeugen von Semaphoren Ein Prozess legt Set (Menge) von Semaphoren an int semget(key, num_sems, flags) – key: Schlüssel für den Semaphoren-Set; üblicherweise mittels ftok generiert; Auch IPC_PRIVATE möglich – num_sems: Anzahl der Semaphoren im Set – flags: IPC_CREAT – Set erzeugen IPC_EXCL – zu erzeugender Set darf noch nicht existieren; sonst Fehler Zugriffsrechte auf Set (wie bei Dateien) – Ergebnis: ID des Semaphoren-Set (oder –1 bei Fehler)

5 5 Modifizieren von Semaphoren Ändern des Zustandes einer oder mehrerer Semaphoren eines Sets atomar int semop(id, ops, num_ops) – id: ID des Semaphoren-Sets (von semget) – ops: Array mit den Operationen auf dem Semaphoren-Set Jedes Element im Array beschreibt eine Operation, z.B. test auf 0 – num_ops: Anzahl der Elemente in ops

6 6 semop Beschreibung einer einzelnen Operation: – sem_num: Nummer der Semaphore im Semaphoren-Set (Start bei 0) – sem_op: > 0 erhöhe Zähler der Semaphore um angegebenen Wert; Prozess wird nie geblockt = dem angegebenen Wert ist = 0 Prozess wartet bis Zähler der Semaphore 0 wird

7 7 semop (2) – sem_flg: SEM_UNDO: Änderungen des aktuellen Prozesses auf der Semaphore werden beim Ende des Prozesses zurückgesetzt SEM_NOWAIT: Sofortiger Fehler falls die Operation nicht ausgeführt werden kann (kein Blockieren des Prozesses)

8 8 Implementierung einer Sperre 3 Semaphoren in einem Set – Zähler für Leser (S-Sperre) – Flag für Schreiber (X-Sperre) – Blockieren neuer Leser, wenn ein anderer Prozess bereits eine X-Sperre angefordert hat Starvation verhindern

9 9 Implementierung einer Sperre (2) Initialisierung: – Zähler für Lese- und Schreibsemaphore auf 0 – Flag für Blockieren neuer Leser auf 1 Inverse Logik Schreibsperre anfordern: 1. Zähler für blockierte Leser um 1 reduzieren (warten bis Zähler > 0) damit keine neuen Leser oder Schreiber hinzukommen können 2. Zähler für Schreiber muss 0 sein 1. Zähler für Leser muss 0 sein 2. Zähler für Schreiber 1 erhöhen

10 10 Implementierung einer Sperre (3) Lesesperre anfordern: 1. Zähler für blockierte Leser um 1 reduzieren (warten bis Zähler > 0) 2. Zähler für Leser um 1 erhöhen 3. Zähler für blockierte Leser um 1 erhöhen (Rücksetzen von Schritt 1) 4. Zähler für Schreiber muss 0 sein (redundant mit Schritt 1 + 3)

11 11 Implementierung einer Sperre (4) Schreibsperre freigeben: 1. Zähler für blockierte Leser um 1 erhöhen (Leser oder neue Schreiber zugelassen) 2. Zähler für Schreiber um 1 reduzieren Lesesperre freigeben: 1. Zähler für Leser um 1 reduzieren

12 12 Semaphoren zerstören Semaphoren-Set wird zerstört int semctl(id, semnum, cmd, …) – id: ID des Semaphoren-Set (Ergebnis von semget) – Cmd: Kommando auf dem Semaphoren-Set IPC_RMID – Set zerstören IPC_STAT – Informationen über Set zurückgeben IPC_SET – Setze Semaphore GETALL – Gib Zähler aller Semaphoren des Sets zurück …

13 13 Probleme bei Semaphoren Erzeugen (semget) und Initialisieren (semctl) von Semaphoren ist nicht atomar – Konkurrierendes Erzeugen von Semaphoren kann ein Problem sein dedizierter Prozess zum Anlegen der Semaphoren hilfreich

14 14 Kommandozeile (Unix) Liste alle IPC-Resources (Message Queues, Semaphore, Shared Memors Segmente) $ ipcs Lösche eine IPC-Resource $ ipcrm Beispiel um alle Resources des aktuellen Nutzers zu löschen: $ ipcs | grep `user` | awk { print ipcrm –$1,$2 } | sh -e


Herunterladen ppt "C Tutorium – Semaphoren – Knut Stolze. 2 Semaphoren Mittel zur Synchronisation mehrerer Prozesse – Zugriff auf Dateien, Shared Memory, … – Werden vom."

Ähnliche Präsentationen


Google-Anzeigen