diff options
Diffstat (limited to 'doku/doku.tex')
| -rw-r--r-- | doku/doku.tex | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/doku/doku.tex b/doku/doku.tex index 2e8ef14..e6efca5 100644 --- a/doku/doku.tex +++ b/doku/doku.tex @@ -16,6 +16,7 @@ \begin{document} \pagestyle{fancy} \chead{BTS} +\lhead{} % New paragraph \newcommand{\np}{\bigskip\noindent} @@ -25,9 +26,9 @@ \section{Grundgerüst} Das Grundgerüst wird in Teilaufgabe 2, 3 und 4 verwendet und startet die -verschiedenen Prozesse. Dies wird durch die Funktion \texttt{fork\_child()} +verschiedenen Prozesse. Dies wird durch die Funktion \texttt{fork\_child} erledigt, welche als Parameter zwei Zeiger auf Funktionen erwartet. Der erste -Zeiger zeigt auf eine Funktion, welche die eigentlich Arbeit des Prozesses +Zeiger zeigt auf eine Funktion, welche die eigentliche Arbeit des Prozesses erledigt, der zweite Zeiger auf eine Aufräumfunktion. Das Definieren und Benutzen der \texttt{fork\_child}-Funktion erspart uns viel redundanten Code. \np @@ -35,8 +36,8 @@ Benutzen der \texttt{fork\_child}-Funktion erspart uns viel redundanten Code. Die Funktion ruft zunächst \texttt{fork} auf, um den Programmverlauf zu teilen. Im Kindprozess wird dann ein Signalhandler für das Signal \texttt{SIGINT} (Unterbrechung durch Ctrl-C) eingerichtet (hierfür wird der -Aufräum-Funktionszeiger genutzt). Anschließend wird der erste Funktionszeiger -aufgerufen. Dieser Aufruf kehrt nicht mehr zurück, da in allen Prozessen eine +Aufräum-Funktionszeiger genutzt). An\-schließ\-end wird der erste Funktionszeiger +aufgerufen. Dieser Aufruf kehrt nicht mehr zu\-rück, da in allen Prozessen eine Endlosschleife enthalten ist. \np @@ -49,9 +50,9 @@ Elternprozesses korrekt beendet und geben ihre Resourcen frei. \subsection{Conv-Prozess} Der \texttt{Conv}-Prozess generiert mithilfe von \texttt{rand} eine -ganzzahlige Zufallszahl. Dies entspricht dem Einlesen eines Werts von einem -Analog-Digital-Wandler. Dieser Wert wird anschließend zum \texttt{Log}- und zum -\texttt{Statistik}-Prozess gesendet. +ganzzahlige positive Zufallszahl. Dies entspricht dem Einlesen eines Werts von +einem Analog-Digital-Wandler. Dieser Wert wird anschließend zum \texttt{Log}- +und zum \texttt{Statistik}-Prozess gesendet. \np Der \texttt{Conv}-Prozess hat per se keinerlei dynamische Resourcen, die @@ -66,7 +67,7 @@ direkt in die Datei geschrieben. Es wird hierbei nicht via \texttt{fflush} sichergestellt, dass die Ausgabe tatsächlich auf die Festplatte geschrieben wurde. Stattdessen wird darauf vertraut, dass \texttt{fclose} beim Beenden des Programms aufgerufen wird, wobei alle Daten aus dem Puffer auf die Platte -geschrieen werden. +geschrieben werden. \np Der \texttt{Log}-Prozess gibt via \texttt{fclose} das Dateihandle frei, welches @@ -74,9 +75,9 @@ er beim Start geöffnet hat. \subsection{Statistik-Prozess} -Der \texttt{Statistik}-Prozess empfängt je 5 Datenwerte und bildet anschließend -das arithmetische Mittel über die empfangenen Werte. Das gebildete Mittel -schickt er wiederum an den \texttt{Monitor}-Prozess. +Der \texttt{Statistik}-Prozess empfängt Datenwerte und bildet anschließend +den Mittelwert über die empfangenen Werte. Das gebildete Mittel schickt er +wiederum an den \texttt{Monitor}-Prozess. \np Da dieser Prozess ausschließlich mit statischen Puffern arbeitet hat er per se @@ -124,40 +125,43 @@ also als 1-Byte-Integer ohne Vorzeichen gespeichert. \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. -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. +setzt die Größe (in Bytes) 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 +Datenstruktur gesperrt. Dies 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. +Einträge den Wert \texttt{D\_INVALID} als \texttt{dir} (Direction) besitzen. +\np 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 +Die Richtung des aktuellen Eintrags lässt sich sehr einfach herausfinden, indem das aktuelle Element ermittelt wird und anschließend der \texttt{dir}-Wert zurückgegeben wird. +\np 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. +warten, ist dies 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. +Nachricht kommt und an welchen sie gerichtet ist, ruft immer genau der richtige +Prozess \texttt{queue\_\-get\_\-data} auf, und sonst keiner. Deshalb haben wir uns +entschieden, die Funktion atomar den Datenwert der aktuellen Nachricht +zurückgeben zu lassen und diesen gleichzeitig zu invalidieren. +\np Die Invalidierung geschieht, indem der \texttt{dir}-Wert auf \texttt{D\_INVALID} gesetzt und der \texttt{cur}-Wert im Header auf das nächste |
