From 06c9f700cb925b1eb20cac67c5a84ff75990a868 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 12 Jan 2011 16:00:15 +0100 Subject: aufgabe 4 weiter dokumentiert, illustration hinzugefügt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doku/a4-crop.pdf | Bin 0 -> 13500 bytes doku/a4.dia | Bin 0 -> 1816 bytes doku/doku.tex | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 doku/a4-crop.pdf create mode 100644 doku/a4.dia diff --git a/doku/a4-crop.pdf b/doku/a4-crop.pdf new file mode 100644 index 0000000..1319ffe Binary files /dev/null and b/doku/a4-crop.pdf differ diff --git a/doku/a4.dia b/doku/a4.dia new file mode 100644 index 0000000..65a0a55 Binary files /dev/null and b/doku/a4.dia differ diff --git a/doku/doku.tex b/doku/doku.tex index 8f665f0..2e8ef14 100644 --- a/doku/doku.tex +++ b/doku/doku.tex @@ -115,8 +115,53 @@ Direction), welche angibt, von welchem Prozess die Nachricht stammt und an welchen sie geht. Weiterhin wird der Datenwert selbst als \texttt{uint8\_t}, also als 1-Byte-Integer ohne Vorzeichen gespeichert. +\begin{figure}[h!] +\centering +\caption{Illustration Datenstruktur} +\includegraphics[width=0.75\textwidth]{a4-crop} +\end{figure} + \subsection{Initialisierung: queue\_init} -\texttt{queue\_init} erstellt via \texttt{shm\_open} das Shared Memory-Segment, setzt die Größe und bildet es in den Arbeitsspeicher des Programms ab. +\texttt{queue\_init} erstellt via \texttt{shm\_open} das Shared Memory-Segment, +setzt die Größe und bildet es in den Arbeitsspeicher des Programms ab. +Weiterhin wird der Speicherbereich mit Nullen initialisiert und der Semaphor +initialisiert. Da bei einem \texttt{fork} der Arbeitsspeicher nicht verändert +wird, ist die Abbildung des Shared Memory-Segments auch in den Kindprozessen +ohne weitere Initialisierung direkt nutzbar. + +\subsection{Schreiben eines neuen Eintrags: queue\_write} + +In der Funktion \texttt{queue\_write} wird zunächst via Semaphor die +Datenstruktur gesperrt. Das ist nötig, damit anschließend deterministisch die +Stelle bestimmt werden kann, an welcher das nächste Element eingefügt wird. +Diese wird dadurch gefunden, dass frisch initialisierte und bereits bearbeitete +Einträge den Wert \texttt{D\_INVALID} als \texttt{dir} (Direction) haben. + +Nun wird das Element via \texttt{memcpy} kopiert, der \texttt{cur}-Wert im +Header (für das aktuelle Element) angepasst und der Semaphor wieder entsperrt. + +\subsection{Richtung des aktuellen Eintrags abrufen} + +Die Richtung des aktuellen Eintrags kann man sehr einfach herausfinden, indem +das aktuelle Element ermittelt wird und anschließend der \texttt{dir}-Wert +zurückgegeben wird. + +Diese Funktion arbeitet ohne Locks oder zusätzliche Variablen auf dem Stack. Da +sie in einer Schleife permanent aufgerufen wird, solange die einzelnen Prozesse +warten, ist das eine gute Eigenschaft. + +\subsection{Daten abrufen und Element invalidieren: queue\_get\_data} + +Da durch die Richtung (\texttt{dir}) immer klar ist, von welchem Prozess die +Nachricht kommt und an welchen sie gerichtet ist, ruft kein Prozess +\texttt{queue\_get\_data} auf, der mit den Daten nichts anfangen kann. Deshalb +haben wir uns entschieden, die Funktion atomar den Datenwert der aktuellen +Nachricht zurückgeben zu lassen und diesen gleichzeitig zu invalidieren. + +Die Invalidierung geschieht, indem der \texttt{dir}-Wert auf +\texttt{D\_INVALID} gesetzt und der \texttt{cur}-Wert im Header auf das nächste +Element verschoben wird. + \end{document} -- cgit v1.2.3-70-g09d2