153 lines
6.0 KiB
Markdown
153 lines
6.0 KiB
Markdown
# 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
|
|
- 
|
|
|
|
## 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
|
|
- 
|
|
|
|
## 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
|
|
- 
|
|
|
|
### 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_)
|
|
|
|
[](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 |