aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stapelberg <michael@stapelberg.de>2011-01-12 16:00:15 +0100
committerMichael Stapelberg <michael@stapelberg.de>2011-01-12 16:00:15 +0100
commit06c9f700cb925b1eb20cac67c5a84ff75990a868 (patch)
treec1bda191371c6cb9b772b88c1931f94ddab134fb
parentaf86619723127c8404d3986551b3fd72934d58be (diff)
downloadprozesskommunikation-06c9f700cb925b1eb20cac67c5a84ff75990a868.tar.gz
prozesskommunikation-06c9f700cb925b1eb20cac67c5a84ff75990a868.tar.bz2
aufgabe 4 weiter dokumentiert, illustration hinzugefügt
-rw-r--r--doku/a4-crop.pdfbin0 -> 13500 bytes
-rw-r--r--doku/a4.diabin0 -> 1816 bytes
-rw-r--r--doku/doku.tex47
3 files changed, 46 insertions, 1 deletions
diff --git a/doku/a4-crop.pdf b/doku/a4-crop.pdf
new file mode 100644
index 0000000..1319ffe
--- /dev/null
+++ b/doku/a4-crop.pdf
Binary files differ
diff --git a/doku/a4.dia b/doku/a4.dia
new file mode 100644
index 0000000..65a0a55
--- /dev/null
+++ b/doku/a4.dia
Binary files 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}