Kapitel 7.2 Dining philosophers problem

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmen und Datenstrukturen
Advertisements

Algorithmentheorie 08 – Dynamische Programmierung (1)
Monitore in Java++ Aufgabe 2 von Markus Schlebusch Christoph Reinboth Sebastian Zok Johannes Stolte Norman Zuther.
Kapitel 11 Deadlocks RW-Systemarchitekur Kap. 11.
10.2 Wechselseitiger Ausschluss in Hardware
Wiederholung Betriebssystem bietet eine Abstraktion der Hardware an:
Beim Start eines Prozesses in Windows NT, 2000 wird a der Programmtext aus der exe-Datei ab der dort angegebenen Adresse gespeichert.
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
C Tutorium – Semaphoren –
Suche in Texten (Stringsuche )
Seminar Textmining WS 06/07 Themen Übung 9 Multilingualität Weitere Termine: 13.7.Symbolfolgen und PageRank Findlinks mitstreiter gesucht!
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Donnerstag Andreas Döring SS 2004.
Semaphore void Passieren (semaphore &s) { if (s > 0) { s--;
Kapitel 4 Syntaktische Analyse: LR Parsing.
Kapitel 6.1 Nebenläufigkeit und wechselseitiger Ausschluss
Systeme 1 Kapitel 5 Scheduling WS 2009/10.
Systeme 1 Kapitel 7 Deadlocks WS 2009/10.
Systeme 1 Kapitel 5.1 Unix Scheduling WS 2009/101.
Sortierverfahren Richard Göbel.
FH-Hof Deadlocks Richard Göbel. FH-Hof Deadlock - Definition Menge von Prozessen ist an einem Deadlock beteiligt: wenn jeder Prozess in dieser Menge auf.
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
Kapitel 10 Nebenläufigkeit und wechselseitiger Ausschluss
Übung 6.1Turing-Maschine 1.Machen Sie sich mit der Funktionsweise des Busy Beaver-Programms vertraut Vollziehen sie die 11 Schritte der ersten Turing-Tabelle.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Dynamische Programmierung (2) Matrixkettenprodukt
WS Algorithmentheorie 08 – Dynamische Programmierung (2) Matrixkettenprodukt Prof. Dr. Th. Ottmann.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Vorl. 6: Single- und Multitasking Universität Bielefeld – Technische Fakultät AG Rechnernetze und verteilte Systeme Peter B. Ladkin
Vorlesung 10 Mutual Exclusion Peter B. Ladkin Sommersemester 2001 Universität Bielefeld Technische Fakultät.
Vorlesung 9.2: Specification Universität Bielefeld – Technische Fakultät AG Rechnernetze und verteilte Systeme Peter B. Ladkin
Situationen Verteilte Anwendungen Wintersemester 06/07 © Wolfgang Schönfeld.
Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Ich habe Hunger.
Prozesskoordination Prof. Dr. W. Riggert.
OMRON 1 FINS Befehle schicken mit CX – Server Lite Aufgabe :
Systeme 1 Kapitel 4 Prozesse WS 2009/10.
Prozess-synchronisation
Übungen zum Vortrag „Backtracking mit Heuristiken“

BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Beweissysteme Hartmut Klauck Universität Frankfurt WS 06/
Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss
TEST - RECAP PRESENT PERFECT TENSE
Quiz FRIDAY on next 12 Essential Verbs!! (leben – sehen)
2.4 Rekursion Klassifikation und Beispiele
Prozess-synchronisation
Betriebssysteme Übung 2. Tutorium. Task 1 – Locks (1) Wozu Locks? Dienen dazu, exklusiven Zugriff auf eine Ressource sicherzustellen Lock = binäre Semaphore.
Interprozess- kommunikation (IPC)
Was möchten Sie trinken?
PHP: Operatoren und Kontrollstrukturen
Parallelisierung für Multiprozessor-Maschinen
If-patterns Marco.
You need to use your mouse to see this presentation © Heidi Behrens.
1.3 Verklemmungen Synchronisation löst Probleme – ist aber auch Gefahrenquelle: Prozeß wartet an Synchronisationspunkt – ist gesichert, daß er irgendwann.
Parallel Programming Semaphores / Reader - Writer - Lock
Warum wird den Schweizern der „Schieber“ nie langweilig? Warum spielen jede Woche so viele Leute Lotto? Warum verwenden Bankräuber normalerweise Schweissbrenner.
Algorithmen und Datenstrukturen Prof. Dr. Ralf Möller Universität zu Lübeck Institut für Informationssysteme Stefan Werner (Übungen) sowie viele Tutoren.
Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework Von: Simon Lubberich Erstbetreuer:
Dr. Wolfram Amme, Automatische Speicherverwaltung, Informatik II, FSU Jena, SS Automatische Speicherverwaltung.
DAS VIERTE DEUTSCHE KASUS Genitiv. Kasus ● What is a case? A case shows the grammatical function of a word. ● There are four cases in German. Up to now.
Der kritische Abschnitt
verkettete Strukturen
Aufgaben Semaphore Übersicht (Dijkstra)
 Präsentation transkript:

Kapitel 7.2 Dining philosophers problem Systeme 1 Kapitel 7.2 Dining philosophers problem WS 2009/10

Dining philosophers problem Fünf Philosophen sitzen an einem runden Tisch. Vor jedem Philosophen steht ein Teller mit Spaghetti. Die Spaghetti sind so fettig, dass zwei Gabeln zum Essen benötigt werden. Zwischen den Tellern liegt jeweils eine Gabel. (Dijkstra 1965)‏ WS 2009/10

Dining philosophers problem Ablauf: Die Philosophen sitzen am Tisch und diskutieren über philosophische Probleme. Wird ein Philosoph hungrig, so versucht er die rechte und die linke Gabel zu bekommen. Wenn es ihm gelingt beide Gabeln zu bekommen, isst er eine Zeit lang, legt die Gabeln wieder zurück und wendet sich wieder der Diskussion zu. WS 2009/10

Dining philosophers problem /* Philosoph(i) (i=1...N, N=5 */ philosopher(i)‏ { philosophise(); take_fork(i); /* nimm linke Gabel */ take_fork((i + 1) % N); /* nimm Rechte Gabel (modulo N)*/ eat(); put_fork(i); put_fork((i + 1) % N); } Angenommen alle fünf Philosophen nehmen ihre linke Gabel gleichzeitig. Dann kann keiner seine rechte Gabel aufnehmen und wartet. Deadlock /* take_fork(i) Nimm Gabel i */ take_fork(i)‏ { solange ( Gabel(i) belegt )‏ warte; Gabel(i); /* Gabel i ist belegt */ } WS 2009/10

Dining philosophers problem Verbesserung: Wenn rechte Gabel belegt, dann lege linke Gabel wieder zurück. /* Philosoph(i) (i=1...N, N=5 */ philosopher(i)‏ { philosophise(); take_fork(i); /* nimm linke Gabel */ take_fork((i + 1) % N); /* nimm rechte Gabel (modulo N)‏ Wenn Gabel (i + 1) % N belegt lege Gabel (i) zurück und versuche es später erneut */ ... Angenommen alle fünf Philosophen nehmen ihre linke Gabel gleichzeitig. Dann ist die jeweils rechte Gabel belegt und sie legen die linke wieder zurück. Im nächsten Versuch greifen wieder alle gleichzeitig zur linken Gabel usw... Die Prozesse laufen zwar alle uneingeschränkt weiter, aber sie machen keine Fortschritte Sie verhungern. WS 2009/10

Dining philosophers problem Verbesserung Jeder Philosoph wartet einen zufälligen Zeitraum bis zum nächsten Versuch. Dann ist die Wahrscheinlichkeit sehr gering, dass es zum Aushungern kommt. Aber unsaubere Lösung. In bestimmten Bereichen (Kraftwerk, Raumsonde, etc...) sollen selbst unwahrscheinliche Ereignisse soweit wie möglich ausgeschlossen werden. Murphys Law: „If there's more than one possible outcome of a job or task, and one of those outcomes will result in disaster or an undesirable consequence, then somebody will do it that way." WS 2009/10

Dining philosophers problem Verbesserungsvorschlag: Führe binären Semaphor ein: /* globaler semaphor initialisiert mit 1 */ Semaphor binSem = 1; /* Philosoph(i) (i=1...N, N=5 */ philosopher(i)‏ { philosophise(); down(binSem); take_fork(i); take_fork((i + 1) % N); eat(); put_fork(i); put_fork((i + 1) % N); up(binSem); } Theoretisch korrekte Lösung. Aber es kann immer nur ein Philosoph essen. Mit fünf Gabeln können aber zwei Philosophen gleichzeitig essen. Keine performante Lösung! WS 2009/10

Dining philosophers problem Vorschlag von Tanenbaum: Diese Lösung verwendet ein globales Feld (status) (Array), um zu verfolgen, in welchem Zustand sich ein Philosoph aktuell befindet. Ein hungriger Philosoph kann nur in den essenden Zustand übergehen, wenn seine beiden Nachbarn nicht am Essen sind. Das Programm verwendet für jeden Philosophen einen Semaphor, so dass diese blockieren können, falls die Gabeln in Gebrauch sind. /* global verfügbare Variablen */ Integer N = 5; /* Anzahl der Philosophen */ Semaphor binSem = 1; /* einfache binäre Semaphore */ Semaphor philSem[N]; /* ein Semaphor pro Philosoph */ String status[N]; /* Zustand der einzelnen Philosophen */ /* Hilfsfuntionen */ left(i) { return (i+N-1)%N; } /* Index linker Nachbar */ right(i) { return (i+1)%N; } /* Index rechter Nachbar */ WS 2009/10

Dining philosophers problem Vorschlag von Tanenbaum: /* Funktion zum Testen der Nachbarn */ test(i) /* Test für Philosoph i (i = 0 ... N-1)‏ { wenn( status[i] == “hungrig“ und status[left(i)] != “essend“ und status[right(i)] != “essend“ ) /* linker und rechter Nachbar essen nicht und Philosoph ist hungrig, dann darf der Philosoph i essen. */ up(philSem[i]); /* löst evtl. wartenden Philosophen */ } WS 2009/10

Dining philosophers problem Vorschlag von Tanenbaum: /* Nehme Gabeln */ take_forks(i) /* Für Philosoph i (i = 0 ... N-1)‏ { down(binSem); /* betrete kritischen Abschnitt */ status[i] = „hungrig“; /* setze Status auf hungrig */ test(i); /* versuche beide Gabeln zu bekommen */ up(binSem); down(philSem[i]); /* blockiere wenn Gabeln nicht erhalten */ } Bemerkung: Die binäre Semaphore schützt den Zugriff auf das gemeinsam genutzte Statusfeld. Der Aufruf down(philSem[i]) blockiert den Philosophen, falls test(i) den Semaphoren vorher nicht erhöht hatte. up() wurde in test(i) nur ausgeführt, falls die beiden Gabeln verfügbar waren. WS 2009/10

Dining philosophers problem Vorschlag von Tanenbaum: /* Lege Gabeln zurück */ put_forks(i) /* Für Philosoph i (i = 0 ... N-1)‏ { down(binSem); /* betrete kritischen Abschnitt */ status[i] = „denkend“; /* setze Status auf denkend */ /* können die beiden Nachbarn essen ? */ test(left(i)); test(right(i)); up(binSem); } WS 2009/10

Dining philosophers problem Vorschlag von Tanenbaum: /* Thread Funktionen */ /* Parallel für alle Philosophen */ philosopher(i) /* Für Philosoph i (i = 0 ... N-1)‏ { loop philosophise(); take_forks(i); eat(); put_forks(i); } Bemerkung: Auch diese Lösung hat ein Problem. Unter bestimmten Umständen kann es vorkommen, dass ein Philosoph verhungert. Übung WS 2009/10

Dining philosophers problem Um ein Verhungern zu verhindern, benötigt man zusätzlich ein Priorisierungssystem, um blockierte Philosophen in der Reihenfolge zu wecken, in der sie blockiert wurden: Beispiel 1: Wenn ein Philosoph hungrig ist, muss er erst eine Nummer ziehen. Er darf erst dann essen, wenn er die niedrigste Nummer hat. Beispiel 2: Priorisierung in der Tanenbaum-Lösung Philosoph i darf nur dann essen, wenn keiner seiner Nachbarn nicht schon „sehr lange“ wartet. Scheldulingalgorithmus WS 2009/10