www.wikidata.de-de.nina.az
Der Begriff Interprozesskommunikation englisch interprocess communication kurz IPC bezeichnet in der Informatik verschiedene Verfahren des Informationsaustausches zwischen den Prozessen eines Systems Mithilfe eines Shared Memory erfolgt die Kommunikation dadurch dass mehrere Prozesse auf einen gemeinsamen Datenspeicher zugreifen konnen beispielsweise gemeinsame Bereiche des Arbeitsspeichers Bei einer Message Queue dagegen werden Nachrichten von einem Prozess an eine Nachrichtenschlange geschickt von wo diese von einem anderen Prozess abgeholt werden konnen Die Kommunikation zwischen den Prozessen sollte in einer gut strukturierten Weise erfolgen Um Race Conditions zu vermeiden sollten die kritischen Abschnitte in denen auf gemeinsam genutzten Speicher zugegriffen wird vor einem quasi gleichzeitigen Zugriff geschutzt werden Dies kann durch verschiedene Mechanismen wie Semaphore oder Monitore realisiert werden Wenn jedoch jeder Prozess aus einer Menge von Prozessen auf ein Ereignis wartet das nur ein anderer Prozess aus der Menge auslosen kann entsteht eine Deadlock Situation Klassische Problemstellungen der Interprozesskommunikation sind das Erzeuger Verbraucher Problem das Philosophenproblem und das Leser Schreiber Problem Inhaltsverzeichnis 1 Grundlagen 2 Techniken 2 1 Speicherbasierte Kommunikation 2 1 1 Shared Memory 2 1 2 Kommunikation uber Dateien 2 2 Nachrichtenbasierte Kommunikation 2 2 1 Message Queue Nachrichtenschlange 2 2 2 Namenlose Pipes 2 2 3 Benannte Pipes FIFO Pipes 2 2 4 Sockets 3 Race Conditions 4 Synchronisation 4 1 Aktives Warten 4 1 1 Sperrvariablen und strikter Wechsel 4 1 2 Wechselseitiger Ausschluss mit Hardware Unterstutzung 4 1 3 Algorithmus von Peterson 4 2 Passives Warten 4 2 1 Semaphor 4 2 2 Mutex 4 2 3 Monitor 5 Deadlocks 6 Klassische Problemstellungen 6 1 Erzeuger Verbraucher Problem 6 2 Philosophenproblem 6 3 Leser Schreiber Problem 7 Siehe auch 8 Literatur 9 EinzelnachweiseGrundlagen BearbeitenSiehe auch Prozess Informatik Ein Programm ist eine den Regeln einer bestimmten Programmiersprache genugende Folge von Anweisungen bestehend aus Deklarationen und Instruktionen um bestimmte Funktionen bzw Aufgaben oder Probleme mithilfe eines Computers zu bearbeiten oder zu losen 1 Jedes Programm wird normalerweise in einem Betriebssystem Prozess ausgefuhrt der zum Ablauf einem Prozessor zugeordnet werden muss Ein Prozess stellt auf einem Rechnersystem die Ablaufumgebung fur ein Programm zur Verfugung und ist eine dynamische Folge von Aktionen mit entsprechenden Zustandsanderungen oder anders gesagt die Instanzierung eines Programms Als Prozess bezeichnet man auch die gesamte Zustandsinformation eines laufenden Programms 2 Werden verschiedene Prozesse in kurzen Abstanden immer abwechselnd aktiviert entsteht der Eindruck von Gleichzeitigkeit auch wenn zu jedem Zeitpunkt unter Umstanden immer nur ein Prozess verarbeitet wird oder zumindest die Anzahl der Prozesse wesentlich hoher ist als die Anzahl der vorhandenen CPUs 3 In Multitasking Systemen laufen die meisten Prozesse nebenlaufig und wissen kaum etwas voneinander Ein Speicherschutz schutzt das Betriebssystem davor dass ein Prozess auf die Speichersegmente eines anderen Prozesses zugreifen kann und so die Stabilitat des Systems beeintrachtigen wurde Voraussetzung dafur ist eine Memory Management Unit Speicherverwaltungseinheit kurz MMU Dennoch gibt es Anwendungsfalle bei denen Prozesse mit anderen Prozessen kommunizieren mussen Einige davon sind Mehrere Prozesse mussen spezielle Daten gemeinsam verwenden Die Prozesse sind untereinander abhangig und mussen aufeinander warten Daten mussen von einem Prozess an einen anderen weitergereicht werden Die Verwendung von Systemressourcen muss koordiniert werden 4 nbsp Drei Prozesse greifen gleichzeitig auf eine geteilte Ressource zu Kommunikation meint in diesem Zusammenhang grundsatzlich den Austausch von Informationen nach bestimmten Regeln Sie sollte also in einer gut strukturierten Weise erfolgen Das Regelwerk fasst man in der Datenkommunikation bzw bei Rechennetzwerken unter dem Begriff Protokoll zusammen 5 Beispiele Drucker Spooler Wenn ein Prozess eine Datei drucken mochte tragt er den Dateinamen in einen speziellen Spoolerordner spooler directory ein Ein anderer Prozess der Drucker Daemon printer daemon uberpruft zyklisch ob es irgendwelche Dateien zu drucken gibt Wenn es welche gibt druckt er diese aus und entfernt danach ihren Namen wieder aus dem Ordner 6 Pipe Durch die Eingabe eines Zeichens in der Unix Shell wird die Ausgabe eines ersten Prozesses an einen zweiten Prozess weitergereicht Man nennt zwei Prozesse konkurrent wenn es mindestens ein Zeitintervall gibt in dem sie beide begonnen aber nicht abgeschlossen sind Im Einprozessorsystem konnen konkurrente Prozesse nur abschnittweise sequentiell bearbeitet werden wahrend im Mehrprozessorsystem datenunabhangige Abschnitte gleichzeitig ausgefuhrt werden konnen 7 Ein Betriebsmittel muss in dem Sinne determiniert sein dass unter der Kontrolle des Betriebssystems ablaufende Programme jeweils identische Resultate liefern unabhangig davon in welcher Umgebung sie ablaufen d h unabhangig mit welchen anderen Programmen zusammen Andererseits sind die tatsachlichen Vorgange nicht determiniert da es moglich sein muss auf Ereignisse unabhangig von der Reihenfolge ihres Auftretens zu reagieren Solche Ereignisse sind beispielsweise Betriebsmittelanforderungen Laufzeitfehler und asynchrone Unterbrechungen die von Ein und Ausgabegeraten erzeugt werden 8 Techniken BearbeitenSpeicherbasierte Kommunikation Bearbeiten Shared Memory Bearbeiten Mit der Shared Memory stellt das Betriebssystem einen Mechanismus bereit durch den mehrere Prozesse auf einen gemeinsamen Datenspeicher zugreifen konnen Um dies zu ermoglichen muss ein Prozess als Erstes einen gemeinsamen Datenspeicher anlegen Danach mussen alle Prozesse die ebenfalls darauf zugreifen sollen mit diesem Datenspeicher bekannt gemacht werden Dies geschieht indem der Speicherbereich im Adressraum der entsprechenden Prozesse eingefugt wird siehe auch Speicherverwaltung Ebenfalls muss hierbei den Prozessen mitgeteilt werden wie diese auf den Speicherbereich zugreifen konnen lesend schreibend Wurde all dies erledigt kann der Datenspeicher wie ein gewohnlicher Speicherbereich verwendet werden Shared Memory ist die schnellste Form der Interprozesskommunikation da von zwei oder mehreren Prozessen ein bestimmter Speicherbereich gemeinsam benutzt wird und somit das Kopieren zwischen Server und Clients nicht notwendig ist Fur eine ordnungsgemasse Kommunikation muss jedoch darauf geachtet werden dass die einzelnen Prozesse untereinander synchronisiert werden Als Mechanismus fur die Prozesssynchronisation werden haufig Monitore oder Semaphore verwendet 9 Bei der Speicherverwaltung mittels Paging kann Shared Memory durch die Verwendung von gemeinsamen Seiten umgesetzt werden Es verweisen dabei mehrere Seitentabelleneintrage verschiedener Prozesse auf gemeinsam genutzte Speicherbereiche Seitenrahmen im physischen Arbeitsspeicher 10 Kommunikation uber Dateien Bearbeiten Eine einfache Form der Kommunikation ist der Austausch von Dateien Ein Prozess kann Daten in Dateien schreiben die ein anderer Prozess ebenfalls lesen oder beschreiben kann Diese Variante erfordert ebenfalls eine Synchronisation Haufig bietet das Betriebssystem einen Lock Mechanismus an der ganze Dateien sperrt Es sind aber auch klassische Mechanismen wie Semaphore moglich 11 Nachrichtenbasierte Kommunikation Bearbeiten Message Queue Nachrichtenschlange Bearbeiten nbsp Kommunikation uber eine Nachrichtenschlange Mit enter wird ein neuer Wert 3 der Schlange hinzugefugt und mit leave das am langsten gespeicherte Element 37 herausgenommen FIFO Prinzip Bei diesem Mechanismus werden Nachrichten von einem Prozess an eine Message Queue dt Nachrichtenschlange geschickt die in Form einer verketteten Liste verwaltet wird Dort kann die Nachricht von einem anderen Prozess abgeholt werden Jede Message Queue hat eine eindeutige Kennung wodurch sie auch von einem anderen Prozess identifiziert werden kann Normalerweise wird nach dem First In First Out Prinzip FIFO gearbeitet Die Nachrichten konnen aber auch mit einer Prioritat versehen werden Wenn ein Prozess eine Nachricht mit einer Prioritat N abholt holt er sich in der Schlange Queue die erste Nachricht mit der Prioritat N auch wenn diese beispielsweise als letzte eingefugt wurde 12 Warteschlangen werden beispielsweise haufig zur Datenubergabe zwischen asynchronen Prozessen in verteilten Systemen verwendet wenn also Daten vor ihrer Weiterverarbeitung gepuffert werden mussen Der Zugriff erfolgt dabei durch im Betriebssystem verankerte APIs Die Grosse der Warteschlange wird durch das Betriebssystem limitiert Namenlose Pipes Bearbeiten nbsp Kommunikation zweier Prozesse uber eine PipeDie Pipe oder Pipeline von engl Rohrleitung ist eine der wichtigsten Anwendungen fur Warteschlangen Es handelt sich um einen Datenstrom zwischen zwei Prozessen durch einen Puffer nach dem FIFO Prinzip Das bedeutet vereinfacht dass ein Ergebnis eines Computerprogramms als Eingabe eines weiteren Programms verwendet wird Es handelt sich um die alteste und erste Technik der Interprozesskommunikation Sie wurde 1973 von Douglas McIlroy fur das Betriebssystem Unix erfunden Eine Pipe besitzt immer die folgenden zwei grundlegenden Eigenschaften Bei einer Pipe konnen Daten immer nur in eine Richtung fliessen Ein Prozess kann praktisch immer nur in eine Pipe schreiben oder aus einer Pipe lesen Will man anstatt der Halbduplex Verbindung eine Vollduplex Verbindung erstellen benotigt man dazu zwei Pipes zwischen den Prozessen Pipes konnen nur von Prozessen eingerichtet werden die gemeinsame Vorfahren besitzen Gewohnlich wird eine Pipe eingerichtet indem ein Elternprozess eine Pipe erzeugt und einen Kindprozess mittels fork kreiert der dabei diese Pipe erbt Anschliessend steht einer guten Kommunikation zwischen dem Elternprozess und dem Kindprozess nichts mehr im Wege 13 In unixoiden Betriebssystemen werden die Programme uber das Pipe Symbol verbunden Beispielsweise sendet who sort die Ausgabe von who in das sort Programm wodurch eine alphabetisch geordnete Liste der angemeldeten Benutzer ausgegeben wird 14 Benannte Pipes FIFO Pipes Bearbeiten Unbenannte Pipes konnen nur mit den Prozessen kommunizieren die miteinander verwandt sind Benannte Pipes engl named pipes auch FIFO Pipes konnen dagegen auch zur Kommunikation zwischen Prozessen eingesetzt werden die nicht miteinander verwandt sind Dazu bekommen sie wie Dateien entsprechende Namen Jeder Prozess der den Namen einer benannten Pipe kennt kann uber diesen Namen die Verbindung zur Pipe und damit zu anderen Prozessen herstellen Fur benannte Pipes mussen auch Zugriffsrechte vergeben werden d h es muss festgelegt werden wer in diese etwas schreiben und wer daraus auslesen darf 15 Sockets Bearbeiten Sockets bieten eine Schnittstelle fur die Kommunikation zwischen Prozessen die moglicherweise auf demselben oder auf verschiedenen Computersystemen ausgefuhrt werden Sie sind der Kern jeder Netzwerkkommunikation Ein Socket stellt eine Verbindung zwischen zwei Punkten her durch die Daten gesendet und empfangen werden konnen Jeder Punkt ist durch eine IP Adresse und einen Port gekennzeichnet Im Gegensatz zu Pipes kann ein Socket gleichzeitig mit mehreren anderen in Kontakt stehen und kann auch von laufenden Programmen eingerichtet werden Ursprunglich wurde die Socket API 1984 fur das BSD Unix zur Kommunikation zwischen verschiedenen Rechnern uber ein Netzwerk eingefuhrt es besteht allerdings auch die Moglichkeit eine Kommunikation zwischen Prozessen auf demselben Rechner auszufuhren Dies wird uber den Geltungsbereich domain festgelegt Der Bereich local domain ermoglicht die Kommunikation unterschiedlicher Prozesse auf einem Rechner der Bereich internet domain den Informationsaustausch zwischen Prozessen auf unterschiedlichen Rechnern uber die TCP IP Protokollfamilie Wie die TCP IP Protokollfamilie sind BSD Sockets mittlerweile auch in den meisten wichtigen Betriebssystemen ausserhalb der Unix Familie implementiert worden 16 Race Conditions BearbeitenUnabhangige disjunkte Prozesse konnen beliebig nebeneinander ablaufen da sie nicht auf gemeinsame Daten schreiben Sie konnen aber durchaus auf gewisse Daten gemeinsam zugreifen diese durfen wahrend der Laufzeit nur nicht verandert werden Wenn konkurrente Prozesse jedoch gemeinsame Daten enthalten die verandert werden spricht man von uberlappenden Prozessen Probleme die dabei entstehen konnen verdeutlicht das folgende Beispiel bei dem die Variable a gleichzeitig von Prozess 1 und Prozess 2 benutzt wird a 10 Prozess 1 Prozess 2 1 1 a a a 2 1 a a 2 1 2 print a 2 2 print a Die Ergebnisse die Prozess 1 und Prozess 2 drucken hangen von der Reihenfolge ab in der ihre Anweisungen ausgefuhrt werden Beispielsweise liefert bei der Anweisungs Reihenfolge 1 1 1 2 2 1 2 2 Prozess 1 das Ergebnis 100 und Prozess 2 das Ergebnis 50 Bei der Anweisungsreihenfolge 2 1 1 1 1 2 2 2 geben jedoch beide Prozesse das Ergebnis 25 aus 17 Die unterschiedlichen Ergebnisse hangen also von den relativen Geschwindigkeiten der uberlappenden Prozesse ab 17 Die Art von Fehler in einem System oder einem Prozess in dem der Ausgang des Prozesses unerwartet von der Reihenfolge oder Dauer anderer Ereignisse abhangt nennt man Race Condition Wettlaufsituation Der Begriff entstammt der Vorstellung dass zwei Signale in einem Wettlauf versuchen die Systemantwort jeweils zuerst zu beeinflussen Race Conditions sind ein haufiger Grund fur nur schwer auffindbare Programmfehler Die Schwierigkeit liegt darin dass sie nur selten unter gewissen Bedingungen auftreten Ein geandertes Speichermodell oder Laufzeitverhalten des Systems kann den Fehler wieder unsichtbar machen Andrew S Tanenbaum macht das folgende Beispiel fur eine Race Condition Wenn ein Prozess einen Druckauftrag erteilt tragt er den Dateinamen der zu druckenden Datei in eine Spooler Ordner spooler directory ein Der Drucker Daemon pruft regelmassig ob es irgendwelche Dateien zu drucken gibt Falls dies zutrifft druckt er diese aus und entfernt danach ihren Namen wieder aus dem Ordner Die Eintrage seien mit 0 1 2 nummeriert und es gebe zwei Variablen out zeigt auf die nachste zu druckende Datei und in auf den nachsten freien Eintrag im Ordner Seien nun die Eintrage 0 bis 3 leer bereits ausgedruckt und die Eintrage 4 bis 6 belegt mit Namen von Dateien die gedruckt werden sollen Zwei Prozesse P 1 displaystyle P 1 nbsp und P 2 displaystyle P 2 nbsp entscheiden sich nun mehr oder weniger gleichzeitig dass sie eine weitere Datei zum Ausdruck einreihen wollen Es kann nun folgendes passieren Der Prozess P 1 displaystyle P 1 nbsp liest in aus und speichert deren Wert 7 in der lokalen Variable next free slot Genau jetzt erfolgt ein Timerinterrupt und die CPU entscheidet dass der Prozess P 1 displaystyle P 1 nbsp nun lange genug gelaufen ist und wechselt deshalb zum Prozess P 2 displaystyle P 2 nbsp Der Prozess P 2 displaystyle P 2 nbsp liest in aus und bekommt genau wie P 1 displaystyle P 1 nbsp eine 7 Auch er speichert sie in seiner lokalen Variablen next free slot In diesem Augenblick glauben beide Prozesse dass der nachste verfugbare Eintrag 7 ist Wenn Prozess P 2 displaystyle P 2 nbsp nun weiterlauft speichert er den Namen seiner Datei im Eintrag 7 und aktualisiert in auf 8 Ist Prozess P 1 displaystyle P 1 nbsp wieder an der Reihe so weist next free slot auf den Eintrag 7 und er loscht also den Eintrag den Prozess P 2 displaystyle P 2 nbsp soeben angelegt hatte Danach setzt Prozess P 1 displaystyle P 1 nbsp in wiederum auf 8 Prozess P 1 displaystyle P 1 nbsp wird dadurch niemals eine Ausgabe erhalten 18 nbsp Ein Kontrollflussgraph von zwei Prozessen Der rote Knoten stellt dabei einen kritischen Abschnitt dar Fuhrt ein Prozess interne Berechnungen durch ist dies unproblematisch Manchmal muss er aber auch auf gemeinsam genutzten Speicher oder Dateien zugreifen oder andere kritische Operationen ausfuhren Dies kann zu eben solchen Wettlaufsituationen fuhren Die Teile des Programms in denen auf gemeinsam genutzten Speicher zugegriffen wird bezeichnet man als kritischen Abschnitt critical section oder kritische Region critical region Im Gegensatz dazu sind unkritische Abschnitte solche in denen nicht auf von mehreren Prozessen gemeinsam benutzte Daten zugegriffen wird Kritische Abschnitte in Prozessen mussen eindeutig gegen die unkritischen Abschnitte abgegrenzt sein 19 Andrew S Tanenbaum nennt vier Bedingungen die eingehalten werden mussen um Race Conditions zu vermeiden 19 Keine zwei Prozesse durfen gleichzeitig in ihren kritischen Abschnitten sein Es braucht also einen wechselseitigen Ausschluss mutual exclusion der Prozesse Es durfen keine Annahmen uber Geschwindigkeit und Anzahl der CPUs gemacht werden Kein Prozess der ausserhalb seines kritischen Abschnitts lauft darf andere Prozesse blockieren Kein Prozess sollte ewig darauf warten mussen in seinen kritischen Abschnitt einzutreten Synchronisation BearbeitenAktives Warten Bearbeiten Unter aktivem Warten busy waiting versteht man das fortlaufende Uberprufen einer Variablen bis ein gewisser Wert erscheint Nach diesem Prinzip wird ein Spinlock verwendet um eine gemeinsam genutzte Ressource vor konkurrenten Prozessen zu schutzen Wahrend sich ein Prozess in einem kritischen Abschnitt befindet muss ein anderer Prozess der ebenfalls den kritischen Abschnitt betreten will aktiv warten Dadurch wird jedoch viel CPU Zeit verschwendet 20 Sperrvariablen und strikter Wechsel Bearbeiten Um zu verhindern dass mehrere Prozesse gleichzeitig einen kritischen Abschnitt betreten kann man eine Sperrvariable einfuhren die nur die Werte 0 oder 1 annehmen kann Wenn nun ein Prozess den kritischen Abschnitt betreten will fragt er zunachst die Sperrvariable ab Ist diese 1 so ist die Sperre gesetzt und der Prozess muss warten bis ein anderer Prozess den kritischen Abschnitt verlassen hat Ist sie 0 befindet sich kein Prozess im kritischen Abschnitt Der Prozess setzt die Sperrvariable also auf 1 und betritt den kritischen Abschnitt Beim Verlassen setzt er die Variable wieder auf 0 damit wieder andere Prozesse den kritischen Abschnitt betreten konnen Ein Prozess braucht also bei Eintritt zwei Operationen eine zum Testen der Sperrvariable und eine zum Setzen der Sperrvariable Es besteht jedoch folgendes Fehlerszenario Es kann passieren dass Testen und Setzen der Sperrvariable durch eine CPU Scheduling Entscheidung unterbrochen wird Ein Prozess P 1 displaystyle P 1 nbsp sieht dass die Sperre 0 ist doch bevor er diese auf 1 setzen kann wird er unterbrochen In der Zwischenzeit setzt ein Prozess P 2 displaystyle P 2 nbsp die Sperre auf 1 Wenn nun Prozess P 1 displaystyle P 1 nbsp wieder an der Reihe ist setzt er die Sperre ebenfalls auf 1 und es befinden sich zwei Prozesse gleichzeitig im kritischen Abschnitt 21 Abhilfe dagegen schafft ein strikter Wechsel mit einer ganzzahligen Variablen turn Wenn turn auf 1 gesetzt ist kann der Prozess P 1 displaystyle P 1 nbsp den kritischen Abschnitt betreten Wenn nun P 1 displaystyle P 1 nbsp den kritischen Abschnitt wieder verlasst setzt er turn auf 2 Dies ermoglicht es P 2 displaystyle P 2 nbsp den kritischen Abschnitt zu betreten Am Ende des kritischen Abschnitts setzt dann P 2 displaystyle P 2 nbsp seinerseits turn wieder auf 1 Dieses sich Abwechseln ist jedoch keine gute Voraussetzung wenn einer der Prozesse sehr viel langsamer als der andere ist Der eine Prozess hangt solange in einer Warteschleife fest bis der andere Prozess den kritischen Abschnitt wieder freigibt 22 Wechselseitiger Ausschluss mit Hardware Unterstutzung Bearbeiten Um zu verhindern dass ein Prozess zwischen Lesen und Setzen einer Sperrvariablen die CPU verliert und dadurch versehentlich zwei Prozesse in einen kritischen Abschnitt eintreten kann auf Hardware Unterstutzung zuruckgegriffen werden In manchen Prozessorarchitekturen ist der TSL Befehl Test and Set Lock verfugbar der in einer unteilbaren Operation einen Registerwert liest und schreibt Durch den Befehl TSL RX LOCKwird der Inhalt des Speicherwortes LOCK ins Register RX eingelesen und ein Wert ungleich null wird dann an der Speicheradresse von LOCK abgelegt Solange die CPU den TSL Befehl ausfuhrt kann kein anderer Prozess auf das Speicherwort zugreifen Der Speicherbus bleibt gesperrt Um den Zugriff auf einen kritischen Abschnitt zu koordinieren kann also eine gemeinsam genutzte LOCK Variable eingesetzt werden Wenn ein Prozess eintreten will kopiert er die Sperrvariable LOCK ins Register RX und uberschreibt sie mit einem Wert ungleich 0 mit dem TSL Befehl in einer einzigen unteilbaren Operation Nun vergleicht er den alten Wert der nun in RX steht mit 0 Falls dieser nicht 0 ist war die Sperre bereits gesetzt also geht das Programm in die Warteschleife Wenn der Wert 0 wird kann der aufrufende Prozess den kritischen Abschnitt betreten Wenn ein Prozess den kritischen Abschnitt verlasst setzt er mithilfe eines gewohnlichen MOVE Befehls den Wert von LOCK wieder zuruck auf 0 23 Siehe dazu den folgenden Assembler Code enter critical section TSL RX LOCK kopiere die Sperrvariable LOCK ins Register RX und uberschreibe LOCK mit einem Wert ungleich 0 CMP RX 0 war die Sperrvariable 0 JNE enter critical section wenn der Wert nicht 0 ist dann war die Sperre schon gesetzt gt gehe in die Schleife RET sonst springe zuruck und betrete kritischen Abschnitt leave critical section MOVE LOCK 0 speichere 0 in die Sperrvariable LOCK RET springe zuruck Eine Alternative zu TSL ist der XCHG Befehl der die Inhalte zweier Speicherstellen automatisch austauscht zum Beispiel von einem Register und einem Speicherwort 24 Algorithmus von Peterson Bearbeiten Hauptartikel Algorithmus von Peterson Der Algorithmus von Peterson wurde 1981 von Gary L Peterson formuliert und bietet eine Losung fur das wechselseitige Ausschlussproblem Bevor ein kritischer Abschnitt betreten wird ruft jeder Prozess enter section int process mit seiner eigenen Prozessnummer 0 oder 1 als Parameter auf Der Eintritt in den kritischen Abschnitt wird damit so lange verzogert bis er sicher ist Sobald ein Prozess den kritischen Abschnitt wieder verlasst ruft er leave section int process mit seiner eigenen Prozessnummer als Parameter auf Jetzt kann ein anderer Prozess den kritischen Abschnitt betreten sofern er das mochte define FALSE 0 define TRUE 1 define N 2 Anzahl der Prozesse int turn Gibt an wer gerade an der Reihe ist int interested N Alle Werte mit 0 FALSE initialisieren void enter section int process int other Variable fur Nummer des anderen Prozesses other 1 process Der andere Prozess interested process TRUE Interesse zeigen turn other Flag setzen while interested other TRUE amp amp turn other Leeranweisung Aktives Warten void leave section int process Prozess der den kritischen Abschnitt verlasst interested process FALSE Zeigt den Ausstieg aus dem kritischen Abschnitt an Wenn nun beispielsweise Prozess 0 enter section 0 aufruft bekundet er sein Interesse indem er interested 0 auf TRUE setzt und lasst Prozess 1 die Gelegenheit ebenfalls Interesse zu bekunden indem er die Variable turn auf 1 die Prozessnummer des anderen Prozesses setzt Wenn der Prozess 1 nicht interessiert ist interested 1 FALSE oder turn 0 kehrt die Funktion sofort zuruck und der kritische Abschnitt kann betreten werden Wenn nun der Prozess 1 etwas spater enter section 1 aufruft muss er so lange warten wie interested 0 TRUE gilt Jedoch erst wenn der Prozess 0 leave section 0 aufruft um die kritische Region zu verlassen wird interested 0 auf FALSE gesetzt und der Prozess 1 kann in den kritischen Abschnitt eintreten Fur den Fall dass beide Prozesse fast gleichzeitig enter section int process aufrufen und jeweils ihre Prozessnummern in turn speichern zahlt das zuletzt beendete Speichern d h das erste Speicherergebnis wird uberschrieben und geht verloren Da beide Prozesse ihr Interesse angezeigt haben gilt sowohl interested 0 TRUE als auch interested 1 TRUE Konnte nun beispielsweise der Prozess 0 als Letzter in turn speichern gilt turn 0 Der Prozess 1 kann unter dieser Bedingung den kritischen Abschnitt nicht betreten er muss in der Warteschleife warten bis der andere Prozess interested auf FALSE setzt 25 Passives Warten Bearbeiten Beim passiven Warten wird ein Prozess der einen kritischen Abschnitt betreten will schlafen gelegt beispielsweise indem er in eine Warteschlange eingefugt wird solange er warten muss Der Zustand bleibt solange bestehen bis er in den kritischen Abschnitt eintreten darf Dann wird er von einem anderen Prozess aufgeweckt Semaphor Bearbeiten Hauptartikel Semaphor Informatik Das Konzept der Semaphore wurde 1965 von Edsger W Dijkstra entwickelt und setzt auf Sperrmechanismen auf 26 Beim Start des Semaphors wird der Semaphorzahler mit einem ganzzahligen Wert initialisiert der anzeigt wie viele Prozesse gleichzeitig eine Ressource nutzen konnen Ausserdem verwaltet das Semaphor eine Warteschlange fur die Prozesse die am Eingang des kritischen Abschnitts warten mussen Bei der Nutzung eines Semaphors fur gegenseitigen Ausschluss wird der Semaphorzahler einfach mit 1 initialisiert Fur den Eintritt in den kritischen Abschnitt und den Austritt aus diesem stehen zwei Operationen zur Verfugung Die down Operation down s wird beim Eintritt in den kritischen Abschnitt aufgerufen Sie pruft zunachst ob der Wert des Semaphorzahlers grosser als 0 ist Trifft dies zu wird der Wert des Semaphorzahlers um 1 reduziert und der Prozess kann eintreten Wenn der Semaphorzahler gerade auf 0 steht wird dem ankommenden Prozess der Eintritt verwehrt und er wird in die Warteschlange eingereiht Die up Operation up s wird beim Verlassen des kritischen Abschnitts aufgerufen Der Semaphorzahler wird wieder um 1 erhoht womit ein weiterer Prozess in den kritischen Bereich eintreten kann 27 Die Verwendung von Semaphoren soll durch eine Analogie veranschaulicht werden Man nehme an eine Bibliothek habe 10 Studierzimmer die jeweils immer nur von einem Studenten benutzt werden konnen Ein Rezeptionist Semaphor sorgt nun dafur dass die Ressource Studierzimmer korrekt belegt wird Dazu fuhrt er einen Zahler der uber die Anzahl der freien Studierzimmer Buch fuhrt und mit 10 initialisiert wird Jedes Mal wenn ein Student ein Studierzimmer betritt wird der Zahler um eins reduziert Wenn der Zahler 0 ist sind alle Studierzimmer belegt und die ankommenden Studenten mussen in einer Warteschlange eingereiht werden Die wartenden Studenten durfen in der Zwischenzeit schlafen Erst wenn ein Student ein Studierzimmer verlasst wird der vorderste Student in der Warteschlange aufgeweckt und zu den Studierzimmern eingelassen Bei der Implementierung von Semaphoren muss jedoch beachtet werden dass die Operationen down s und up s selbst kritische Abschnitte aufweisen Um Race Conditions zu vermeiden konnen beispielsweise der TSL oder der XCHG Befehl verwendet werden um die kritischen Abschnitte von down s und up s zu schutzen Dadurch wird aktives Warten zwar nicht ganz vermieden die Operationen des Semaphors sind allerdings sehr kurz 28 Mutex Bearbeiten Siehe auch Mutex Der Begriff Mutex ist nicht einheitlich definiert Nach Peter Mandl handelt es sich um ein binares Semaphor d h um ein Semaphor mit dem Maximalwert N 1 29 Ein Mutex verfugt praktisch uber eine Variable die nur zwei Zustande namlich locked und unlocked annehmen kann Es wird also theoretisch nur ein Bit zur Darstellung benotigt Fur das Arbeiten auf einem Mutex stehen die beiden Prozeduren mutex lock und mutex unlock zur Verfugung 30 Einige Autoren weisen durchaus auf Unterschiede zwischen Mutexen und binaren Semaphoren hin Der wesentliche Unterschied durfte darin bestehen dass ein Mutex dem aufrufenden Prozess bzw Thread gehort wahrend mit einem Semaphor kein Besitzer verbunden ist Wenn beispielsweise bei einem Semaphor der Semaphorzahler 0 locked ist kann ihn ein anderer Prozess bzw Thread erhohen auch wenn es sich nicht um den Prozess handelt der ihn ursprunglich gesperrt hat 31 Monitor Bearbeiten Hauptartikel Monitor Informatik Die Implementierung des wechselseitigen Ausschlusses mit Hilfe von Synchronisationsprimitiven wie Semaphore ist ziemlich fehleranfallig Deshalb entwickelten 1974 C A R Hoare und 1975 Per Brinch Hansen ein auf hoherem Abstraktionsniveau angesiedeltes Synchronisationsmittel den Monitor Ein Monitor ist ein Modul ein abstrakter Datentyp eine Klasse in dem die von Prozessen gemeinsam genutzten Daten und ihre Zugriffsprozeduren oder Methoden zu einer Einheit zusammengefuhrt sind Zugriffsprozeduren mit kritischen Abschnitten auf den Daten werden als Monitor Operationen speziell gekennzeichnet Zugriffsprozeduren ohne kritische Abschnitte konnen vom Modul zusatzlich angeboten werden Die Funktionalitat von Monitoren ist derjenigen von Semaphoren gleichwertig Monitore sind jedoch fur den Programmierer leichter zu uberschauen da gemeinsam benutzte Daten und Zugriffskontrollen zentral gebundelt an einer Stelle lokalisiert sind und nicht wie im Falle von Semaphoren getrennt uber mehrere Prozesse verteilt im Programmcode stehen 32 Grundlegende Eigenschaften eines Monitors sind Kritische Abschnitte die auf denselben Daten arbeiten sind Prozeduren eines Monitors Ein Prozess betritt einen Monitor durch Aufruf einer Prozedur des Monitors Nur ein Prozess kann zur selben Zeit den Monitor benutzen Jeder andere Prozess der den Monitor betritt wird suspendiert und muss warten bis der Monitor verfugbar wird 32 Ein Monitor wird oft als ein Raum angesehen in dem nur ein Akteur Prozess Platz findet Wollen weitere Akteure in den Monitorraum so mussen sie warten bis im Monitorraum Platz frei geworden ist Wenn ein Prozess eine Monitorprozedur aufruft prufen in der Regel die ersten Befehle der Prozedur ob ein anderer Prozess gerade im Monitor aktiv ist Wenn kein anderer Prozess den Monitor benutzt kann er eintreten Andernfalls wird der aufrufende Prozess schlafen gelegt bis der andere Prozess den Monitor verlassen hat Der wechselseitige Ausschluss von Monitoreintritten wird nun vom Compiler realisiert beispielsweise unter Verwendung eines Mutex oder eines binaren Semaphors Der Programmierer muss nicht wissen wie der Compiler den wechselseitigen Ausschluss regelt Dadurch ist es sehr viel unwahrscheinlicher dass etwas schiefgeht Es reicht zu wissen dass zwei Prozesse in ihren kritischen Abschnitten nicht gleichzeitig ausgefuhrt werden durfen wenn man alle kritischen Abschnitte in Monitorprozeduren bundelt 33 Deadlocks Bearbeiten Hauptartikel Deadlock Informatik Eine Menge von Prozessen befindet sich in einem Deadlock Zustand wenn jeder Prozess aus der Menge auf ein Ereignis wartet das nur ein anderer Prozess aus der Menge auslosen kann Kein Prozess wird jemals aufwachen da er jeweils auf Ereignisse wartet die andere Prozesse auslosen die jedoch wieder auf Ereignisse von ihm warten 34 Andrew S Tanenbaum macht das folgende Beispiel Zwei Prozesse wollen beide ein Dokument einscannen und anschliessend auf eine CD brennen Prozess P 1 displaystyle P 1 nbsp belegt furs Erste den Scanner Prozess P 2 displaystyle P 2 nbsp verfahrt etwas anders und reserviert sich zunachst den CD Brenner Nun versucht Prozess P 1 displaystyle P 1 nbsp den CD Brenner ebenfalls zu reservieren was aber fehlschlagt weil Prozess P 2 displaystyle P 2 nbsp diesen noch nicht freigegeben hat Fatalerweise will jedoch Prozess P 1 displaystyle P 1 nbsp den Scanner nicht freigeben solange der CD Brenner nicht verfugbar ist Die beiden Prozesse blockieren sich also gegenseitig 35 Fur Deadlocks gibt es auch Beispiele aus dem alltaglichen Leben Wenn an einer Strassenkreuzung von allen vier Seiten gleichzeitig Autos ankommen und die Vortrittsregel rechts vor links gilt mussen theoretisch alle vier Autos endlos warten denn jedes Auto wartet darauf dass das jeweils rechts wartende Auto zuerst fahrt 36 Klassische Problemstellungen BearbeitenErzeuger Verbraucher Problem Bearbeiten Hauptartikel Erzeuger Verbraucher Problem Das Erzeuger Verbraucher Problem producer consumer problem auch bekannt als Problem des begrenzten Puffers thematisiert die Zugriffsregelung auf eine Datenstruktur mit elementerzeugenden schreibenden und elementverbrauchenden lesenden Prozessen So konnen sich zwei Prozesse einen Puffer mit fester Grosse teilen Einer der Prozesse der Erzeuger legt Informationen in den Puffer der andere der Verbraucher nimmt sie heraus 37 Die Zugriffsregelung soll nun verhindern dass der Verbraucher auf die Datenstruktur Puffer zugreift wenn diese keine Elemente enthalt und der Erzeuger auf die Datenstruktur zugreift wenn die Aufnahmekapazitat bereits ausgeschopft ist Eine mogliche Losung ware die Anzahl der Nachrichten in einem Puffer mit einer Variable count zu verfolgen Die maximale Anzahl der Nachrichten die ein Puffer aufnehmen kann sei dabei N Ist nun count gleich N wird der Erzeuger schlafen gelegt andernfalls kann er eine Nachricht hinzufugen und count wird um eins erhoht Wenn count gleich 0 ist wird der Verbraucher schlafen gelegt andernfalls kann er eine Nachricht entfernen und count wird um eins reduziert Jeder der Prozesse pruft auch ob der andere aufgeweckt werden sollte und falls dies zutrifft tut er dies 37 Durch diese Implementierung konnen jedoch Race Conditions entstehen beispielsweise folgendermassen Der Puffer ist leer und in dem Moment als der Verbraucher count pruft wird der Prozess durch eine CPU Scheduling Entscheidung unterbrochen Anschliessend wird der Erzeuger gestartet der eine Nachricht in den Puffer legt und count um eins erhoht Uberzeugt davon dass count davor 0 war und der Verbraucher deshalb schlaft lost er ein wakeup aus um den Erzeuger zu wecken Das Wakeup Signal geht dabei verloren Wenn der Verbraucher jedoch das nachste Mal lauft geht er davon aus dass der Wert von count 0 ist da er diesen Wert zuvor gelesen hatte Er wird sich deshalb schlafen legen Der Erzeuger wird nun zunehmen den Puffer fullen und sich dann ebenfalls schlafen legen Wenn sie nicht gestorben sind dann schlafen sie noch immer 38 Das Problem des verlorenen Weckrufs lasst sich beispielsweise durch die Verwendung von Semaphoren losen Philosophenproblem Bearbeiten Hauptartikel Philosophenproblem nbsp Aufbau des PhilosophenproblemsDas Philosophenproblem ist ein Synchronisationsproblem das Edsger W Dijkstra 1965 veroffentlichte und loste Es ist nutzlich um Prozesse zu veranschaulichen die um den exklusiven Zugriff auf eine begrenzte Anzahl Ressourcen wie beispielsweise Ein Ausgabegerate konkurrieren Bei der Problemstellung mussen genau zwei Betriebsmittel hier Gabeln belegt werden bevor die Arbeit gemacht werden kann Es sitzen funf Philosophen funf Prozesse Threads um einen runden Tisch Jeder Philosoph hat einen Teller mit Spaghetti vor sich und zwischen zwei Tellern liegt jeweils eine Gabel Zum Essen braucht ein Philosoph genau zwei Gabeln Ein Philosoph verbringt seine Zeit entweder mit Denken oder mit Essen Wenn er Hunger bekommt greift er nach seiner linken und seiner rechten Gabel in beliebiger Reihenfolge Wenn es ihm gelingt die beiden Gabeln zu ergreifen isst er fur eine gewisse Zeit lang und legt danach die Gabeln wieder hin Es konnen also maximal zwei Philosophen gleichzeitig essen Die Hauptfrage ist Kann man ein Programm fur die Philosophen schreiben das funktioniert und niemals verklemmt 39 Eine einfache Losung besteht darin die Gabeln als Semaphore zu realisieren und mit 1 zu initialisieren Da aber nicht zwei Semaphore gleichzeitig aufnehmen konnen besteht die Gefahr eines Deadlocks wenn Philosophen zwischen den beiden Gabelaufnahmen unterbrochen werden Wenn beispielsweise alle Philosophen quasi gleichzeitig ihre linke Gabel aufnehmen wird es keinem moglich sein seine rechte Gabel aufzunehmen Die Philosophen warten ewig auf die rechte Gabel Eine mogliche Losung besteht nun darin eine Statusvariable stat zu verwenden die fur einen Philosophen drei Zustande verfolgt Denken 0 Hungrig 1 und Essen 2 Damit ein Philosoph vom hungrigen Status stat 1 in den essenden Status stat 2 ubergehen kann darf keiner seiner Nachbarn gerade essen Ein Feld von Semaphoren mit einem Semaphor pro Philosoph ermoglicht es nun auch Philosophen zu blockieren falls die benotigten Gabeln in Gebrauch sind 40 Leser Schreiber Problem Bearbeiten Beim Leser Schreiber Problem geht es um zwei Typen von Prozessen bzw Threads die Leser und die Schreiber Man geht nun von der Situation aus dass eine Menge von Lesern und Schreibern einen gemeinsamen kritischen Bereich betreten wollen Dabei gilt es jedoch folgende Bedingungen einzuhalten Im kritischen Abschnitt durfen sich niemals Leser und Schreiber gleichzeitig aufhalten Im kritischen Abschnitt durfen sich beliebig viele Leser gleichzeitig aufhalten Im kritischen Abschnitt durfen sich niemals mehrere Schreiber gleichzeitig aufhalten Andrew S Tanenbaum nennt dazu ein Beispiel fur ein Reservierungssystem einer Fluggesellschaft in welchem es viele konkurrente Prozesse gibt die Lese und Schreibrechte wunschen Es ist akzeptabel wenn mehrere Prozesse gleichzeitig die Datenbank auslesen aber wenn ein Prozess die Datenbank aktualisiert beschreibt darf kein anderer Prozess auf die Datenbank zugreifen nicht einmal zum Lesen 41 Eine Losung bietet sich mit Hilfe eines Semaphors db an Wenn ein Leser Zugriff auf die Datenbank bekommt fuhrt er ein down auf das Semaphor db aus Wenn er fertig ist fuhrt er ein up aus Solange mindestens ein aktiver Leser existiert kann kein Schreiber in den kritischen Abschnitt eintreten Ein Schreiber der eintreten will wird also solange stillgelegt als es Leser im kritischen Abschnitt gibt Falls jedoch fortlaufend neue Leser in den kritischen Bereich eintreten kann es sein dass ein Schreiber niemals Zugriff erhalt Er verhungert Eine mogliche Losung fur dieses Problem besteht darin dass ankommende Leser hinter bereits wartende Schreiber gestellt werden Auf diese Weise braucht der Schreiber nur auf Leser zu warten die vor ihm da waren bis er zugreifen kann 42 Siehe auch BearbeitenAsynchrone Kommunikation Multitasking Multithreading Nachrichtenaustausch Message Passing Pseudoterminal Sequenzdiagramm Synchrone Kommunikation Time SharingLiteratur BearbeitenErich Ehses Lutz Kohler Petra Riemer Horst Stenzel Frank Victor Systemprogrammierung in UNIX Linux Grundlegende Betriebssystemkonzepte und praxisorientierte Anwendungen Vieweg Teubner Wiesbaden 2012 Peter Mandl Grundkurs Betriebssysteme Architekturen Betriebsmittelverwaltung Synchronisation Prozesskommunikation Virtualisierung 4 Auflage Springer Vieweg Wiesbaden 2014 Peter Pacheco An Introduction to Parallel Programming Elsevier Amsterdam u a 2011 Abraham Silberschatz Peter B Galvin Greg Gagne Operating System Concepts Eighth Edition John Wiley amp Sons Hoboken New Jersey 2008 Andrew S Tanenbaum Moderne Betriebssysteme 3 aktualisierte Auflage Pearson Studium Munchen u a 2009 ISBN 978 3 8273 7342 7 Jurgen Wolf Klaus Jurgen Wolf Linux Unix Programmierung Das umfassende Handbuch 4 Aufl Rheinwerk Verlag Bonn 2016 altere ebenfalls zitierte Ausgabe Jurgen Wolf Linux UNIX Programmierung Das umfassende Handbuch 3 aktualisierte und erweiterte Auflage Rheinwerk Bonn 2009 Einzelnachweise Bearbeiten ISO IEC 2382 1 1993 definiert computer program A syntactic unit that conforms to the rules of a particular programming language and that is composed of declarations and statements or instructions needed to solve a certain function task or problem Bis 2001 definierte die DIN 44300 Informationsverarbeitung Begriffe identisch Mandl Grundkurs Betriebssysteme 4 Aufl 2014 S 78 Tanenbaum Moderne Betriebssysteme 3 Aufl 2009 S 124 125 Jurgen Wolf Linux UNIX Programmierung Das umfassende Handbuch 3 aktualisierte und erweiterte Auflage Galileo Computing Bonn 2009 S 275 Mandl Grundkurs Betriebssysteme 4 Aufl 2014 S 196 Tanenbaum Moderne Betriebssysteme 3 Aufl 2009 S 162 Wolfgang K Giloi Rechnerarchitektur 2 Auflage Springer Verlag Berlin Heidelberg 1993 S 48 Lutz Richter Betriebssysteme 2 Auflage B G Teubner Stuttgart 1985 S 41 Jurgen Wolf Klaus Jurgen Wolf Linux Unix Programmierung Das umfassende Handbuch 4 Aufl Rheinwerk Verlag Bonn 2016 S 354 424 427 ferner Mandl Grundkurs Betriebssysteme 2014 S 198 Mandl Grundkurs Betriebssysteme 2014 S 344 Mandl Grundkurs Betriebssysteme 2014 S 199 Jurgen Wolf Klaus Jurgen Wolf Linux Unix Programmierung Das umfassende Handbuch 4 Aufl Rheinwerk Verlag Bonn 2016 S 354 411 Jurgen Wolf Klaus Jurgen Wolf Linux Unix Programmierung Das umfassende Handbuch 4 Aufl Rheinwerk Verlag Bonn 2016 S 359 Daniel J Barrett Linux kurz amp gut 2 Aufl O Reilly Beijing u a 2012 Deutsche Ubersetzung von Kathrin Lichtenberg Jurgen Wolf Klaus Jurgen Wolf Linux Unix Programmierung Das umfassende Handbuch 4 Aufl Rheinwerk Verlag Bonn 2016 S 351 Konrad Heuer Reinhard Sippel UNIX Systemadministration Linux Solaris AIX FreeBSD Tru64 UNIX Springer Berlin Heidelberg 2004 S 106 107 a b Lutz Richter Betriebssysteme 2 Auflage B G Teubner Stuttgart 1985 S 42 Tanenbaum Moderne Betriebssysteme 3 Aufl 2009 S 162 163 a b Tanenbaum Moderne Betriebssysteme 3 Aufl 2009 S 163 Tanenbaum Moderne Betriebssysteme S 166 Tanenbaum Moderne Betriebssysteme S 165 166 Mandl Grundkurs Betriebssysteme S 160 Tanenbaum Moderne Betriebssysteme S 166 167 Tanenbaum Moderne Betriebssysteme 2014 S 168 170 Tanenbaum Moderne Betriebssysteme 2009 S 170 Tanenbaum Moderne Betriebssysteme S 167 168 Edsger W Dijkstra Cooperating sequential processes EWD 123 E W Dijkstra Archive Center for American History University of Texas at Austin September 1965 Original Mandl Grundkurs Betriebssysteme 2014 S 162 163 ferner Tanenbaum Moderne Betriebssysteme 2009 S 173 Tanenbaum Moderne Betriebssysteme 2009 S 174 Mandl Grundkurs Betriebssysteme 2014 S 164 so auch Jurgen Quade Michael Machtel Moderne Realzeitsysteme kompakt Eine Einfuhrung mit Embedded Linux dpunkt verlag Heidelberg 2012 S 100 105 Tanenbaum Moderne Betriebssysteme 2009 S 176 Peter Pacheco An Introduction to Parallel Programming Elsevier Amsterdam u a 2011 S 174 Richard H Carver Kuo Chung Tai Modern Multithreading Implementing Testing and Debugging Multithreaded Java and C Pthreads Win32 Programs Wiley Interscience Hoboken 2006 S 91 92 a b Cornelia Heinisch Frank Muller Hofmann Joachim Goll Java als erste Programmiersprache Vom Einsteiger zum Profi 6 Auflage Vieweg Teubner Wiesbaden 2011 S 764 Tanenbaum Moderne Betriebssysteme 2009 182 Tanenbaum Moderne Betriebssysteme 2009 S 516 Tanenbaum Moderne Betriebssysteme 2009 S 512 Dietrich Boles Parallele Programmierung spielend gelernt mit dem Java Hamster Modell Programmierung mit Java Threads Vieweg Teubner Wiesbaden 2008 S 226 a b Tanenbaum Moderne Betriebssysteme 2009 S 171 Tanenbaum Moderne Betriebssysteme 2009 S 172 Tanenbaum Moderne Betriebssysteme 2009 S 212 213 Mandl Grundkurs Betriebssysteme 2014 S 166 Tanenbaum Moderne Betriebssysteme 2009 S 213 215 Tanenbaum Moderne Betriebssysteme 2009 S 215 Tanenbaum Moderne Betriebssysteme 2009 S 215 217 Abgerufen von https de wikipedia org w index php title Interprozesskommunikation amp oldid 237303991