Erzeuger-Verbraucher-Problem

Ähnliche Dokumente
Betriebssysteme (BTS)

leave: mov flag, 0 ; 0 in flag speichern: Lock freigeben ret

Monitore. Klicken bearbeiten

Prozeß P1 Prozeß P2. Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen

Gliederung. Monitor (eine auf ein Modul bezogene) Klasse

Klausur zum Kurs Betriebssysteme (1802) am 19. September 2009

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

#define N 5 // Anzahl der Philosophen. while (TRUE) { // Der Philosoph denkt

Übung zu Grundlagen der Betriebssysteme. 10. Übung

Betriebssystembau (BSB)

Rechnerarchitektur und Betriebssysteme (CS201): Semaphor, Monitor, Deadlocks, Re-Entrance

Architektur Verteilter Systeme Teil 6: Interprozess-Kommunikation

Softwarelösungen: Versuch 4

Übung Betriebssysteme 11

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 1

U9 Ringpuffer U9 Ringpuffer

Verbessertes Konzept: Monitore

Proseminar Nichtsequentielle Programmiersprachen WS 2011/2012 Monitore

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Nebenläufige Programmierung

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes

Inhaltsverzeichnis. Carsten Vogt. Nebenläufige Programmierung. Ein Arbeitsbuch mit UNIX/Linux und Java ISBN:

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

Parallele Programmabläufe: R S

Parallele Prozesse. Prozeß wartet

Moderne Betriebssysteme. Kapitel 8. Kapitel 8. Folie: 1. Multiprozessorsysteme. Autor: Andrew S. Tanenbaum

Verteilte Systeme CS5001

Zur Erinnerung: Threads. Threadverwaltung. Threads: Prioritäten. Beispiel Flugbuchungsprogramm. Nichtdeterminismus

Beschreiben Sie stichwortartig, was die folgenden Kommandos bewirken.

Thread-Konzept in objektorientierten Programmiersprachen. Threads. Threads in Java

Betriebssysteme Theorie

RO-Tutorien 3 / 6 / 12

Präzedenz von Operatoren

Theorie zu Übung 8 Implementierung in Java

Zusammenfassung Modul 223

Beispiel für überladene Methode

TEIL I: OBJEKTORIENTIERUNG UND GRUNDKURS JAVA GRUNDLAGEN DER PROGRAMMIERUNG... 4

Klausur zur Vorlesung Grundlagen der Betriebssysteme WS 2011 / 2012

Informationsverarbeitung im Bauwesen

Technische Informatik II

VBA-Programmierung: Zusammenfassung

Klausur zur Vorlesung Grundlagen der Betriebssysteme WS 2012/2013

Synchronisation in Java. Invisible Web

Applet Firewall und Freigabe der Objekte

Musterlösung Prüfung SS 2002

Überschreiben von Methoden

Vorname: Nachname: Matrikelnummer: Klausur. Betriebssysteme

Prozeßverwaltung. die Prozeßtabelle enthält die Prozeßleitblöcke

Handbuch zum Umgang mit dem. Open Ticket Request System OTRS

RTEMS- Echtzeitbetriebssystem

Übung 8: Semaphore in Java (eigene Implementierung)

Domänenmodell: Fadenkommunikation und -synchronisation

Universität Karlsruhe (TH)

Durchführung eines ELAN-Projektes zum Thema "Echtzeitdatenverarbeitung"

Objektorientierung Grundlagen

Funktionale Programmiersprachen

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Einführung in die Programmierung mit Java

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Mutual Exclusion und Synchronisation. Peter Puschner Institut für Technische Informatik

(Prof. Dr. J. Schlichter, WS 2011 / 2012) Übungsleitung: Dr. Wolfgang Wörndl

Systemsoftware (SYS)

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

U6-1 Organisatories. U6-2 Motivation von Threads. U6-3 Vergleich von Thread-Konzepten. Organisatorisches

Programmierung mit C Zeiger

I Grundlagen der parallelen Programmierung 1

(a) Wie unterscheiden sich synchrone und asynchrone Unterbrechungen? (b) In welchen drei Schritten wird auf Unterbrechungen reagiert?

Universität Karlsruhe (TH)

Bitte verwenden Sie nur dokumentenechtes Schreibmaterial!

Das Monitorkonzept Brinch-Hansen

Repetitorium Informatik (Java)

2. Hintergrundverarbeitung in Android: Services und Notifications

Probeklausur: Programmierung WS04/05

Übersicht. Nebenläufige Programmierung. Praxis und Semantik. Einleitung. Sequentielle und nebenläufige Programmierung. Warum ist. interessant?

HBCI-Diskette bzw. USB-Stick unter VR-NetWorld einrichten

5.5.8 Öffentliche und private Eigenschaften

RTOS Einführung. Version: Datum: Autor: Werner Dichler

WS Parallele Prozesse. Prof. Hannelore Frank. Parallele Prozesse. PetriNetze. Synchronisation UNIX. Wettbewerb PC Krit.Abschnitt Spinlocks

Übungspaket 23 Mehrdimensionale Arrays

A Kompilieren des Kernels B Lineare Listen in Linux C Glossar Interessante WWW-Adressen Literaturverzeichnis...

Besprechung Aufgabe 5 (crawl) POSIX-Threads. Problem: UNIX-Prozesskonzept ist für viele heutige Anwendungen unzureichend

Grundlagen der Programmierung

Vorlesung "Verteilte Systeme" Sommersemester Verteilte Systeme. Adreßraum. Rechner. Verteilte Systeme, Sommersemester 1999 Folie 19.

Linux Prinzipien und Programmierung

Logging, Threaded Server

Echtzeitprogrammierung und Echtzeitverhalten von Keil RTX. Frank Erdrich Semester AI 7

Betriebssysteme (BS)

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Proseminar Nichtsequentielle Programmiersprachen - alt und neu Einführung

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

9. Vorlesung Betriebssysteme

Einführung in die Programmierung mit VBA

OpenMP - Threading- Spracherweiterung für C/C++ Matthias Klein, Michael Pötz Systemprogrammierung 15. Juni 2009

Übungen Softwaretechnik I

Kapitel 5. Monitore und Synchronisationsbedingungen

Banner T 1 T 2. Bild T 7 T 8. Fließtext T 9

Rhapsody in C ein System zur aspektorientierten Embedded- Entwicklung? Dr.- Ing. Alexander Steinkogler B. Braun Melsungen AG

Auf einen Blick. Vorwort Einführung Sprachgrundlagen von VBScript Objektorientierte Programmierung mit. dem Windows Script Host 115

Einführung in die Informatik

Unified Modeling Language (UML)

Transkript:

Erzeuger-Verbraucher-Problem Hier: Puffer der Größe 1, Erzeuger, Verbraucher Zwei Semaphore werden eingesetzt, um zwischen Threads "Ereignisse zu melden" Man kann Semaphore auch verwenden, um Ereignisse zu produzieren und zu konsumieren P = konsumiert ein Ereignis (blockiert, wenn es noch gar nicht erzeugt worden ist) V = erzeugt ein Ereignis Jetzt kann man sich gegenseitig Ereignisse melden Beispiel: Semaphor leer = "Der Puffer ist leer" Semaphor voll = "Der Puffer ist voll" Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 30

Beispiel Erzeuger-Thread: Verbraucher-Thread Loop { P(leer); // Puffer füllen V(voll); Loop { P(voll); // Puffer leeren V(leer); Semaphor leer = 1; Semaphor voll = 0; Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 31

Beispiel Semaphor leer = 1; Semaphor voll = 0; P1 (Erzeuger): Loop { 01 P(leer); 02 // Puffer füllen 03 V(voll); P2 (Verbraucher): Loop { 04 P(voll); 05 // Puffer leeren 06 V(leer); leer.z leer.l voll.z voll.l Wer Wo Was Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 32

Bemerkungen Blockiert der Erzeuger bei vollem Puffer? Erzeuger macht initial ein P(leer), leer wurde mit 1 initialisiert Erzeuger blockiert beim zweiten P(leer), falls nicht in der Zwischenzeit ein V(leer) gemacht wurde P(leer) bedeutet: gehe nur weiter, wenn Puffer leer V(leer) bedeutet: sag dem Erzeuger, dass der Puffer leer ist Blockiert der Verbraucher bei leerem Puffer? Verbraucher blockiert beim initialen P(voll), voll initialisiert mit 0 Erst, wenn der Erzeuger ein V(voll) gemacht hat, deblockiert Verbraucher V(voll) bedeutet: sag dem Verbraucher, dass der Puffer voll ist P(voll) bedeutet: gehe nur weiter, falls Puffer voll Welche Reihenfolge wird eingehalten? Erzeuger und Verbraucher bearbeiten abwechselnd den Puffer Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 33

Erstes Leser-Schreiber-Problem Szenario: mehrere Leser und mehrere Schreiber gemeinsamer Datenbereich Schreiber haben exklusiven Zugriff Leser können parallel zugreifen (natürlich nur, wenn kein Schreiber zugreift) Implementierung mit Semaphoren Semaphor W regelt den exklusiven Zugriff mittels P(W) und V(W) W erlaubt durch einem Trick den parallelen Zugriff der Leser Nur der erste Leser ruft P(W) auf, der letzte dann V(W) Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 34

Beispiel int Readcount = 0; Semaphor W = 1, Mutex = 1; // Zugriff eines Leser-Threads: P(Mutex); Readcount++; if (Readcount == 1) P(W); V(Mutex); // Daten Lesen P(Mutex); Readcount--; if (Readcount == 0) V(W); V(Mutex); // Zugriff eines Schreiber-Threads: P(W); // Schreibe Daten V(W); Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 35

Ablaufbeispiel int Readcount = 0; Semaphor W = 1, Mutex = 1; // Zugriff eines Leser-Threads: 01 P(Mutex); 02 Readcount++; 03 if (Readcount == 1) P(W); 04 V(Mutex); 05 // Daten Lesen 06 P(Mutex); 07 Readcount--; 08 if (Readcount == 0) V(W); 09 V(Mutex); // Zugriff eines Schreiber-Threads: 10 P(W); 11 // Schreibe Daten 12 V(W); Mutex.z Mutex.L ReadCnt W.z W.L Wer Wo Was L1 1 L2 1 L1 2 L1 3 L1 4 L2 2 L2 3 L2 4 L1 5 L2 5 L1 6 L2 6 L1 7 L1 8 L1 9 S1 10 L2 7 L2 8 S1 11 L2 9 S2 10 S1 12 S2 11 S2 12 Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 36

Bemerkungen Warum schliessen sich einzelne Schreiber und die Gruppe aller Leser gegenseitig aus? Um zu schreiben, muss man das Semaphor W passiert haben Solange kein V(W) gemacht wurde, blockieren alle Schreiber Solange noch mindestens ein Leser liest, ist das Semaphor W auch gesperrt, alle Schreiber blockieren am P(W) Wofür braucht man das Semaphor Mutex? Ohne Mutex könnte zwischen Readcount++ und der Überprüfung ein Thread-Wechsel stattfinden Wenn zwei Leser "gleichzeitig" Readcount erhöhen, könnten Leser lesen, ohne ein P(W) gemacht zu haben Wie fair ist die Lösung? Solange mindestens ein Leser liest, kann kein Schreiber schreiben Leser können sich immer abwechseln und so alle Schreiber ausblocken (sie dürfen nur das Semaphor W nie "loslassen") Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 37

Zweites Leser-Schreiber-Problem Grundszenario wie erstes Leser-Schreiber-Problem Jetzt sollen aber die Schreiber Priorität haben! Was bedeutet Priorität? Zugriff eines Schreibers soll zum "frühestmöglichen" Zeitpunkt erlaubt werden Wenn noch Leser lesen, aber Schreiber schreiben möchten, darf kein neuer Leser beginnen zu lesen Ein Leser darf erst wieder lesen, wenn ein aktueller Schreiber aufgehört hat zu schreiben und kein Schreiber mehr schreiben will Bei einer offenen Wettbewerbssituation (Datenbereich ist frei, ein Schreiber möchte schreiben, mehrere Leser möchten lesen) darf maximal ein Leser dem Schreiber zuvorkommen Komplexes Problem, einfache Lösung mit Semaphoren Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 38

Beispiel int Readcount = 0; int Writecount = 0; Semaphor Mutex1 = 1, Mutex2 = 1, Mutex3 = 1, W = 1, R = 1; // Zugriff eines Leser-Threads: P(Mutex3); P(R); P(Mutex1); Readcount++; if (Readcount == 1) P(W); V(Mutex1); V(R); V(Mutex3); // lese Daten P(Mutex1); Readcount--; if (Readcount == 0) V(W); V(Mutex1) in blau: Code des ersten Leser-Schreiber-problems // Zugriff eines Schreiber-Threads P(Mutex2); Writecount++; if (Writecount == 1) P(R); V(Mutex2); P(W); // schreibe Daten V(W); P(Mutex2); Writecount--; if (Writecount == 0) V(R); V(Mutex2); Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 39

Bemerkungen Semaphor W hat dieselbe Bedeutung wie vorher Readcount hat dieselbe Bedeutung wie vorher Mutex1 schützt den exklusiven Zugriff auf Readcount Writecount zählt die Anzahl der bereiten Schreiber Mutex2 regelt exklusiven Zugriff auf Writecount Semaphor R realisiert die Priorität der Schreiber: R definiert einen kritischen Abschnitt, um den sich sowohl Leser als auch Schreiber bewerben R wird von Schreibern erst dann aufgegeben, wenn kein weiterer Schreiber sich beworben hat Mit dem Semaphor Mutex3 wird erreicht, dass sich alle Leser nacheinander um den Eintritt in R bewerben So kann maximal ein Leser einem Schreiber zuvorkommen Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 40

// Zugriff eines Leser-Threads: P(Mutex3); P(R); P(Mutex1); Readcount++; if (Readcount == 1) P(W); V(Mutex1); V(R); V(Mutex3); // lese Daten P(Mutex1); Readcount--; if (Readcount == 0) V(W); V(Mutex1) Ablaufbeispiel // Zugriff eines Schreiber-Threads P(Mutex2); Writecount++; if (writecount == 1) P(R); V(Mutex2); P(W); // schreibe Daten V(W); P(Mutex2); Writecount--; if (Writecount == 0) V(R); V(Mutex2); Readcount W.z W.L R.z R.L Mutex3.z Mutex3.L Kommentar Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 41

Erläuterung Leser1 beginnt zu lesen, anschliessend ist Readcount = 1, Semaphor W ist belegt Leser2 möchte lesen, Readcount = 2, geht direkt in den kritischen Abschnitt Leser3, Leser4 und Schreiber1 treten in direkte Wettbewerbssituation: alle drei starten parallel ihr Eintrittsprotokoll Leser3 und Leser4 streiten sich um Mutex3: Nur einer (z.b. Leser3) kommt durch, Leser4 blockiert an P(Mutex3) Leser3 und Schreiber konkurrieren um R: Nur einer (z.b. Schreiber) kommt durch, Leser3 blockiert an P(R) Schlimmstenfalls hätte Schreiber nur einen Leser vorlassen müssen Ergebnis: Leser4 blockiert an P(Mutex3), Leser3 blockiert an P(R), Schreiber blockiert an P(W) kein neuer Leser kommt in den kritischen Abschnitt Wenn Leser1 und Leser2 den kritischen Abschnitt verlassen, deblockiert Schreiber und geht in seinen kritischen Abschnitt Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 42

Bedingte kritische Abschnitte Eintritt in den kritischen Abschnitt hängt manchmal von einem Prädikat ab Prädikat kann über den im kritischen Abschnitt geschützten Daten definiert sein und muss deswegen auch geschützt werden Beispiel: DVD-Laufwerke, die auch defekt sein können Eintritt nur, falls es noch ein freies DVD-Laufwerk gibt, was nicht defekt ist Naive Implementierung: Semaphore Mutex = 1; P(Mutex); while (!Prädikat) { V(Mutex); NOP; P(Mutex); // Datenzugriff V(Mutex); Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 43

Bessere Lösung Naive Lösung implementiert wieder aktives Warten! In diesem Fall kann es bei ungünstiger Prozessorzuteilung zu einem Aushungern der Threads kommen Idee der besseren Lösung: Nur wenn die Daten modifiziert wurden, braucht man das Prädikat neu zu überprüfen Blockiere solange an zweitem Semaphor Condsem, bis die Daten modifiziert wurden Mit Zähler Waitcount wird gezählt, wieviele Threads die Bedingung prüfen wollen Bei Modifikation der Daten, Waitcount-Mal ein Ereignis auf Condsem generieren Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 44

Beispiel Semaphore Mutex = 1, Condsem = 0; int Waitcount = 0;... P(Mutex); while (!Prädikat) { Waitcount++; V(Mutex); P(Condsem); P(Mutex); // Datenzugriff while (Waitcount > 0) { Waitcount--; V(Condsem); V(Mutex); Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 45

Zusammenfassung Semaphore Semaphore: Üblicherweise implementiert auf Ebene des Dispatchers Bei UL-Threads kann man Semaphore auch auf Anwendungsebene realisieren (mehr siehe Übung) Für Echtzeitverarbeitung können die Semaphor-Listen prioritätsgesteuert werden Semaphore sind eine sehr mächtige Abstraktion Man kann mit ihnen schnell und einfach Lösungen zu Synchronisationsproblemen schreiben Komplexe Anforderungen resultieren oft in komplexen, fehleranfälligen Lösungen Semaphore sind für die Betriebssystemprogrammierung gut, schlecht für die Programmierung auf Anwendungsebene Gesucht: Sprachkonzept für leichter verständliche Lösungen auf Ebene einer Programmiersprache Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 46

Übersicht Einführung: Kritische Abschnitte Hardwaregestützte Mechanismen Betriebssystemgestützter Mechanismus: Semaphore Sprachgestützter Mechanismus: Monitore Programmiersprachliche Realisierung Implementierung mit Semaphoren Realisierungsbeispiele Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 47

Monitorkonzept Schon in den 1970er Jahren wurde klar, dass für die Software-Entwicklung noch abstraktere Synchronisationsformen notwendig waren Das Monitorkonzept fand dabei die meiste Beachtung Zeitgleich erfunden von Brinch Hansen und Hoare Monitore kapseln kritische Daten und kritische Abschnitte in eine programmiersprachliche Einheit Monitore kann man sich als Module aus modulorientierten Sprachen oder Klassen in objektorientierten Sprachen denken Monitore fügen aber eine explizite Synchronisationssemantik hinzu Monitor = kritischer Abschnitt Es ist immer nur ein Prozess gleichzeitig "im Monitor" (d.h. führt eine Monitorprozedur aus) Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 48

Sprachliche Realisierung MONITOR Monitorname (Parameter) Datendeklaration // gemeinsame Daten ENTRY Funktionsname1 (Parameter) { Prozedurkörper ENTRY Funktionsname2 (Parameter) { Prozedurkörper... ENTRY FunktionsnameN (Parameter) { Prozedurkörper INIT { Initialisierungscode END Initialisierung eines Monitors: einmaliges Aufrufen von Monitorname(aktuelle Parameter) Aufruf einer Monitorprozedur: Monitorname.Funktionsname(aktuelle Parameter) Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 49

Synchronisation Vorteile von Monitoren Die Programmiersprache garantiert, dass auch bei mehreren parallelen Threads immer nur ein Thread gleichzeitig eine Monitorprozedur ausführt Monitorprozeduren sind also logisch atomar Kritische Daten werden explizit in der Programmstruktur sichtbar gemacht Die Zugriffsoperationen definieren die zulässigen Manipulationen der Monitordaten Ein Umgehen des Monitors ist nicht möglich Kapselung kritischer Daten Wie bei Modulen oder Klassen realisieren Monitore das Konzept des information hiding Zugriffsfunktionen verbergen die interne Struktur Erhöht die Wartbarkeit des Programmcodes Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 50

Beispiel: exklusive Ressourcen Jede exklusive benutzbare Ressource wird durch einen Monitor repräsentiert Prozeduren definieren die Zugriffsfunktionen Beispiel: Monitor Disc zur Synchronisation von Plattenzugriffen MONITOR Disc ENTRY Read (Festplattenaddresse, Speicheradresse) { // Lesevorgang durchführen ENTRY Write (Speicheradresse, Festplattenadresse) { // Schreibvorgang durchführen INIT { // Gerät initialisieren END Vorlesung Betriebssysteme, Universität Mannheim, Herbstsemester 2008, Teil 6 51