www.wikidata.de-de.nina.az
Beim Philosophenproblem englisch dining philosophers problem handelt es sich um ein Fallbeispiel aus dem Bereich der theoretischen Informatik Damit soll das Problem der Nebenlaufigkeit und die Gefahr der Verklemmung von Prozessen veranschaulicht werden Das Problem wurde von Edsger W Dijkstra formuliert Aufbau des Philosophenproblems Inhaltsverzeichnis 1 Aufbau 2 Problem 3 Losung mittels Ressourcenhierarchie 4 Alternative Losung 5 Zweck des Philosophenproblems 6 Siehe auch 7 Literatur 8 Weblinks 9 EinzelnachweiseAufbau BearbeitenFunf Philosophen nummeriert von eins bis funf leben in einem Haus in dem der Tisch fur sie gedeckt ist wobei jeder Philosoph seinen eigenen Platz am Tisch hat Ihr einziges Problem neben dem der Philosophie ist dass es sich bei dem servierten Gericht um eine sehr schwierige Sorte Spaghetti handelt die mit zwei Gabeln gegessen werden muss Zwischen den Tellern befindet sich jeweils eine Gabel sodass dies fur einen einzelnen Philosophen kein Problem darstellt Allerdings konnen zwei Nachbarn nicht gleichzeitig essen 1 Problem BearbeitenDie Philosophen sitzen am Tisch und denken uber philosophische Probleme nach Wenn einer hungrig wird greift er zuerst die Gabel links von seinem Teller dann die auf der rechten Seite und beginnt zu essen Wenn er satt ist legt er die Gabeln wieder zuruck und beginnt wieder zu denken Sollte eine Gabel nicht an ihrem Platz liegen wenn der Philosoph sie aufnehmen mochte so wartet er bis die Gabel wieder verfugbar ist Solange nur einzelne Philosophen hungrig sind funktioniert dieses Verfahren Es kann aber passieren dass sich alle funf Philosophen gleichzeitig entschliessen zu essen Sie ergreifen also alle gleichzeitig ihre linke Gabel und nehmen damit dem jeweils links von ihnen sitzenden Kollegen dessen rechte Gabel weg Nun warten alle funf darauf dass die rechte Gabel wieder auftaucht Das passiert aber nicht da keiner der funf seine linke Gabel zurucklegt Die Philosophen verhungern Losung mittels Ressourcenhierarchie BearbeitenBei der Ressourcenhierarchie Losung werden die Gabeln von eins bis funf durchnummeriert Jeder Philosoph muss immer zuerst versuchen die Gabel mit der niedrigeren Nummer aufzunehmen und nur wenn das erfolgreich war versucht er die Gabel mit der hoheren Nummer aufzunehmen In diesem Fall konnen nicht alle funf Philosophen gleichzeitig die Gabel mit der niedrigeren Nummer aufnehmen Entweder nimmt der erste Philosoph die Gabel mit der Nummer eins die zu seiner linken oder der letzte Philosoph nimmt diese Gabel die zu seiner rechten Nimmt der erste Philosoph diese Gabel so erhalt der vorletzte Philosoph zwei Gabeln und der letzte keine Nimmt der letzte Philosoph diese Gabel so erhalt der erste Philosoph keine Gabel und der letzte und vorletzte Philosoph streiten sich um die Gabel mit der Nummer funf wer zuerst kommt isst mit zwei Gabeln Der folgende Quellcode ist eine C 11 Implementierung der Ressourcenhierarchie Losung fur drei Philosophen Die Funktion sleep for simuliert die Zeit die normalerweise mit Geschaftslogik verbracht wird include lt iostream gt include lt chrono gt include lt mutex gt include lt thread gt include lt random gt include lt ctime gt using namespace std int myrand int min int max static mt19937 rnd time nullptr return uniform int distribution lt gt min max rnd void phil int ph mutex amp ml mutex amp mh mutex amp mo for verhindert dass Thread beendet wird int duration myrand 200 800 Block begrenzt Gueltigkeit von lock lock guard lt mutex gt moGuard mo cout lt lt ph lt lt denkt lt lt duration lt lt ms n this thread sleep for chrono milliseconds duration lock guard lt mutex gt moGuard mo cout lt lt t t lt lt ph lt lt ist hungrig n lock guard lt mutex gt mlGuard ml this thread sleep for chrono milliseconds 400 lock guard lt mutex gt mhGuard mh duration myrand 200 800 lock guard lt mutex gt moGuard mo cout lt lt t t t t lt lt ph lt lt isst lt lt duration lt lt ms n this thread sleep for chrono milliseconds duration int main cout lt lt speisende Philosophen C 11 mit Ressourcenhierarchie n mutex m1 m2 m3 3 Gabeln sind 3 Mutexe mutex mo fur ordentliche Ausgabe 3 Philosophen sind 3 Threads thread t1 amp phil 1 m1 m2 mo thread t2 amp phil 2 m2 m3 mo thread t3 amp phil 3 m1 m3 mo Ressourcenhierarchie t1 join verhindert dass Threads beendet werden t2 join t3 join Alternative Losung BearbeitenBei dieser Variante muss jeder hungrige Philosoph entweder beide Gabeln gleichzeitig oder keine Gabeln aufnehmen Es ist nicht gestattet nur eine aufzunehmen wenn die zweite nicht verfugbar ist Allerdings ist es in diesem Fall moglich dass zum Beispiel immer abwechselnd Philosoph eins und drei und dann Philosoph zwei und vier essen In diesem Fall verhungert der funfte Philosoph Zweck des Philosophenproblems BearbeitenDas Szenario der funf gelegentlich auch nur drei oder vier speisenden Philosophen wird oft gebraucht um das Problem der Interprozesskommunikation und Ressourcenverwaltung bei der Entwicklung von Betriebssystemen zu illustrieren Das Beispiel soll darstellen was passieren kann wenn parallele Prozesse auf mehrere gemeinsame Ressourcen angewiesen sind und gleichzeitig darauf zugreifen Dann kann es passieren dass alle blockiert sind und auf ein Ereignis warten das durch diese Blockade nie eintreffen wird Ein solcher Zustand wird als Deadlock oder Verklemmung bezeichnet Zur Losung des Problems werden typischerweise fortschrittliche Mutexe oder Semaphore zur Sequentialisierung verwendet zum Beispiel scoped lock von C 17 2 Siehe auch BearbeitenErzeuger Verbraucher Problem Raucherproblem Verhungern Informatik Literatur BearbeitenAbraham Silberschatz amp James L Peterson Operating Systems Concepts Addison Wesley 1988 ISBN 0 201 18760 4 K Mani Chandy amp Jayadev Misra The Drinking Philosophers Problem In ACM Transactions on Programming Languages and Systems Vol 6 No 4 Oktober 1984 S 632 646 PDF 960 kB Edsger W Dijkstra Hierarchical ordering of sequential processes In Acta Informatica 1 2 1971 S 115 138 PDF 1 0 MB Daniel J Lehmann amp Michael O Rabin On the Advantages of Free Choice A Symmetric and Fully Distributed Solution to the Dining Philosophers Problem In Principles Of Programming Languages 1981 POPL 81 1981 S 133 138Weblinks BearbeitenDining Philiosophers Problem I deutsch Dining Philosopher Problem II deutsch Dining Philosophers Problem III deutsch Discussion of the problem with solution code for 2 or 4 philosophers englisch Discussion of various solutions 1 englisch Discussion of various solutions 2 englisch Interactive example of the Philosophers problem englisch als Java Applet gelten inzwischen als veraltet Satan Comes to Dinner englisch ThreadMentor englisch Einzelnachweise Bearbeiten Dijkstra E W 1971 June EWD310 Hierarchical ordering of sequential processes Acta Informatica 1 2 115 138 std scoped lock cppreference com Abgerufen am 15 Januar 2022 Abgerufen von https de wikipedia org w index php title Philosophenproblem amp oldid 238174463