diff --git a/Writerside/images/image_160.png b/Writerside/images/image_160.png new file mode 100644 index 0000000..41ce105 Binary files /dev/null and b/Writerside/images/image_160.png differ diff --git a/Writerside/topics/BS/07_Prozesssynchronisation.md b/Writerside/topics/BS/07_Prozesssynchronisation.md index dd2376d..2a83af2 100644 --- a/Writerside/topics/BS/07_Prozesssynchronisation.md +++ b/Writerside/topics/BS/07_Prozesssynchronisation.md @@ -111,7 +111,16 @@ Befehle mit [POSIX API](06_prozessstruktur.md#posix-api) > 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