# 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