Systeme 1 Kapitel 7.2 Dining philosophers problem WS 2009/101

Click here to load reader

  • date post

    05-Apr-2015
  • Category

    Documents

  • view

    111
  • download

    0

Embed Size (px)

Transcript of Systeme 1 Kapitel 7.2 Dining philosophers problem WS 2009/101

  • Folie 1
  • Systeme 1 Kapitel 7.2 Dining philosophers problem WS 2009/101
  • Folie 2
  • Dining philosophers problem Fnf Philosophen sitzen an einem runden Tisch. Vor jedem Philosophen steht ein Teller mit Spaghetti. Die Spaghetti sind so fettig, dass zwei Gabeln zum Essen bentigt werden. Zwischen den Tellern liegt jeweils eine Gabel. (Dijkstra 1965) WS 2009/102
  • Folie 3
  • 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 zurck und wendet sich wieder der Diskussion zu. WS 2009/103
  • Folie 4
  • Dining philosophers problem Angenommen alle fnf Philosophen nehmen ihre linke Gabel gleichzeitig. Dann kann keiner seine rechte Gabel aufnehmen und wartet. Deadlock WS 2009/104 /* 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); } /* take_fork(i) Nimm Gabel i */ take_fork(i) { solange ( Gabel(i) belegt ) warte; Gabel(i); /* Gabel i ist belegt */ }
  • Folie 5
  • Dining philosophers problem Verbesserung: Wenn rechte Gabel belegt, dann lege linke Gabel wieder zurck. WS 2009/105 /* 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) zurck und versuche es spter erneut */... Angenommen alle fnf Philosophen nehmen ihre linke Gabel gleichzeitig. Dann ist die jeweils rechte Gabel belegt und sie legen die linke wieder zurck. Im nchsten Versuch greifen wieder alle gleichzeitig zur linken Gabel usw... Die Prozesse laufen zwar alle uneingeschrnkt weiter, aber sie machen keine Fortschritte Sie verhungern.
  • Folie 6
  • Dining philosophers problem Verbesserung Jeder Philosoph wartet einen zuflligen Zeitraum bis zum nchsten Versuch. Dann ist die Wahrscheinlichkeit sehr gering, dass es zum Aushungern kommt. Aber unsaubere Lsung. In bestimmten Bereichen (Kraftwerk, Raumsonde, etc...) sollen selbst unwahrscheinliche Ereignisse soweit wie mglich 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/106
  • Folie 7
  • Dining philosophers problem Verbesserungsvorschlag: Fhre binren Semaphor ein: WS 2009/107 /* 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 Lsung. Aber es kann immer nur ein Philosoph essen. Mit fnf Gabeln knnen aber zwei Philosophen gleichzeitig essen. Keine performante Lsung!
  • Folie 8
  • Dining philosophers problem Vorschlag von Tanenbaum: Diese Lsung 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 fr jeden Philosophen einen Semaphor, so dass diese blockieren knnen, falls die Gabeln in Gebrauch sind. WS 2009/108 /* global verfgbare Variablen */ Integer N = 5;/* Anzahl der Philosophen */ Semaphor binSem = 1; /* einfache binre 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 */
  • Folie 9
  • Dining philosophers problem Vorschlag von Tanenbaum: WS 2009/109 /* Funktion zum Testen der Nachbarn */ test(i) /* Test fr 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]); /* lst evtl. wartenden Philosophen */ }
  • Folie 10
  • Dining philosophers problem Vorschlag von Tanenbaum: WS 2009/1010 /* Nehme Gabeln */ take_forks(i) /* Fr 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 binre Semaphore schtzt den Zugriff auf das gemeinsam genutzte Statusfeld. Der Aufruf down(philSem[i]) blockiert den Philosophen, falls test(i) den Semaphoren vorher nicht erhht hatte. up() wurde in test(i) nur ausgefhrt, falls die beiden Gabeln verfgbar waren.
  • Folie 11
  • Dining philosophers problem Vorschlag von Tanenbaum: WS 2009/1011 /* Lege Gabeln zurck */ put_forks(i) /* Fr Philosoph i (i = 0... N-1) { down(binSem); /* betrete kritischen Abschnitt */ status[i] = denkend; /* setze Status auf denkend */ /* knnen die beiden Nachbarn essen ? */ test(left(i)); test(right(i)); up(binSem); }
  • Folie 12
  • Dining philosophers problem Vorschlag von Tanenbaum: WS 2009/1012 /* Thread Funktionen */ /* Parallel fr alle Philosophen */ philosopher(i) /* Fr Philosoph i (i = 0... N-1) { loop { philosophise(); take_forks(i); eat(); put_forks(i); } Bemerkung: Auch diese Lsung hat ein Problem. Unter bestimmten Umstnden kann es vorkommen, dass ein Philosoph verhungert. bung
  • Folie 13
  • Dining philosophers problem Um ein Verhungern zu verhindern, bentigt man zustzlich 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-Lsung Philosoph i darf nur dann essen, wenn keiner seiner Nachbarn nicht schon sehr lange wartet. Scheldulingalgorithmus WS 2009/1013