# Interprozesskommunikation (IPC) - Mechanismen und Techniken, die es Prozessen ermöglichen miteinander zu kommunizieren - auf demselben Computer / über ein Netzwerk hinweg - Ist grundsätzlich wichtig, wenn Prozesse - zusammenarbeiten - Daten austauschen - miteinander interagieren - Wahl der Methodik hängt von Anforderung der Anwendung ab - Effizienz - Datenvolumen - Sicherheit - Komplexität ## Synchrone IPC - Prozess, bei dem der Absender eines [Signals](07_Prozesssynchronisation.md#signale)/Nachricht auf eine Bestätigung oder eine Antwort vom Empfänger wartet - stellt sicher, dass - Absender und Empfänger synchronisiert sind - Ereignisse/Aufgaben sind abgeschlossen bevor andere anfangen - ![image_158.png](image_158.png) ## Asynchrone IPC - Prozesse, bei dem der Absender nicht auf sofortige Antwort wartet - Absender setzt Ausführung fort, während Empfänger verarbeitet und ggf. später antwortet - ![image_159.png](image_159.png) ## Mechanismen - [Shared Memory](#shared-memory) - [Dateien](#dateien) - [Message Queues](#message-queues) - [Pipes](#pipes) - [Promises (Futures)](#promises-futures) - [Sockets](#sockets) - [Semaphoren](07_Prozesssynchronisation.md#semaphores) - [Mutexe](07_Prozesssynchronisation.md#mutex-mutual-exclusion) - [Condition Variables](#condition-variables) - [Remote Procedure Call (RPC)](#remote-procedure-call-rpc) ### Shared Memory - ermöglicht mehreren Prozessen auf denselben _physischen Speicherbereich_ zuzugreifen - Austausch von Daten effizient ohne explizite Kommunikation - Speicherbereich wird im RAM erstellt - Kann von beteiligten Systemen gelesen und beschrieben werden - müssen sich selbst koordinieren #### Linux-Systemaufrufe Shared Memory - **shmget** - Segment erzeugen oder auf bestehendes Zugreifen - **shmat** - Segment an anderen Prozess anhängen - **shmdt** - Segment von Prozess lösen/freigeben - **shmctl** - Status eines Segments abfragen/ändern/löschen ### Dateien - Prozesse können auf gemeinsame Dateien zugreifen - Zugriff kann langsamer als andere [IPC-Mechanismen](#mechanismen) sein - Darauf muss man achten: - Zugriffsrechte korrekt setzen um Sicherheit zu gewährleisten - geeignete [Synchronisationsmechanismen](07_Prozesssynchronisation.md#mutex-vs-semaphore) nutzen ### Message Queues - besonders nützlich, wenn strukturierte Daten zwischen Prozessen ausgetauscht werden - Struktur muss zwischen Prozessen vereinbart werden - Verwendung von [Semaphoren](07_Prozesssynchronisation.md#semaphores) kann erforderlich sein, damit Zugriff auf Queue ordnungsgemäß funktioniert #### Linux-Systemaufrufe Message Queues - **msgget** - MQ erzeugen / auf bestehende zugreifen - **msgsnd** - Nachricht in MQ schicken - **msgrcv** - Nachricht aus MQ empfangen - **msgctl** - Status einer MQ abfragen/ändern/löschen ### Pipes - ermöglichen, dass Output eines Prozesses direkt als Input eines anderen Prozesses dient - sind unidirektional - gibt Möglichkeiten 2 Pipes zu erstellen → bidirektionale Kommunikation - haben begrenzte Puffergröße - zu viele Daten in der Pipe - blockieren des Schreibprozesses - arbeiten nach FIFO Prinzip (_First In First Out_) #### Erstellung von Pipes mit [POSIX API](06_prozessstruktur.md#posix-api) - **pipe** - Pipe mit zwei Endpunkten erzeugen - **popen** - Prozess starten (benutzt [fork](08_Threads.md#fork)) und Pipe zum Prozess öffnen - **pclose** - Mit popen geöffnete Pipe schließen - **mkfifo** - Named Pipe erzeugen - **open** - Named Pipe öffnen - **close** - (Named) Pipe schließen - **read** - aus (Named) Pipe lesen - **write** - in (Named) Pipe schreiben #### Pipes in der Shell - werden verwendet um 2 oder mehr Befehle zu kombinieren - Ausgabe eines Befehls fungiert als Eingabe für anderen Befehl - Ausgabe dessen = Eingabe für den nächsten ... - Kann temporäre Verbindung zwischen 2 oder mehr Befehlen/Programmen/Prozessen sein - _Filter_ - Kommandozeilenprogramme, die weitere Verarbeitung übernehmen - "I" - anonyme Pipe - bspw. _ps ax | less_ - ">" - benannte Pipe - bspw. _mkfifo myPipe ls > myPipe_ ### Promises (Futures) - Konzept für _asynchrone Programmierung_ - Programm wartet auf Ergebnis/Rückmeldung einer asynchronen Operation - blockiert dabei NICHT Haupt-Thread - Wird oft verwendet in - _JavaScript, Python, Frameworks wie Javas CompletableFuture_ - ![image_160.png](image_160.png) ### Sockets - Verwendung geeignet, wenn - Kommunikation zwischen verschiedenen Rechnern erforderlich ist - verbindungsorientierte Kommunikation (_bspw. TCP_) erwünscht ist - Falls über Internet - Sicherheitsaspekte müssen berücksichtigt werden - bspw. Verschlüsselung #### Erstellung von Sockets mit [POSIX API](06_prozessstruktur.md#posix-api) - **socket** - Socket erzeugen - **socketpair** - Zwei Sockets erzeugen, ähnlich [pipe](#pipes) - **read, recv** - Aus Socket lesen - **write, send** - In Socket schreiben - **close** - Socket schließen - **select** - warten auf Socketaktivität - **poll** - warten auf Socketaktivität - _send_ und _recv_ können beliebig lange dauern - können Prozesse/Threads blockieren → Einsetzen von _select_ - Dient als [Multiplexer](MU0Rechner.md#multiplexer) für mehrere Sockets (_File-Descriptors: fdts_) [![How one thread listens to many sockets with select in C](http://i3.ytimg.com/vi/Y6pFtgRdUts/hqdefault.jpg)](https://www.youtube.com/watch?v=Y6pFtgRdUts) ### Condition Variables - Dienen Synchronisation von Threads in einem Multithreading-Kontext - Threads werden informiert, dass Bedingung erfüllt / Ressource verfügbar ist - Normalerweise auf Threads innerhalb desselben Prozesses beschränkt - nicht direkt für IPC zwischen verschiedenen Prozessen nutzbar ### Remote Procedure Call (RPC) - Programm kann Funktion/Prozedur auf einem entfernten Rechner/Adressraum ausführen, als wäre sie lokal vorhanden - abstrahiert Netzwerkkommunikation - ermöglicht Entwicklern sich auf Logik ihrer eigenen Anwendungen zu konzentrieren - Verschiedene Implementierungen von TPC existieren für verschiedene Plattformen / Programmiersprachen