Parallelität gekürzt

This commit is contained in:
WieErWill 2022-03-22 11:06:45 +01:00
parent 0870be5db5
commit 6b8b995236
2 changed files with 124 additions and 294 deletions

Binary file not shown.

View File

@ -3231,18 +3231,16 @@
\pagebreak
\section{Performanz und Parallelität}
Motivation
\begin{itemize*}
\item Hochleistungsrechnen, HPC (,,high performancecomputing''
\item Hochleistungsrechnen (,,high performance computing''
\item ,,Big Data'': Dienstleistungen für Kunden
\item Wettervorhersage
\item anspruchsvolle Multimedia- Anwendungen (Animationen, VR-Rendering)
\item anspruchsvolle Multimedia- Anwendungen (Animationen)
\end{itemize*}
Performanzbegriff
\begin{itemize*}
\item Minimierung der für korrekte Funktion (= Lösung eines Berechnungsproblems) zur Verfügung stehenden Zeit.
\item technischer: Maximierung der Anzahl pro Zeiteinheit abgeschlossener Berechnungen
\item Minimierung der für korrekte Funktion (= Lösung eines Berechnungsproblems) zur Verfügung stehenden Zeit
\item Maximierung der Anzahl pro Zeiteinheit abgeschlossener Berechnungen
\end{itemize*}
Anforderungen hochparallelen Rechnens an ...
@ -3292,7 +3290,6 @@
\end{enumerate*}
\subsubsection{Multicore-Prozessoren}
Terminologie und Abkürzungen
\begin{description*}
\item[MC] multicore (processor)
\item[CMP] chip-level multiprocessing, hochintegrierte Bauweise für MC
@ -3309,7 +3306,6 @@
\item größte Ähnlichkeit zu traditionellen verteilten Systemen
\item Verwendung bei Vielzahl von Prozessorkernen (Skalierbar)
%\item Beispiel: Intel Teraflop-Forschungsprozessor Polaris (80 Kerne als 8x10-Gitter)
\item \includegraphics[width=.3\linewidth]{Assets/AdvancedOperatingSystems-multicore-prozessoren.png}
\end{itemize*}
\item Hierarchisches Design
\begin{itemize*}
@ -3317,7 +3313,6 @@
\item jeder Prozessorkern hat eigenen L1-Cache
\item L2-Cache, Zugriff auf Hauptspeicher u. Großteil der Busse %aber geteilt
\item Verwendung: typischerweise Serverkonfigurationen
\item \includegraphics[width=.3\linewidth]{Assets/AdvancedOperatingSystems-multicore-prozessoren-2.png}
\end{itemize*}
\item Pipeline-Design
\begin{itemize*}
@ -3325,10 +3320,17 @@
\item durch letzten Prozessor: Ablage im Speichersystem
\item Verwendung: Graphikchips, Netzwerkprozessoren
%\item Beispiele: Prozessoren X10 u. X11 von Xelerator zur Verarbeitung von Netzwerkpaketen in Hochleistungsroutern (X11: bis zu 800 Pipeline-Prozessorkerne)
\item \includegraphics[width=.3\linewidth]{Assets/AdvancedOperatingSystems-multicore-prozessoren-3.png}
\end{itemize*}
\end{itemize*}
\begin{center}
Netzwerk, Hierarchisch, Pipeline
\includegraphics[width=.3\linewidth]{Assets/AdvancedOperatingSystems-multicore-prozessoren.png}
\includegraphics[width=.3\linewidth]{Assets/AdvancedOperatingSystems-multicore-prozessoren-2.png}
\includegraphics[width=.3\linewidth]{Assets/AdvancedOperatingSystems-multicore-prozessoren-3.png}
\end{center}
Symmetrische u. asymmetrische Multicore-Prozessoren
\begin{itemize*}
@ -3415,71 +3417,46 @@
\item skaliert äußerst unfreundlich mit Code-Komplexität $\rightarrow$ (monolithischer) Kernel-Code
\end{itemize*}
\item Mechanismen in Betriebssystemen: Locks
\item Arten von Locks am Beispiel Linux
\begin{itemize*}
\item Big Kernel Lock (BKL)
\item atomic-Operationen
\item Spinlocks
\item Semaphore (Spezialform: Reader/Writer Locks)
\end{itemize*}
\end{itemize*}
atomic*
atomic* Lock Operation
\begin{itemize*}
\item Bausteine der komplexeren Sperrmechanismen
\item Granularität: einzelne Integer- (oder sogar Bit-) Operation
\item Performanz: mittels Assembler implementiert %nutzt Atomaritäts garantiender CPU ( TSL - Anweisungen: ,,test-set-lock'' )
\item \texttt{atomic\_*} Geschmacksrichtungen: read, set, add, sub, inc, dec u. a.
\item keine explizite Lock-Datenstruktur $\rightarrow$ Deadlocks durch Mehrfachsperrung syntaktisch unmöglich
\item definierte Länge des kritischen Abschnitts $\rightarrow$ unnötiges Sperren sehr preiswert
\item keine explizite Lock-Datenstruktur $\rightarrow$ Deadlocks syntaktisch unmöglich %durch Mehrfachsperrung
\item definierte Länge des kritischen Abschnitts $\rightarrow$ sehr preiswert
\end{itemize*}
Spinlock
\begin{itemize*}
\item Locking für längere kritische Abschnitte
\begin{itemize*}
\item wechselseitiger Ausschluss durch aktives Warten
\item Granularität: einfach-exklusive Ausführung von Code, der ...
\item ... nicht blockiert
\item ... (vorhersehbar) kurze Zeit den kritischen Abschnitt nutzt
\item Performanz: keine Scheduler-Aktivierung, keine sperrbedingten Kontextwechsel (alle wartenden Threads bleiben ablaufbereit!)
\end{itemize*}
\item Benutzung:
\begin{itemize*}
\item explizite Lock-Datenstruktur $\rightarrow$ Deadlocks durch Mehrfachsperrung oder multiple Locks möglich
\item variable Länge des kritischen Abschnitts $\rightarrow$ unnötiges Sperren sehr teuer! (aktives Warten verschwendet Prozessorzeit)
\end{itemize*}
\end{itemize*}
Semaphor
\begin{itemize*}
\item Locking für komplexere kritische Abschnitte:
\begin{itemize*}
\item Locking für komplexere kritische Abschnitte
\item wechselseitiger Ausschluss durch suspendieren von Threads
\item Granularität: n - exklusive Ausführung von (nahezu) beliebigem Code, über längere oder unbekannt lange (aber endliche) kritische Abschnitte
\item Performanz: nutzt Scheduler(Suspendierung und Reaktivierung wartender Threads), verursacht potenziell Kontextwechsel, implementiert Warteschlange
\end{itemize*}
\item Benutzung
\begin{itemize*}
\item mehrfach nutzbare krit. Abschnitte möglich ($\rightarrow$ begrenzt teilbare Ressourcen)
\item explizite Reaktion auf Signale während des Wartens möglich
\item Deadlocks möglich, unnötiges Sperren teuer
\end{itemize*}
\item Granularität: exklusive Ausführung über längere oder unbekannt lange kritische Abschnitte
\item Performanz: nutzt Scheduler, verursacht potenziell Kontextwechsel, implementiert Warteschlange
\end{itemize*}
R/W-Lock
\begin{itemize*}
\item Reader/Writer Locks: Spezialformen von Spinlocksund binären Semaphoren ( n = 1)
\begin{itemize*}
\item Steigerung der Locking-Granularität $\rightarrow$ Optimierung des Parallelitätsgrades
\item Reader/Writer Locks: Spezialformen von Spinlocks/Semaphoren
\item Steigerung der Granularität $\rightarrow$ Optimierung des Parallelitätsgrades
\item Idee: sperrende Threads nach Zugriffssemantik auf kritischen Abschnitt in zwei Gruppen unterteilt:
\item Reader: nur lesende Zugriffe auf Variablen
\item Writer: mindestens ein schreibender Zugriff auf Variablen
\item R/W-Spinlock/Semaphor muss explizit als Reader oder Writer gesperrt werden
\item R/W-Lock muss explizit als Reader/Writer gesperrt werden
\item Performanz: analog Spinlock/Semaphor
\end{itemize*}
\item Benutzung analog Spinlock/Semaphor
\end{itemize*}
Fazit: Locks im Linux-Kernel
\begin{itemize*}
@ -3488,7 +3465,7 @@
\begin{itemize*}
\item mögliche Länge des kritischen Abschnitts
\item Granularität der selektiven Blockierung (z.B. nur Leser , nur Schreiber )
\item ![](Assets/AdvancedOperatingSystems-locks-in-linux.png)
%\item ![](Assets/AdvancedOperatingSystems-locks-in-linux.png)
\end{itemize*}
\item Locking-Sicherheit: Risiken und Nebenwirkungen hinsichtlich ...
\begin{itemize*}
@ -3508,21 +3485,16 @@
\end{itemize*}
\item Akkumulation der Wärmeabgabe
\begin{itemize*}
\item bedingt durch bauliche Gegebenheiten (Miniaturisierung, CMP)
\item Kontrolle erforderlich zur Vermeidung thermischer Probleme (bis zu Zerstörung der Hardware)
\item bedingt durch bauliche Gegebenheiten (Miniaturisierung)
\item Kontrolle zur Vermeidung thermischer Probleme
\end{itemize*}
\end{enumerate*}
\begin{itemize*}
\item Lösung: Angleichung der Last auf einzelnen Prozessorkernen
\end{itemize*}
Lastangleichung
\begin{itemize*}
\item Verfahren zur Lastangleichung
\begin{itemize*}
\item statische Verfahren: einmalige Zuordnung von Threads
\begin{itemize*}
\item Korrekturen möglich nur durch geeignete Verteilung neuer Threads
\item Korrekturen durch geeignete Verteilung neuer Threads
\item Wirksamkeit der Korrekturen: relativ gering
\end{itemize*}
\item dynamische Verfahren: Optimierung der Zielfunktion zur Laufzeit
@ -3530,19 +3502,6 @@
\item Zuordnungsentscheidungen dynamisch anpassbar
\item Korrekturpotentialzur Laufzeitdurch Zuweisung eines anderen Prozessorkerns an einen Thread ( Migration )
\item aber: algorithmisch komplexer, höhere Laufzeitkosten
\end{itemize*}
\end{itemize*}
\item verbreitete Praxis in Universalbetriebssystemen: dynamische
\end{itemize*}
Dynamische Lastangleichung
\begin{itemize*}
\item Anpassungsgründe zur Laufzeit
\begin{itemize*}
\item Veränderte Lastsituation: Beenden von Threads
\item Verändertes Verhaltens einzelner Threads: z.B. Änderung des Parallelitätsgrads, vormals E/A-Thread wird prozessorintensiv, etc.
\item Zuordnungsentscheidungen
\begin{itemize*}
\item auf Grundlage von a-priori - Informationen über Prozessverhalten
\item durch Messungen tatsächlichen Verhaltens $\rightarrow$ Übergang von Steuerung zu Regelung
\end{itemize*}
@ -3550,69 +3509,48 @@
\begin{itemize*}
\item zusätzliche Thread-bzw. Kontextwechsel
\item kalte Caches
\item $\rightarrow$ Migrationskosten gegen Nutzen aufwiegen
\end{itemize*}
\item[$\rightarrow$] Migrationskosten gegen Nutzen aufwiegen
\end{itemize*}
\end{itemize*}
grundlegende Strategien:
\begin{enumerate*}
\item Lastausgleich (loadbalancing oder loadleveling)
grundlegende Strategien
\begin{description*}
\item[Lastausgleich] loadbalancing oder loadleveling
\begin{itemize*}
\item Ziel: gleichmäßige Verteilung der Last auf alle Prozessorkerne
\item Ziel: gleichmäßige Verteilung der Last auf alle Kerne
\item verwendet strengere Kriterien, die auch bei nicht leerlaufenden und überlasteten Kernen greifen
\item 100\%tiger Lastausgleich nicht möglich %(2 Threads auf 3 CPUs etc.)
\end{itemize*}
\item Lastverteilung (loadsharing)
\item[Lastverteilung] loadsharing
\begin{itemize*}
\item verwendet schwächere Kriterien
\item nur extreme Lastunterschiede zwischen einzelnen Prozessorkernen ausgeglichen(typisch: Ausgleich zwischen leerlaufenden bzw. überlasteten Kernen)
\item nur extreme Lastunterschiede zwischen einzelnen Prozessorkernen ausgeglichen %(typisch: Ausgleich zwischen leerlaufenden bzw. überlasteten Kernen)
\end{itemize*}
\end{enumerate*}
Anmerkungen
\begin{enumerate*}
\item Lastausgleich: verwendet strengere Kriterien, die auch bei nicht leerlaufenden und überlasteten Kernen greifen
\item 100\%tiger Lastausgleich nicht möglich (2 Threads auf 3 CPUs etc.)
\end{enumerate*}
Lastverteilung beim Linux-Scheduler: globale Entscheidungen
\begin{enumerate*}
\item anfängliche Lastverteilung auf Prozessorkerne, grob bzgl. Ausgewogenheit
\item dynamische Lastverteilung auf Prozessorkerne durch
\begin{enumerate*}
\item loadbalancing-Strategie
\item idlebalancing-Strategie
\end{enumerate*}
\end{enumerate*}
\end{description*}
Verteilungsstrategien
\begin{itemize*}
\item ,,load balancing'' - Strategie
\begin{description*}
\item[load balancing] - Strategie
\begin{itemize*}
\item für jeden Kern nach Zeitscheibenprinzip (z.B. 200 ms) aktiviert
\item ,,Thread-Stehlen'' vom am meisten ausgelasteten Kern
\item aber: bestimmte Threads werden (vorerst) nicht migriert
\begin{enumerate*}
\item solche, die nicht auf allen Kernen lauffähig
\item die mit noch ,,heißem Cache''
\end{enumerate*}
\item erzwungene Thread-Migration (unabhängig von heißen Caches), wenn ,,loadbalancing'' mehrmals fehlgeschlagen
\item erzwungene Thread-Migration wenn ,,loadbalancing'' mehrmals fehlgeschlagen
\end{itemize*}
\item ,,idle balancing'' - Strategie
\item[idle balancing] - Strategie
\begin{itemize*}
\item von jedem Kern aktiviert, bevor er in Leerlauf geht:
\item von jedem Kern aktiviert, bevor er in Leerlauf geht
\item Versuch einer ,,Arbeitsbeschaffung''
\item mögliche Realisierung: gleichfalls als ,,Thread-Stehlen'' vom am meisten ausgelasteten Kern
\end{itemize*}
\end{itemize*}
\end{description*}
Heuristische Lastverteilung
\begin{itemize*}
\item in der Praxis: Heuristiken werden genutzt ...
\begin{itemize*}
\item ... für alle Entscheidungen bzgl.
\begin{itemize*}
\item loadbalancing (,,Migrieren oder nicht?'')
\item threadselection (,,Welchen Threads von anderem Prozessor migrieren?'')
\item threadselection (,,Welchen Threads migrieren?'')
\item time-slicing (,,Zeitscheibenlänge für loadbalancing?'')
\end{itemize*}
\item ... unter Berücksichtigung von
@ -3621,131 +3559,52 @@
\item erwarteter Systemperformanz
\item bisherigem Thread-Verhalten
\end{itemize*}
\end{itemize*}
\item Bewertung
\begin{itemize*}
\item Heuristiken verwenden Minimum an Informationen zur Realisierung schneller Entscheidungen $\rightarrow$ Performanz der Lastverteilung
\item Tradeoff: höhere Performanz für aktuelle Last durch teurere Heuristiken (Berücksichtigung von mehr Informationen)?
\end{itemize*}
\item Minimum an Informationen zur Realisierung schneller Entscheidungen $\rightarrow$ Performanz der Lastverteilung
\item Tradeoff: höhere Performanz durch teurere Heuristiken %(Berücksichtigung von mehr Informationen)?
\end{itemize*}
\subsection{Grenzen der Parallelisierbarkeit}
(oder: warum nicht jedes Performanzproblemdurch zusätzliche Hardware gelöst wird)
%(oder: warum nicht jedes Performanzproblemdurch zusätzliche Hardware gelöst wird)
\begin{itemize*}
\item Parallelarbeit aus Anwendungssicht: Welchen Performanzgewinn bringt die Parallelisierung?
\item naiv:
\begin{itemize*}
\item 1 Prozessor $\rightarrow$ Bearbeitungszeit t
\item n Prozessoren $\rightarrow$ Bearbeitungszeit t/n
\end{itemize*}
\item Leistungsmaß für den Performanzgewinn: Speedup $S(n)=\frac{T(1)}{T(n)}$, $T(n)$ bearbeitungszeit bei n Prozessoren
\item Amdahls Gesetz: ,,Auch hochgradig parallele Programme weisen gewisse Teile strenger Datenabhängigkeit auf - die nur sequenziell ausgeführt werden können -und daher den erzielbaren Speed-up grundsätzlich limitieren.''
\item Jedes Programm besteht aus einem nur sequenziell ausführbaren und einem parallelisierbaren Anteil: $T(1)=T_s + T_p$
\item mit als sequenziellem Anteil (z.B. $\rightarrow$ 10% sequenzieller Anteil): Effizienz $f=\frac{T_s}{T_s+T_p}$ wobei $0\leq f \leq 1$
\item Damit ergibt sich im günstigsten Fall für Bearbeitungszeit bei Prozessoren: $T(n)=f*T(1)+ (1-f)\frac{T(1)}{n}$
%\item Leistungsmaß für den Performanzgewinn: Speedup $S(n)=\frac{T(1)}{T(n)}$
\item Jedes Programm aus sequenziellem und parallelisierbaren Anteil
\item mit als sequenziellem Anteil $f=\frac{T_s}{T_s+T_p}$ wobei $0\leq f \leq 1$
\item im günstigsten Fall: $T(n)=f*T(1)+ (1-f)\frac{T(1)}{n}$
\item Speedup nach Amdahl: $S(n)=\frac{T(1)}{T(n)}=\frac{1}{f+\frac{1-f}{n}}$
\end{itemize*}
Praktische Konsequenz aus Amdahls Gesetz:
\begin{itemize*}
\item mögliche Beschleunigung bei Parallelisierung einer Anwendung i.A. durch die Eigenschaften der Anwendungselbst begrenzt (sequenzieller Anteil)
\item mögliche Beschleunigung bei Parallelisierung einer Anwendung i.A. durch die Eigenschaften der Anwendung selbst begrenzt
\item Erhöhung der Prozessorenanzahl über bestimmtes Maß hinaus bringt nur noch minimalen Performanzgewinn
\end{itemize*}
Annahme bisher
\begin{itemize*}
\item parallelisierbarer Anteil auf beliebige Anzahl Prozessoren parallelisierbar
\item genauere Problembeschreibung möglich durch Parallelitätsprofil: maximaler Parallelitätsgrad einer Anwendung in Abhängigkeit von der Zeit
\item Für ein bestimmtes Problem bringt ab einer Maximalzahl ($p_{max}$) jede weitere Erhöhung der Prozessoren-Anzahl keinen weiteren Gewinn, da die Parallelisierbarkeitdes Problems begrenzt ist.
\item Für bestimmtes Problem bringt ab einer Maximalzahl jede weitere Erhöhung der Prozessoren-Anzahl keinen weiteren Gewinn, da die Parallelisierbarkeit des Problems begrenzt ist
\item Effizienz des Speedups $E(n)=\frac{S(n)}{n}$
\item Nutzen($E(n)$)-Kosten($T(n)$)-Quotienten maximieren: $\mu(n)=\frac{E(n)}{T(n)} T(1)=S(n)*E(n)=\frac{S(n)^2}{n}$
\end{itemize*}
Einfluss von Kommunikation und Synchronisation
\begin{itemize*}
\item Threads eines Prozesses müssen kommunizieren (Daten austauschen), spätestens nach ihrer Beendigung
\item hierzu i.A. auch Synchronisation (Koordination) erforderlich
\item Resultat: Prozessoren nicht gesamte Zeit für Berechnungen nutzbar
\item Prozessoren nicht gesamte Zeit für Berechnungen nutzbar
\end{itemize*}
\subsubsection{Overhead durch Kommunikation und Synchronisation}
aus Erfahrungen und theoretischen Überlegungen: Zeitaufwand für Kommunikation und Synchronisation zwischen Prozessen (bzw. Threads) einer Anwendung auf verschiedenen Prozessoren:
\begin{itemize*}
\item streng monoton wachsende Funktion der Prozessoren-Anzahl n (d.h. Funktion nicht nach oben beschränkt)
\item praktische Konsequenz von Kommunikation und Synchronisation:
\begin{itemize*}
\item zu viele Prozessoren für eine Anwendung bedeutet
\item keine Geschwindigkeitssteigerung
\item sogar Erhöhung der Gesamtbearbeitungszeit $T_{\sum}$
\item $\rightarrow$ fallender Speedup
\end{itemize*}
\item Für minimale Bearbeitungsdauer gibt es eine optimale Anzahl Prozessoren
\end{itemize*}
Leistungsmaß Effizienz: Effizienz des Speedups $E(n)=\frac{S(n)}{n}$
\begin{itemize*}
\item Normierung des Speedupauf CPU-Anzahl entspricht Wirkungsgrad der eingesetzten Prozessoren
\item Idealfall: $S(n)=n\Rightarrow E(n)=\frac{S(n)}{n}=1$
\end{itemize*}
\paragraph{Optimale Prozessorenanzahl}
$T(n)$ Gesamtbearbeitungszeit
\begin{itemize*}
\item Im Bereich des Minimums: sehr flacher Verlauf
\item (geringe) Änderung der Prozessoren-Anzahl in diesem Bereich: kaum Auswirkungen auf Rechenzeit (im steilen, fallenden Bereich hat Prozessorenanzahl jedoch gewaltige Auswirkungen auf Rechenzeit)
\end{itemize*}
$E(n)$ Effizienz (Auslastung der Prozessoren)
\begin{itemize*}
\item verringert sich stetig mit zunehmender Prozessoren-Anzahl
\item Konflikt zwischen Kostenminimierung (= Minimierung der Ausführungszeit bzw. Maximierung des Speed-up) und Nutzenmaximierung (= Maximierung der Effizienz)
\item $\rightarrow$ Kompromissbereich
\end{itemize*}
Nutzen($E(n)$)-Kosten($T(n)$)-Quotienten maximieren: $\mu(n)=\frac{E(n)}{T(n)} T(1)=S(n)*E(n)=\frac{S(n)^2}{n}$
\begin{center}
\includegraphics[width=.5\linewidth]{Assets/AdvancedOperatingSystems-optimale-prozessoranzahl.png}
\end{center}
\begin{enumerate*}
\item Effizienz maximieren: $n_{opt}=n^*_E = 1$ unsinnig
\item Speedup maximieren = Ausführungszeit minimieren: $n_{opt}=n^*_S$ Individuell für jedes Programm
\item Nutzen-Kosten-Funktion maximieren: $n_{opt}=n^*_{\mu}$ individuell für jedes Programm
\item Speedup maximieren = Ausführungszeit minimieren: $n_{opt}=n^*_S$ %Individuell für jedes Programm
\item Nutzen-Kosten-Funktion maximieren: $n_{opt}=n^*_{\mu}$ %individuell für jedes Programm
\end{enumerate*}
\subsection{Beispiel-Betriebssysteme}
\begin{itemize*}
\item Auswahl: Betriebssysteme, die mit Fokus auf Hochparallelität entworfen wurden
\item Konsequenzen für BS-Architekturen:
\begin{itemize*}
\item Parallelität durch Abstraktion von Multicore-Architekturen: Multikernel
\item Parallelität durch netzwerkbasierteMulticore-Architekturen: Verteilte Betriebssysteme
\end{itemize*}
\item durch Abstraktion von Multicore-Architekturen: Multikernel
\item durch netzwerkbasierte Multicore-Architekturen: Verteilte BS
\end{itemize*}
\subsubsection{Multikernel: Barrelfish}
In a nutshell:
\begin{itemize*}
\item seit ca. 2009 entwickeltes, experimentelles Forschungs-Betriebssystem (open source)
\item seit ca. 2009 entwickeltes, experimentelles Betriebssystem
\item Untersuchungen zur Struktur künftiger heterogener Multicore-Systeme
\item gegenwärtig in Entwicklung an ETH Zürich in Zusammenarbeit mit Microsoft
\item Forschungsfragen
\begin{enumerate*}
\item Betriebssystemarchitektur
\begin{itemize*}
\item Trend stetig wachsender Anzahl Prozessorkerne $\rightarrow$ Skalierbarkeit des Betriebssystems zur Maximierung von
Parallelität?
\item zunehmende Menge an Varianten der Hardware-Architektur, betreffend z.B.
\begin{itemize*}
\item Speicherhierarchien
\item Verbindungsstrukturen
\item Befehlssatz
\item E/A-Konfiguration
\item $\rightarrow$ Unterstützung zunehmend heterogener Hardware-Vielfalt (insbesondere noch zu erwartender Multicore-Prozessoren)?
\end{itemize*}
\end{itemize*}
\item Wissensdarstellung
\begin{itemize*}
\item Betriebssystem und Anwendungen Informationen über aktuelle Architektur zur Laufzeit liefern
\item $\rightarrow$ Informationen zur Adaptivitätdes BS an Last und Hardware zur Maximierung von Parallelität?
\end{itemize*}
\end{enumerate*}
\item Betriebssystem-Architektur für heterogene Multicore-Rechner
\begin{itemize*}
\item Idee: Betriebssystem wird strukturiert ...
@ -3756,113 +3615,84 @@
\end{itemize*}
\item Entwurfsprinzipien:
\begin{enumerate*}
\item alle Inter-Core-Kommunikation explizit realisiert d.h. keine implizite Kommunikation z.B. über verteilte Speichermodelle wie DSM (Distributed SharedMemory), Botschaften zum Cache-Abgleich etc.
\item alle Inter-Core-Kommunikation explizit realisiert %d.h. keine implizite Kommunikation z.B. über verteilte Speichermodelle wie DSM (Distributed SharedMemory), Botschaften zum Cache-Abgleich etc.
\item Betriebssystem-Struktur ist Hardware-neutral
\item Zustandsinformationen als repliziert (nicht als verteilt)betrachtet $\rightarrow$ schwächere Synchronisationsanforderungen!
\item Zustandsinformationen als repliziert (nicht verteilt) betrachtet $\rightarrow$ schwächere Synchronisationsanforderungen
\end{enumerate*}
\item Ziele dieser Entwurfsprinzipien
\begin{enumerate*}
\item Verbesserte Performanz auf Grundlage des Entwurfs als verteiltes System
\item Verbesserte Performanz auf Grundlage des Entwurfs %als verteiltes System
\item Natürliche Unterstützung für Hardware-Inhomogenitäten
\item Größere Modularität
\item Wiederverwendbarkeit von Algorithmen, die für verteilte Systeme entwickelt wurden
\end{enumerate*}
\item Implementierung: auf jedem Prozessorkern Betriebssystem-Instanz aus CPU-''Treiber'' und Monitor-Prozess
\item Implementierung: auf jedem Prozessorkern BS-Instanz aus CPU-Treiber und Monitor-Prozess
\end{itemize*}
\end{itemize*}
CPU Driver
\begin{itemize*}
\item Aufgabe: Umsetzung von Strategien zur Ressourcenverwaltung, z.B.
\item Aufgabe: Umsetzung von Strategien zur Ressourcenverwaltung
\begin{itemize*}
\item Durchsetzung von Zugriffssteuerungsentscheidungen
\item Zeitscheiben-Multiplexing von Threads
\item Vermittlung von Hardware-Zugriffendes Kernels (MMU, Clockusw.)
\item Vermittlung von Hardware-Zugriffendes Kernels
\item Ereignisbehandlung
\end{itemize*}
\item Implementierung:
\begin{itemize*}
\item hardwarespezifisch
\item vollständig ereignisgesteuert, single-threaded, nicht-präemptiv
\item hardwarespezifisch, ist vergleichsweise klein %, so dass er im Lokalspeicher des Prozessorkerns untergebracht werden kann
\item voll ereignisgesteuert, single-threaded, nicht-präemptiv
\item läuft im privilegierten Modus (Kernel-Modus)
\item ist absolut lokal auf jedem Prozessor-Kern (gesamte Inter-Core-Kommunikation durch die Monitore realisiert)
\item ist vergleichsweise klein, so dass er im Lokalspeicher des Prozessorkerns untergebracht werden kann $\rightarrow$ Wartbarkeit, Robustheit, Korrektheit
\item ist absolut lokal auf jedem Prozessor-Kern %(gesamte Inter-Core-Kommunikation durch die Monitore realisiert)
\item[$\rightarrow$] Wartbarkeit, Robustheit, Korrektheit
\end{itemize*}
\end{itemize*}
Monitor
\begin{itemize*}
\item Wichtige Angaben
\begin{itemize*}
\item läuft im Nutzer-Modus
\item Quellcode fast vollständig prozessorunabhängig
\end{itemize*}
\item Monitore auf allen Prozessorkernen: koordinieren gemeinsam systemweite Zustandsinformationen
\item auf allen Prozessorkernen: koordinieren gemeinsam systemweite Zustandsinformationen
\begin{itemize*}
\item auf allen Prozessor-Kernen replizierte Datenstrukturen: mittels Abstimmungsprotokollkonsistent gehalten (z.B. Speicherzuweisungstabellen u. Adressraum-Abbildungen)
\item $\rightarrow$ implementiert Konsensalgorithmenfür verteilte Systeme
\item auf allen Prozessor-Kernen replizierte Datenstrukturen%: mittels Abstimmungsprotokollkonsistent gehalten (z.B. Speicherzuweisungstabellen u. Adressraum-Abbildungen)
\item[$\rightarrow$] implementiert Konsensalgorithmen für verteilte Systeme
\end{itemize*}
\item Monitore: enthalten die meisten wesentlichen Mechanismen und Strategien, die in monolithischem Betriebssystem-Kernel (bzw. $\mu$Kernel-Serverprozessen) zu finden sind
\end{itemize*}
\subsubsection{Verteilte Betriebssysteme}
\begin{itemize*}
\item hier nur Einblick in ein breites Themenfeld
\item Grundidee: Ortstransparenz
\begin{itemize*}
\item FE des Betriebssystems:
\begin{itemize*}
\item abstrahieren ...
\item multiplexen ...
\item schützen ...
\end{itemize*}
\item hierzu: lokaler BS-Kernel kommuniziert mit über Netzwerk verbundenen, physisch verteilten anderen Kernels (desselben BS)
\item Anwendungssicht auf (nun verteilte) Hardware-Ressourcen identisch zu Sicht auf lokale Hardware $\rightarrow$ Ortstransparenz
\end{itemize*}
\item Zwei Beispiele:
\begin{itemize*}
\item Amoeba: Forschungsbetriebssystem, Python-Urplattform
\item Plan 9 fom Bell Labs: everything is a file
\end{itemize*}
\item lokaler BS-Kernel kommuniziert mit über Netzwerk verbundenen, physisch verteilten anderen Kernels
\item Anwendungssicht auf (verteilte) Hardware-Ressourcen identisch zu Sicht auf lokale Hardware $\rightarrow$ Ortstransparenz
\end{itemize*}
\paragraph{Amoeba}
Architektur
\begin{itemize*}
\item verteiltes System aus drei (nicht zwingend disjunkten)Arten von Knoten:
\item verteiltes System aus drei Arten von Knoten
\begin{itemize*}
\item Workstation (GUI/Terminalprozess, Benutzerinteraktion)
\item Pool Processor (nicht-interaktive Berechnungen)
\item Servers(File ~, Directory ~, Networking ~, ...)
\end{itemize*}
\item Betriebssystem: $\mu$Kernel (identisch auf allen Knoten) + Serverprozesse (dedizierte Knoten, s.o.: Servers )
\item $\rightarrow$ Vertreter einer verteilten $\mu$Kernel-Implementierung
\item Kommunikation:
\begin{itemize*}
\item LAN (Ethernet)
\item RPCs (Remote ProcedureCalls)
\item $\rightarrow$ realisieren ortstransparenten Zugriff auf sämtliche BS-Abstraktionen (Amoeba: objects )
\item Servers (File, Directory, Networking, ...)
\end{itemize*}
\item BS: $\mu$Kernel (identisch auf allen Knoten) + Serverprozesse (dedizierte Knote)
\item[$\rightarrow$] Vertreter einer verteilten $\mu$Kernel-Implementierung
\item Kommunikation: LAN, RPCs (Remote Procedure Calls)
\item[$\rightarrow$] realisieren ortstransparenten Zugriff auf BS-Abstraktionen
\end{itemize*}
\paragraph{Plan 9}
\begin{itemize*}
\item verteiltes BS der Bell Labs (heute: Open Source Projekt)
\item Besonderheit: Semantik der Zugriffe auf verteilte BS-Abstraktionen
\item verteiltes BS der Bell Labs (heute Open Source)
\item Semantik der Zugriffe auf verteilte BS-Abstraktionen
\begin{itemize*}
\item ortstransparent (s. Amoeba)
\item mit ressourcenunabhängig identischen Operationen - deren spezifische Funktionalität wird für die Anwendung transparent implementiert $\rightarrow$ Konzept ,,everything is a file''... bis heute in unixoiden BS und Linux!
\item ortstransparent
\item mit ressourcenunabhängig identischen Operationen %- deren spezifische Funktionalität wird für die Anwendung transparent implementiert $\rightarrow$ Konzept ,,everything is a file''... bis heute in unixoiden BS und Linux!
\end{itemize*}
\item Beispiele:
\begin{itemize*}
\item Tastatureingabenwerden aus (Pseudo-) ,,Datei'' gelesen
\item Textausgabenwerden in ,,Datei'' geschrieben -aus dieser wiederum lesen Terminalanwendungen
\item all dies wird logisch organisiert durch private Namensräume
\item $\rightarrow$ Konzept hierarchischer Dateisysteme
\item[$\rightarrow$] Konzept hierarchischer Dateisysteme
\end{itemize*}
\end{itemize*}
\end{multicols}
\end{document}