From 21fcb18ed40410aed26dc4e5fa02b0ada68b107b Mon Sep 17 00:00:00 2001 From: David Schirrmeister Date: Fri, 10 May 2024 13:01:34 +0200 Subject: [PATCH] updatet --- Writerside/images/image_160.png | Bin 0 -> 55913 bytes .../topics/BS/07_Prozesssynchronisation.md | 11 +- .../topics/BS/09_Interprozesskommunikation.md | 107 +++++++++++++++++- 3 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 Writerside/images/image_160.png diff --git a/Writerside/images/image_160.png b/Writerside/images/image_160.png new file mode 100644 index 0000000000000000000000000000000000000000..41ce105687123601c2c235a4d55151f18b9bca97 GIT binary patch literal 55913 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 Es ist wichtig, Synchronisationsmechanismen sorgfältig zu verwenden, > um sicherzustellen, dass kritische Abschnitte effizient und sicher koordiniert werden -**Praktisches Anwendungsbeispiel: Siehe Praktikum 4** +- **Praktisches Anwendungsbeispiel: Siehe Praktikum 4** + - Postverteilungszentrum bestückt Verteiler der Post + - Konfliktsituationen: + - wer wird jetzt grad bestückt? + - wie viele kann man gleichzeitig bedienen? + - Wann ist ein Verteiler voll? + - Welcher Postbote darf zuerst an den Briefkasten dran? + - Mutex - Briefkasten freigegeben / gesperrt + - Muss geklingelt werden (bspw. Einschreiben) + - Semaphore - weil es muss benachrichtigt werden ## Deadlock (Stillstand / Blockade) ist eine Situation, bei der zwei oder mehr Prozesse auf unbestimmte Weise blockiert sind, weil sie auf die Freigabe von Ressourcen warten diff --git a/Writerside/topics/BS/09_Interprozesskommunikation.md b/Writerside/topics/BS/09_Interprozesskommunikation.md index a558245..6617b8d 100644 --- a/Writerside/topics/BS/09_Interprozesskommunikation.md +++ b/Writerside/topics/BS/09_Interprozesskommunikation.md @@ -27,13 +27,13 @@ - [Shared Memory](#shared-memory) - [Dateien](#dateien) - [Message Queues](#message-queues) -- Pipes -- Promises (Futures) -- Sockets +- [Pipes](#pipes) +- [Promises (Futures)](#promises-futures) +- [Sockets](#sockets) - [Semaphoren](07_Prozesssynchronisation.md#semaphores) - [Mutexe](07_Prozesssynchronisation.md#mutex-mutual-exclusion) -- Condition Variables -- Remote Procedure Call (RPC) +- [Condition Variables](#condition-variables) +- [Remote Procedure Call (RPC)](#remote-procedure-call-rpc) ### Shared Memory - ermöglicht mehreren Prozessen auf denselben _physischen Speicherbereich_ zuzugreifen @@ -55,4 +55,99 @@ - Zugriffsrechte korrekt setzen um Sicherheit zu gewährleisten - geeignete [Synchronisationsmechanismen](07_Prozesssynchronisation.md#mutex-vs-semaphore) nutzen -## Message Queues +### 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 \ No newline at end of file