Title: IN0009_GBS / GBS: Kapitel 5: Inter-Prozesskommunikation (IPC)
On every note of this deck, unless a note says otherwise:
Title: IN0009_GBS::GBS: Kapitel 5: Inter-Prozesskommunikation (IPC)
Logo: tum_logo.png

Front: Nenne drei Arten der Kommunikation zwischen Prozessen bzw. Threads.
Back: - Signalisierung von Ereignissen
- Austausch von Nachrichten
  - Auch komplexe Kommunikationsprotokolle möglich (z.B. TCP, UDP)
- Gemeinsamer Speicher

Front: Sind Linux Signale ein schmal, oder breitbandiger Kanal?
Back: Schmalbanding. Prozesse können sich gegenseitig Signale senden, und bestimmte Signale explizit mithilfe einer Handler Routine abfangen.
SIGKILL und SIGSTOP können nicht abgefangen werden.

Front: Was passiert wenn der Prozess ein Linux Signal nicht abfängt?
Back: Er wird vom Betriebsystem beendet.

Front: Was ist ein Vorteil und ein Nachteil der Impliziten Kommunikation mittels Shared Memory?
Back: Einfach und schnell, da kein Kopieren zwischen Adressräumen benötigt wird. Es werden aber Synchronisationsmechanismen benötigt, die u.u. eine weitere schmalbandige Kommunikation benötigt.

Front: Wofür werden schmalbandige Kanäle u.a. genutzt?
Back: - Übertragen von wenigen Btis an Infromation
- Melden von Ereignissen
- Synchronisationskonzepte und Unterbrechungskonzepte erforderlich

Front: Nenne zwei Methoden zur expliziten Übertrageung von größeren Datenmengen.
Back: - Pipes
- Sockets

Front: Nenne eine Methode zur impliziten, aber schnellen Übertragung von größeren Datenmengen zwischen Prozessen.
Back: Shared Memory bzw. mmap.

Front: Inwiefern beeinflusst Synchronität den Kopplungsgrad zwischen Prozessen
Back: - synchron: beide Prozesse werden zur Nachrichtenübertragung synchronisiert, blockierend.
- asynchron: Entkopplung von Sender und Empfänger nicht blockierend

Front: Welche zwei primären Muster der Nachrichtenkommunikation gibt es?
Back: - Meldung: Unidirektional
- Auftrag (Request - Response): Bidirektional

Front: Wie läuft eine asynchrone Meldung zwischen Sender und Empfänger ab?
Back: 1. Sender (S) übergibt die Nachricht an den Nachrichtendienst des Betriebsystems (send())
2. BS puffert Nachrichten. Sender wartet nicht.
3. Empfänger (E) kann Nachricht mittels recv() empfangen. Wenn keine Nachricht gepuffert ist, wird der Empfänger blockiert.

Front: Wie läuft eine synchrone Meldung zwischen Sender und Empfänger ab?
Back: - Empfänger sendet nach Erhalt der Nachricht eine Bestätigung
- Sender wartet nach dem Senden auf die Empfangsbestätigung
- Empfangsbestätigung enthält hier keine Daten sondern dient nur der Synchronisation

Front: Beschreibe wie ein asynchroner Auftrag abläuft.
Back: - Auftrag und Resultat werden als unabhängige Meldungen verschickt
- Zwischen send() und recv() kann der Sender weitere Aufträge versenden
- Aufträge können an den gleichen oder andere Empfänger gesendet werden

Front: Beschreibe wie ein synchroner Auftrag abläuft.
Back: Sender wartet auf Antwort, während Empfänger antwort bearbeitet.

Front: Nenne drei Vorteile von asynchronem Senden.
Back: - Nützlich für Echtzeitanwendungen, wenn sendender Prozess nicht blockiert werden darf
- Ermöglicht parallele Abarbeitung durch Sender und Empfänger
- Anwendbar zum Signalisieren von Ereignissen

Front: Was sind zwei Nachteile von asynchronem Senden?
Back: - Verwaltungsoverhead im Betriebssystem (Puffer für Nachrichten)
- Behandlung von Fehlern schwieriger

Front: Beschreibe wie Message Passing funktioniert.
Back: Semaphoren werden durch send() und recv() Aufrufe ersetzt. Synchronisation auf BS Ebene.

Front: Wie können Datenströme (Streams) übertragen werden?
Back: - Nachrichten werden auf demm Kommunikationsweg gepuffert
- Als logischer Bytestrom vereinigt
- Bytestrom kann unabhängig von den Nachrichtengrenzen verarbeitet werden
- Dienste im Betriebsystem: Verbindungsauf- und -abbau, lesen und schreiben in Strom

Front: Eine Pipe ist ein bidirektionaler Strom. Ja oder Nein?
Back: Nein. Eine Pipe ist ein unidirektionaler Strom. Eine bidirektionale Kommunkation mit Paaren von Pipes.

Front: Was ist der Unterschied zwischen anonymen und named Pipes?
Back: - pipe() erstellt zwei Kommunikationsendpunkte (erstellen einer anonymen Pipe)
- Ein Endpunkt kann mittels Fork an den Kindprozess übergeben werden (Oder Threads)
- Named pipes als "virtuelle Datei", da sie im Dateisystem verlinkt sind.

Front: Warum werden Ports benötigt?
Back: Es wird eine System-unabhängige Addressierungsart für ein System benötigt, da PIDs nicht eindeutig identifizierend sind.

Front: Warum gibt es eine Teilmenge an Ports die für die dynamische Nutzung bestimmt sind?
Back: Einen festen Port haben nur Prozesse, die oftmals per Konvention über diesen Port erreichbar sind. Prozesse die diese Dienste kontaktieren können

Front: Beschreibe das Rendezvous-Problem.
Back: Sender und Empfänger stellen vor Austausch der Meldung die Sende- und Empfangsbereitschaft her

Front: Welche System Calls können für das Lesen, Schreiben und Schließen von File-Deskriptoren verwendet werden?
Back: read(), write(), close().

Front: Was macht connect() auf einem Socket?
Back: Initiiert eine Verbindung zu einem entfernten Host.
Es wird typischerweise von einem Client verwendet, um eine Verbindung mit einem Server herzustellen, indem die IP-Adresse und der Port des Servers angegeben werden.

Front: Was macht bind() auf einem Socket?
Back: Weist dem Socket eine lokale Adresse (Interface) und Port zu

Front: Was macht listen() auf einem Socket?
Back: Versetzt Socket in einen passiven Modus, wo er auf eingehende Verbindungsanfragen warten kann.

Front: Wie können Sockets gesteuert werden?
Back: setsockopt(), getsockopt(), ioctl().

Front: Wie funktioniert Reference Counting und wo wird es u.a. im Kernel genutzt?
Back: Eine Resource verfügt über einen Zähler der alle Referenzen auf die Resource zählt. Wenn ein Prozess z.B. einen File Descriptor öffnet, wird der Zähler für den File Descriptor inkrementiert, wenn die Resource geschlossen wird dekrementiert.
Üblicherweise wird die Ressource dealloziert, wenn Zähler == 0.

Front: Wie kann man zwei unterschiedliche Prozesse mit einer anonymen Pipe verbinden?
Back: 1. Pipe Erstellen: Elternprozess erstellt eine pipe()
2. Prozess Aufspalten: Spaltung durch fork().
- Beide Prozesse erben die Dateideskriptoren der Pipe
1. Dateideskriptoren Schließen:
- Im Elternprozess wird der Lese-Ende-Dateideskriptor der Pipe geschlossen, wenn der Elternprozess Daten an den Kindprozess senden soll. Der Elternprozess verwendet dann den Schreib-Ende-Dateideskriptor, um Daten in die Pipe zu schreiben.
- Im Kindprozess wird entsprechend der Schreib-Ende-Dateideskriptor geschlossen, wenn er Daten vom Elternprozess lesen soll. Der Kindprozess verwendet dann den Lese-Ende-Dateideskriptor, um Daten aus der Pipe zu lesen.
1. Kommunikation Durchführen:
- Der Elternprozess schreibt Daten mit write()
- Der Kindprozess liest Daten wie read()
1. Pipe Schließen: Schließen beider Enden der Pipe

Front: Was ist das Client-Server-Modell?
Back: Client-Programme senden Anfragen an Server-Programme, die Ressourcen oder Dienste bereitstellen.

Front: Beschreibe das Peer-to-Peer Modell (P2P).
Back: Teilnehmer (Peer) sowohl als Client als auch als Server fungiert. In einem P2P-Netzwerk kommunizieren Peers direkt miteinander, um Ressourcen wie Dateien oder Dienste ohne zentrale Koordination zu teilen und auszutauschen.

Front: Was ist DBus?
Back: Desktop Bus (DBus) ist ein Software-Bussystem, was das mithören von Nachrichten anderer Teilnehmer (Prozesse) ermöglicht. Es erspart eine teure 1:1 Verbindung zwischen Kommunikationspartnern und wird für schmalbandige Kommunikation eingesetzt.

Front: Wie werden Dienste über DBus addressiert?
Back: Über Namen (Well-Known Names)

Front: Beschreibe den Ablauf für den Socket Setup eines Servers (6 Schritte)
Back: 1. socket(): Erzeugung eines ungebundenen Sockets
2. bind(): Socket wird mit einem bestimmten Port verbunden
3. listen(): Server wartet auf Verbindungswünsche
4. accept(): Akzeptieren eines Verbindungswünsches -> Neuer Socket
5. read/write(): Austausch von Daten zwischen Client und Server
6. close(): Schließen der Verbindung auf Serverseite

Front: Beschreibe den Ablauf für den Socket Setup eines Servers (4 Schritte)
Back: 1. socket(): Erzeugung eines ungebundenen Sockets
2. connect(): Socket wird mit dem Port des Servers verbunden
3. read/write(): Austausch von Daten zwischen Client und Server
4. close(): Schließen der Verbindung auf Clientseite

Front: Was ist der Unterschied zwischen SOCK_STREAM und SOCK_DGRAM?
Back: - SOCK_STREAM: TCP = stromorientierte Kommunikation
- SOCK_DGRAM: UDP = nachrichtenbasierte Kommunikation

Front: Inwiefern unterscheidet sich das Senden von Daten bei TCP und UDP in POSIX?
Back: - TCP: write und writev (mit iovec vector) und send für weitere Steuerung durch Flags
- UDP: sendto und sendmsg

Front: Mit welcher Funktion kann ein host long zu network byte-order konvertiert werden?
Back: htonl, wobei long 32-bit groß ist.

Front: Wie setzt sich der Funktionsname htonl zusammen?
Back: host to network long
Umgekehrt auch ntoh{s,l}.

Front: Was sind Message Queues?
Back: - Verkettete Listen, die vom Kernel verwaltet werden
- Identifiziert durch einen eindeutigen Identifier (Key)
- Erlaubt asynchronen Nachrichtenaustausch

Front: Wie funktioniert select im Kontext von I/O Multiplexing?
Back: - Gleichzeitig auf mehrere I/O-Quellen warten
- Warten auf Ereignisse an mehreren File-Deskriptoren (In seperaten fd_sets), ohne ständig zu überprüfen, ob diese Ereignisse eingetreten sind (Kein Busy Wait)
- readset, writeset, extset (error fd) als File Deskriptoren zur Überwachung

Front: Beschreibe was die Funktion poll macht.
Back: - File-Deskriptor-Liste: Anstatt separate Sets von File-Deskriptoren wie bei select zu verwenden, nimmt poll eine Liste von pollfd Strukturen.
- poll-Funktion blockiert, bis eines der folgenden Ereignisse eintritt:

Front: Ja oder Nein: Die Funktion poll betreibt polling (= Busy waiting)
Back: Nein. Die Funktion blockiert, bis eine Aktion eintritt.

Front: In welcher Einheit erlaubt poll einen Timeout?
Back: Millisekunden

Front: In welcher Einheit erlaubt select einen Timeout?
Back: In Mikrosekunden mittels struct timeval.