diff --git a/Writerside/images/image_157.png b/Writerside/images/image_157.png new file mode 100644 index 0000000..2c2e131 Binary files /dev/null and b/Writerside/images/image_157.png differ diff --git a/Writerside/in.tree b/Writerside/in.tree index 35d03e2..5eed987 100644 --- a/Writerside/in.tree +++ b/Writerside/in.tree @@ -12,6 +12,7 @@ + @@ -37,5 +38,4 @@ - \ No newline at end of file diff --git a/Writerside/topics/BS/08_Threads.md b/Writerside/topics/BS/08_Threads.md new file mode 100644 index 0000000..589f34e --- /dev/null +++ b/Writerside/topics/BS/08_Threads.md @@ -0,0 +1,73 @@ +# Threads +- **Kleinste ausführbare Einheit** innerhalb eines Prozesses +- ermöglichen **flexiblere**, **reaktionsschnellere** und **effizientere** Programmierung + +- müssen sorgfältig überwacht werden, um Probleme zu vermeiden + - bspw. [Deadlocks](07_Prozesssynchronisation.md#deadlock) oder Rennbedingungen + +## Threads vs Prozesse +| **Merkmal** | **Thread** | **Prozess** | +|-------------------------------------------------|-----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------| +| Definition | Kleinste ausführbare Einheit innerhalb eines Prozesses | Unabhängiges Programm in Ausführung | +| Ressourcenzuweisung | Teilen denselben Adressraum & Ressourcen innerhalb eines Prozesses | Haben eigenen Adressraum und separate Ressourcen | +| Kommunikation | direkter Zugriff auf gemeinsame Daten
erfordert synchronisierte Mechanismen | erfordert aufwändige Mechanismen wie IPC | +| [Synchronisation](07_Prozesssynchronisation.md) | benötigt Synchronisationsmechanismen um Rennbedingungen zu vermeiden | Isoliert voneinander, weniger Rennbedingungen,
aber schwerere Synchronisation zwischen Prozessen | +| Overhead | **geringerer Overhead** | höherer Overhead, da separate Adressräume und Ressourcen | +| Ressourcennutzung | **effiziente Nutzung innerhalb desselben Prozesses** | höherer Ressourcenverbrauch aufgrund separater Adressräume | +| Erstellung und Terminierung | **schnellere Erstellung und Terminierung**
Terminierung beeinflusst nur den spezifischen Thread | Langsamere Erstellung und Terminierung
Beenden eines Prozesses beendet alle seine Threads | +| Fehlerisolierung | Scheitern eines Threads kann gesamten Prozess beeinträchtigen | **Isoliert**, Scheitern beeinflusst keine anderen Prozesse | + +- Thread wird auch als _Aktivitätsträger_ oder _leichtgewichtiger Prozess_ benannt + - ist immer Teil eines Prozesses + - Prozess kan viele Threads gleichzeitig enthalten + - werden unabhängig voneinander (_ähnlich Prozesse_) abgearbeitet + - Prozess besteht bei Erzeugung aus einem Thread + - wird impliziert mit dem Prozess erzeugt + +| **Thread** | **Prozess** | +|-----------------------------------------|-------------------------------------| +| Leichter Prozess | Programm in Ausführung | +| Gehört zu Prozess | Vollständig isoliert | +| gemeinsamer Speicher | eigener Speicher | +| geringer Ressourcenverbrauch | hoher Ressourcenverbrauch | +| niedriger Zeitbedarf bei Kontextwechsel | hoher Zeitbedarf bei Kontextwechsel | + +> Abarbeitung von Threads ist ca. 10-100 mal schneller im Vergleich zur Verarbeitung +> von Prozessen. +> +> Threads nutzen den gleichen Adressraum, was die Kommunikation erleichtert + + +## Erzeugung von neuen Threads +- Sehr einfach + - Code eines Threads ist eine **normal definierte Funktion**, die wieder andere Funktionen aufrufen kann + - werden von Systemaufrufen gestartet + - Systemaufruf bekommt die Threadfunktion als Parameter übergeben + +## Threads implementieren +- Threads sind i.d.R. im Kern implementiert, ähnlich wie Prozesse +- Threads haben dieselben Zustände wie Prozesse, Bedeutung der Zustände ist identisch +- Kann in vielen Programmiersprachen und Systemen realisiert werden + - bspw. _C, C++, C#, Java, Python, Swift, ..._ + +### Befehle mit [POSIX API](06_prozessstruktur.md#posix-api) +- **pthread_create** - Erzeugen eines Threads +- **pthread_exit** - Beenden eines Threads +- **pthread_join** - Warten auf Ende eines Threads +- **pthread_yield** - Aufgaben der CPU + +## Fork-Join-Modell +- Paradigma für die parallele Programmierung + - Erstellen von Threads (**fork**) und Zusammenführen von Threads (**join**) +- wird gerne in rekursiven Algorithmen verwendet + - große Aufgabe kann in kleinere Teilaufgaben zerlegt werden +- Jeder Thread kann sich auf eine Teilaufgabe konzentrieren + - Ergebnisse werden die Ergebnisse kombiniert + +![image_157.png](image_157.png) + +## FORK +> Durch den Aufruf der Funktion **fork()** in einem Programm werden Threads ebenso wie der +> gesamte Adressraum des Prozesses kopiert +> +> Es entsteht eine exakte Kopie des aufrufenden Prozesses, einschließlich aller Threads und deren Zustände \ No newline at end of file diff --git a/Writerside/topics/RA/MU2-3Rechner.md b/Writerside/topics/RA/MU2-3Rechner.md index 6723b81..b7a73fa 100644 --- a/Writerside/topics/RA/MU2-3Rechner.md +++ b/Writerside/topics/RA/MU2-3Rechner.md @@ -1,4 +1,4 @@ -# MU2 und MU3Rechner +# MU2/3-Rechner ## MU2 Rechner ## Adressraum vergrößern ### Wortbreite vergrößern diff --git a/Writerside/topics/RA/MU4-5Rechner.md b/Writerside/topics/RA/MU4-5Rechner.md index 7c9bbbc..c099802 100644 --- a/Writerside/topics/RA/MU4-5Rechner.md +++ b/Writerside/topics/RA/MU4-5Rechner.md @@ -1,4 +1,4 @@ -# MU4 und MU5 Rechner +# MU4/5-Rechner ## Registeranzahl erhöhen ### Registerarchitektur - Gesamtzahl der Register ist normalerweise eine Zweierpotenz