ich war hier: BegrUrt9933 » Baumelement2653 » BSys04Synchronisation

Version [22438]

Dies ist eine alte Version von BSys04Synchronisation erstellt von RonnyGertler am 2013-03-26 18:02:13.

 

 (image: http://wdb.fh-sm.de/uploads/QualipaktLehre/BMBF_Logo_klein.jpg)

Betriebssysteme (Betriebssystemtheorie) - Kapitel 4 - Synchronisation

Attachments
File Last modified Size
BSys15.gif 2023-10-06 18:35 16Kb
BSys16.gif 2023-10-06 18:35 11Kb
BSys17.gif 2023-10-06 18:35 11Kb
BSys18.gif 2023-10-06 18:35 10Kb
BSys19.gif 2023-10-06 18:35 14Kb
BSys20.gif 2023-10-06 18:35 1Kb
BSys21.gif 2023-10-06 18:35 20Kb
BSys22.gif 2023-10-06 18:35 3Kb
BSys23.gif 2023-10-06 18:35 16Kb
BSys24.gif 2023-10-06 18:35 17Kb
BSys25.gif 2023-10-06 18:35 16Kb

Inhalte von Dr. E. Nadobnyh

4.1. Einführung


Grundbegriffe


1) Eine Nebenläufigkeit ist die parallele bzw. pseudoparallele Ausführung von Prozessen. Es gibt zwei Formen von
nebenläufigen Prozessen:
  1. voneinander unabhängige Prozesse, die nur um die gemeinsamen Betriebsmittel konkurrieren,
  1. voneinander abhängige Prozesse, die zur Erfüllung einer gemeinsamen Aufgabe kooperieren.

2) IPC (interprocess communication) ist eine Kooperation zwischen Prozessen oder Threads. IPC ist ein Oberbegriff für Synchronisation und Kommunikation.

3) Eine Synchronisation ist eine zeitliche Abstimmung der abhängigen Prozesse.

4) Eine Kommunikation ist ein Datenaustausch zwischen abhängigen Prozessen.


Klassifikation


 (image: http://ife.erdaxo.de/uploads/BSys04Synchronisation/BSys15.gif)


Problem des wechselseitigen Ausschlusses


Synonyme: gegenseitiger Ausschluss, Mutual-Exclusion-Problem, Counter-Problem.

Das Problem entsteht im System mit mehreren Prozessen, die die gemeinsamen Ressourcen ändern können.

Eine verlorene Aktualisierung (Lost-Update) ist ein Datenverlust beim unkoordinierten Zugriff auf eine Ressource von mehreren nebenläufigen Prozessen.

Ein zeitkritischer Ablauf (Race Condition) ist eine Situation, bei der mehrere Prozesse:
  1. gemeinsame Betriebsmittel nutzen und
  1. das Ergebnis der Nutzung von der zeitlichen Reihenfolge der Operationen abhängt.

⇒ Demo 1.

Ein kritischer Bereich (kritischer Abschnitt) ist ein Codeabschnitt, in dem der Prozess eine gemeinsame Ressource ändert.

Ein wechselseitiger Ausschluss bedeutet, dass ein kritischer Bereich zu einer Zeit nur durch einen der Prozesse durchlaufen werden darf.

Die zeitliche Reihenfolge von Prozessen, die den kritischen Bereich betreten wollen, und die Betretensanzahl ist unwichtig.

Prozesse, die einen kritischen Abschnitt ausführen wollen, müssen warten, bis dieser frei ist. Es gibt zwei Möglichkeiten das Warten zu realisieren:
  1. aktives Warten und
  1. Blockierung.


Sperrvariable


1) Synonyme: Sperre, Lock, Spinlock.

2) Lösungsart. Diese Lösung wurde als Softwarelösung (Selbstverwaltungslösung) benannt. Dabei werden nur die traditionellen programmtechnischen Mittel verwendet.

3) Implementierung. Mehrere Prozesse oder Threads besitzen eine gemeinsame Sperrvariable, z.B.
int lock;

Der Zustand lock=0 bedeutet, dass sich kein Prozess im kritischen Bereich befindet.

4) Eintritt-Operation. Vor dem kritischen Bereich muss jeder Prozess folgende Anweisungen ausführen:
while(lock==1);   lock=1;

Beide Anweisungen werden als eine Operation „Sperre testen und setzen“ bezeichnet.

5) Austritt-Operation. Hinter dem kritischen Bereich muss jeder Prozess die Operation „Sperre aufheben“ ausführen:
lock=0;


6) Aktives Warten (busy loop, Polling, Busy Waiting) ist ein ständiges Abfragen der Sperrvariable, z.B. in der Schleife:
 while(lock==1);


Aktives Warten ist ineffizient wegen der Verschwendung von CPU-Zeit.

7) Nachteil der Sperrvariable: Das ist die so genannte naive Lösung mit der gleichen Fehler-Ursache. Die Operation „Sperre testen und setzen“ kann unterbrochen werden und der Prozess kann umgeschaltet werden.

8) Nachteile der Softwarelösungen:
  1. Sie verwenden aktives Warten.
  1. Sie führen zu recht komplexen Programmsätzen, besonders bei mehreren Prozessen.


TSL -Befehl


Die meisten Prozessoren unterstützen einen speziellen Maschinenbefehl TSL (Test and Set Lock). Die Operation „Sperre testen und setzen“ wird in einem Befehl ununterbrechbar (atomar) implementiert. Diese Lösungsart wurde als Hardwarelösung benannt.

Die Nachteile:

1)Aktives Warten wird verwendet:

enter:




TSL R1, LOCK // kopiere LOCK in R1
// und setze LOCK auf 1
CMP R1, #0 // war LOCK = 0 ?
JNZ enter // falls ≠ 0, zur Wiederholung
// falls LOCK ≠ 0, ist KB gesperrt


2) Die Lösung ist prozessorabhängig.
3) Der Maschinenbefehl wird vom Anwendungsprogrammierer kaum verwendet.


Prioritätsumkehrung


Ein aktives Warten kann die Ursache für den unendlichen Zyklus sein:

1) Ein Prozess L mit niedriger Priorität hat einen kritischen Bereich (KB) betreten.
2) Danach will ein Prozess H mit höherer Priorität den selben KB betreten.
3) Der Prozess H beginnt aktives Warten.
4) Nach Schedulingregel läuft der Prozess H immer, wenn er bereit ist.
5) Der Prozess L hat keine CPU-Zeit, um KB zu verlassen.


4.2. Semaphor


Definition

(Edsger Dijkstra, 1962)

Ein Semaphor ist ein Betriebssystemobjekt für die Synchronisation von Prozessen.
Ein Semaphor realisiert das Eintritts- und Austrittsprotokoll des kritischen Bereiches und wurde zur Lösung des wechselseitigen Ausschlusses entwickelt. Ein Semaphor gehört zur Lösungsart, welche das Betriebssystem verwenden.

Analogie: Eingleisige Strecken im Eisenbahnnetz sind kritische Abschnitte. Eintritt und Austritt von Strecken müssen durch Semaphor geregelt werden.


Struktur


Ein Semaphor besitzt:

1) Eine Identität, z.B. Originalname. Mehrere Prozesse können ein Semaphor verwenden und durch die Identität von anderen Semaphoren unterscheiden.
2) Ein Markenzähler (Semaphorzähler) ist ein ganzzahliges Attribut. Er bestimmt, wie viele Prozesse noch in den kritischen Bereich dürfen. Bei der Semaphorerzeugung erhält der Zähler einen Initialwert.
3) Eine Warteschlange von blockierten Prozessen. Wenn ein Prozess nicht den kritischen Bereich betreten darf, wird er blockiert und in die Warteschlange angefügt.
4) Initialisierungsoperation bzw. Konstruktor, initialisiert den Semaphorzähler bei der Erzeugung.
5) Zwei berühmte Operationen bzw. Methoden: P und V.


Operationen


Die P -und V-Operationen werden als Eintritt- und Austritt-Operationen für einen kritischen Bereich vorgesehen.

Sie können als modernisierte Operationen „Sperre testen und setzen“ und „Sperre aufheben“ betrachtet werden. Prinzipielle Anforderungen an Operationen:

1) Die Operationen müssen unteilbar (atomar, ununterbrechbar) sein.
2) Die Operationen müssen den aufrufenden Prozess blockieren können.

Diese Anforderungen sind erfüllt, wenn die Operationen als Systemaufrufe angesprochen werden.


P – Operation
 (image: http://ife.erdaxo.de/uploads/BSys04Synchronisation/BSys16.gif)

V – Operation
 (image: http://ife.erdaxo.de/uploads/BSys04Synchronisation/BSys17.gif)

Legende: MZ-Markenzähler


Operationen-Synonyme


Eintritt- Operation Austritt- Operation
von Dijkstra P V
Übersetzung passieren verlassen
Unix sem_wait sem_post
Windows WaitForSingleObject ReleaseSemaphore
Algol 68 down up
Java 5 acquire release
Binärer Semaphor lock unlock



Operationen-Realisierung


Ein Semaphor kann im Betriebssystem oder in systemnaher Bibliothek realisiert werden.

Beispiel 1. Ein Semaphor, der im Betriebssystem Windows realisiert wurde, kann mittels den Systemaufrufen
angesprochen werden:

a) Erzeugung und Initialisierung
s1= CreateSemaphore(…, Initialwert, „Name“);
b) Zugang öffnen
s1 = OpenSemaphore(…, "Name");
c) Aufruf der P-Operation
WaitForSingleObject(s1, …);
d) Aufruf der V-Operation
ReleaseSemaphore(s1, ...);



Beispiel 2. Ein Semaphor, der in systemnaher Bibliothek realisiert wird, kann mittels Methodenaufrufen angesprochen werden:

a) Bibliothek
java.util.concurrent.Semaphore;
b) Erzeugung und Initialisierung
s1 = new Semaphore(Initialwert);
c) Aufruf der P-Operation
s1.acquire();
d) Aufruf der V-Operation
s1.release ();


Semaphortypen


Die Spezialisierung kommt durch den Initialisierungswert (I) des Markenzählers vor.

I Name und Beschreibung
N Zählsemaphor (general semaphore). Ein Zählsemaphor wird z.B. in dem Erzeuger- Verbraucher-Problem verwendet.
1 Binärsemaphor (mutex, mutual exclusion). Ein binärer Semaphor wird zur Lösung des wechselseitigen Ausschlusses verwendet.
0 Schlafen/Wecken (sleep/wakeup). Der Prozess- Aufrufer wird blockiert bis er durch einen anderen Prozess aufgeweckt wird. Ein mit 0 initialisierter Semaphor wird für den Synchronisationspunkt bzw. Barriere verwendet.



Verwendung


In folgendem Beispiel wird ein Windows-Semaphor zur Lösung des wechselseitigen Ausschlusses verwendet:

1) Zuerst erzeugt ein von Prozessen, z.B. „Prozess a“ einen Semaphor: CreateSemaphore(...);
2) Ein anderer Prozess, z.B. „Prozess b“ öffnet Zugang zu dem schon existierenden Semaphor: OpenSemaphore(...);
3) Beide Prozesse laufen pseudoparallel und schützen ein gesamten kritischen Bereich (KB):

Prozess a:
for(...)
{ WaitForSingleObject(...); //P
   KB(...);
   ReleaseSemaphore(...);   //V
}


Prozess b:
for(...)
{ WaitForSingleObject(...); //P
   KB(...);
   ReleaseSemaphore(...);   //V
}


⇒ Demo 2


Vorteile und Nachteile


1) Vorteile gegenüber der Softwarelösung und Hardwarelösung:
  1. Semaphoren sind universell. Die Operationen V und P sind getestet und fehlerfrei.
  1. Keine CPU-Zeit-Verschwendung, weil nur passives Warten verwendet wurde.
  1. Der wechselseitige Ausschluss ist garantiert, weil die Operationen unteilbaren sind.

2) Nachteile:
  1. Algorithmen mit Semaphoren sind schwierig zu verstehen und zu entwerfen.
  1. Bei der Programmierung werden leicht Fehler gemacht:
    • wenn ein P vergessen wird, ist der wechselseitige Ausschluss nicht mehr garantiert,
    • wenn ein V vergessen wird, kann dies zu einer Verklemmung führen.


4.3. Semaphor und Erzeuger-Verbraucher-Problem


Erzeuger-Verbraucher-Problem


Synonyme: Produzent–Konsument, Producer–Consumer, beschränkte Puffer-Problem.

Sachverhalt:

1) Einige Prozesse erzeugen, andere verbrauchen Datenelemente (Werte, Daten, Einträge).
2) Datenelemente werden im Lager (Puffer, FIFO-Speicher) abgelegt.
3) Die Anzahl der Plätze (Fächer) im Lager bzw. Lagerkapazität ist beschränkt.
4) Das Lager muss die Geschwindigkeitsunterschiede zwischen Erzeuger und Verbraucher ausgleichen.


Lager im gemeinsamen Speicher


 (image: http://ife.erdaxo.de/uploads/BSys04Synchronisation/BSys18.gif)


Probleme

1) Wenn der Erzeuger einen neuen Eintrag im Lager ablegen möchte, das Lager aber schon voll ist, muss der Erzeuger blockiert (gesperrt, schlafen gelegt) werden.

2) Wenn der Verbraucher ein oder mehrere Einträge entfernt hat, muss der Erzeuger fortgesetzt werden.

3) Ähnlich geht es mit dem Verbraucher, wenn das Lager leer ist.

4) Das Problem des wechselseitigen Ausschlusses bleibt aktuell.


Besonderheiten der Steuerung


1) Bei dem Datenaustausch mittels des gemeinsamen Speichers kommen beide IPC zustande:
  1. Prozess-Synchronisation und
  1. Prozess-Kommunikation.

2) Die Synchronisation von Prozessen oder Threads bei den Zugriffen auf gemeinsamen Speicher ist die Aufgabe des Programmierers.

3) Im Erzeuger-Verbraucher-Problem gibt es zwei Arten der Synchronisation:
  1. Bedingte Synchronisation (Long Wait). Die Prozesse/Threads dürfen nur in der bestimmten zeitlichen Reihenfolge auf Ressourcen zugreifen.
  1. Der wechselseitige Ausschluss (Short Wait). Mehrere Prozesse dürfen nicht gleichzeitig auf eine Ressource zugreifen. Dabei ist die zeitliche Reihenfolge unwichtig.


Lösung mit den zwei Semaphoren


Attribute und Methoden der Klasse „Lager“:

        Semaphore voll(1);  //Lagerkapazität = 1
        Semaphore leer(0);  //Anzahl der Einträge = 0
       
        void insert(int w)
{ //1.schlafe,wenn voll
       voll.P();
   //2.Erzeuger betritt KB
       put(w);
   //3.wecke,wenn leer
       leer.V();  
}

int remove()
{ //1.schlafe,wenn leer
       leer.P();
   //2.Verbraucher betritt KB
       int w = get();
   //3.wecke,wenn voll
        voll.V();
        return w;
}


Methoden get und put greifen direkt auf die Datenstruktur und enthalten den kritischen Bereich (KB).


Sonderfall:

Wenn der Lager nur ein einzigen Platz besitzt (Lagerkapazität =1), kann die richtige Synchronisation nur mit zwei Semaphoren gewährleistet werden.

Ablauf:

1) Der Semaphor „voll“ sperrt den doppelten Erzeuger-Zugriff. Der Verbraucher darf den KB betreten, wenn der Erzeuger KB verlässt.

2) Der Semaphor „leer“ sperrt den doppelten Verbraucher-Zugriff. Der Erzeuger darf KB betreten, wenn der Verbraucher den KB verlässt.

3) Logischerweise sind nur die abwechselnden Zugriffe möglich. Beide Synchronisationsarten sind damit gewährleistet.


Lösung mit drei Semaphoren


Korrekte Lösung für beliebige Anzahl von Erzeuger, Verbraucher und Lagerkapazität. Attribute und Methode der Klasse „Lager“:

Semaphore voll(kap);   //Lagerkapazität = kap
Semaphore leer(0);      //Anzahl der Einträge = 0
Semaphore mutex(1);  //Binärer Semaphor

void insert(int w)
{ voll.P();
   mutex.P();
   put(w); //KB
   mutex.V();
   leer.V();  
}

int remove()
{ leer.P();
   mutex.P();
   int w = get(); //KB
   mutex.V();
   voll.V();
   return w;
}


⇒ Demo 3.



CategoryBSys
Diese Seite wurde noch nicht kommentiert.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki