This commit is contained in:
David Schirrmeister 2024-05-10 13:01:34 +02:00
parent 6d0b0a212a
commit 21fcb18ed4
3 changed files with 111 additions and 7 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -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

View File

@ -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