% !TeX spellcheck = de_DE
\subsection{Distributed Shared-Memory (DSM)}
\begin{itemize}
	\item Probleme: \begin{itemize}
		\item möglichst wenige Nachrichten
		\item Verwaltung der verteilten Speicherbereiche (Eigentümer, Kopien, konkurrierende Zugriffe)\begin{itemize}
			\item zentral (\begriff{verzeichnisbasiert})
			\item vollständig \begriff{repliziert}
			\item weiterleitungsbasiert
		\end{itemize}
		\item Behandlung von Caching
	\end{itemize}
	\item \begriff{Protokolle} (z.B. Single-Writer, Multiple-Writer, \textellipsis) implementieren \begriff{Modelle} (z.B. sequentiell, \enquote{faul}, \textellipsis)
	\item simple Beispiel-Implementierung basierend auf MPI: \begin{itemize}
		\item Zugriff auf globale Daten dürfen nur unter einem Lock (für Datenstrukturen, nicht Seiten!) erfolgen
		\item \enquote{Dämon}-Thread pro Instanz behandelt eingehende Nachrichten
		\item \enquote{globaler} Adressbereich wird lokal mit \texttt{mmap} gemappt, dann Zugriff durch \texttt{mprotect} entzogen
		\item Zugriff auf globalen Adressbereich $\rightarrow$ Fehler $\rightarrow$ Signalbehandlung: \begin{itemize}
			\item Seite von anderer Instanz anfordern
			\item Zugriff mit \texttt{mprotect} freigeben
			\item falls nicht Eigentümer, Registrierung der Seite am Lock
			\item Wiederholung der vorherigen, fehlgeschlagenen Operation
		\end{itemize}
		\item \texttt{lock}-/\texttt{unlock}-Verwaltung: pro Thread Stapel von \texttt{lock}/\texttt{unlock}-Paaren mit Seitenliste (enthält pro Eintrag Seitennummer und Zugriffsart), Abarbeitung bei Aufruf von \texttt{lock}/\texttt{unlock}
		\item bei Multiple-Writer: Lock dient hauptsächlich der Verfolgung der Zugriffe
		\item bei Single-Writer: Lock außerdem für exklusiven Zugriff (muss dann verteilt sein): wenn nicht Halter, Anforderung per expliziter Nachricht
		\item \texttt{unlock} bei schreibendem Zugriff: Diff zwischen aktuellem Zustand der Seite und dem bei der Einlagerung (\begriff{Zwilling}) wird an Eigentümer übertragen
		\item Optimierungsmöglichkeiten:\begin{itemize}
			\item Sammeln von Diffs vor Versenden
			\item Invalidierung (Senden der Änderungen an den Eigentümer) statt Aktualisierung (Broadcast der Änderungen an alle)
			\item Read-Only-Zugriff (keine Invalidierung bei \texttt{unlock} notwendig)
			\item Zugriff durch einen einzigen Thread (\texttt{lock} führt zum Wechsel des Eigentümers)
			\item Schreibhinweise/\begriff{Staffelstabweitergabe}: \begin{itemize}
				\item statt Umweg über Eigentümer, direkte Übertragung der Daten (und des Locks) an nächsten Zugreifer
				\item zur Verwaltung mehrerer Änderungen können Vektoren logischer Uhren verwendet werden mit Maximum aus eigener und fremder Zeit (bei \texttt{lock}) und Erhöhen der eigenen Zeit (bei \texttt{unlock})
			\end{itemize}
		\end{itemize}
	\end{itemize}
	\item Beispiele für DSM-Implementierungen:\begin{itemize}
		\item Übertragung der Daten zum benutzenden Thread:\begin{itemize}
			\item Shasta (verwendet \begriff{Binary Rewriting}):\begin{itemize}
				\item zusätzlicher Code vor jedem Speicherzugriff
				\item Threads werden verteilt statt lokal erzeugt
				\item Abbildung von Adressen auf Cache-Zeilen mit drei Zuständen (invalid, shared, exclusive)
			\end{itemize}
			\item C Region Library (CRL) bietet C-Funktionen, deren Schnittstelle obigem Beispiel mit Single-Writer-Semantik ähnelt
		\end{itemize}
		\item Wechsel des Kontrollflusses zu den Daten:\begin{itemize}
			\item MCRL erweitert CRL und überträgt die aufrufende Funktion (mitsamt des aktuellen Stackframes) an den entfernten Knoten
			\item Large Virtual-Address-Space Machine (LVM) überträgt ganzen Thread auf entfernten Knoten:\begin{itemize}
				\item Compiler baut vor jedem Objektzugriff Lokalitätstest ein
			\end{itemize}
		\end{itemize}
	\end{itemize}
\end{itemize}