diff options
| author | Paul Buetow <paul@buetow.org> | 2008-08-04 20:43:42 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-08-04 20:43:42 +0000 |
| commit | bb4eb6634485d05e9e8cff6497c60ef696a28eeb (patch) | |
| tree | 4409373e8347be08ce82520cc0f367ada9c314ad | |
| parent | 8925dd57fafd12ead1862f1a4c262526eadaaf08 (diff) | |
written a lot.
| -rw-r--r-- | LaTeX/argouml.zargo | bin | 7343 -> 28842 bytes | |||
| -rw-r--r-- | LaTeX/bib/references.bib | 7 | ||||
| -rw-r--r-- | LaTeX/chapters/appendix-a.tex | 6 | ||||
| -rw-r--r-- | LaTeX/chapters/entwicklung.tex | 222 | ||||
| -rw-r--r-- | LaTeX/chapters/introduction.tex | 20 | ||||
| -rw-r--r-- | LaTeX/chapters/simulator.tex | 203 | ||||
| -rw-r--r-- | LaTeX/chapters/titlepage.tex | 16 | ||||
| -rw-r--r-- | LaTeX/images/core-time.eps | 290 | ||||
| -rw-r--r-- | LaTeX/images/core.eps | 629 | ||||
| -rw-r--r-- | LaTeX/images/events.eps | 831 | ||||
| -rw-r--r-- | LaTeX/images/prefs-editors.eps | 558 | ||||
| -rw-r--r-- | LaTeX/images/prefs.eps | 272 | ||||
| -rw-r--r-- | LaTeX/images/protocols.eps | 850 | ||||
| -rw-r--r-- | LaTeX/images/ss-sidebare-variablen.png | bin | 0 -> 111300 bytes |
14 files changed, 3782 insertions, 122 deletions
diff --git a/LaTeX/argouml.zargo b/LaTeX/argouml.zargo Binary files differindex 414d91d..737dcaa 100644 --- a/LaTeX/argouml.zargo +++ b/LaTeX/argouml.zargo diff --git a/LaTeX/bib/references.bib b/LaTeX/bib/references.bib index 6fe0281..ebc06df 100644 --- a/LaTeX/bib/references.bib +++ b/LaTeX/bib/references.bib @@ -12,4 +12,11 @@ howpublished={Vorlesung},
note={}
}
+@misc{OOS,
+ author={Heinrich Fassbender},
+ title={Vorlesung ``Objektorientierte Softwareentwicklung'' an der FH Aachen},
+ year={2006},
+ howpublished={Vorlesung},
+ note={}
+}
diff --git a/LaTeX/chapters/appendix-a.tex b/LaTeX/chapters/appendix-a.tex index 59226eb..ce0651a 100644 --- a/LaTeX/chapters/appendix-a.tex +++ b/LaTeX/chapters/appendix-a.tex @@ -1,9 +1,13 @@ \chapter{Akronyms}
\begin{acronym}
\acro{API}{Application Programming Interface}
+\acro{HTTPS}{Hypertext Transfer Protocol via SSL}
\acro{GUI}{Graphical User Interface}
+\acro{JRE}{Java Runtime Environment}
\acro{NID}{Nachrichten-Identifikationsnummer}
\acro{PID}{Prozess-Identifikationsnummer}
\acro{RTT}{Round Trip Time}
-\acro{VS}{Verteiltes System}
+\acro{SDK}{Software Development Kit}
+\acro{SVN}{Subversion}
+\acro{VS}{Verteilte Systeme}
\end{acronym}
diff --git a/LaTeX/chapters/entwicklung.tex b/LaTeX/chapters/entwicklung.tex index bf1e6d2..c366e22 100644 --- a/LaTeX/chapters/entwicklung.tex +++ b/LaTeX/chapters/entwicklung.tex @@ -1,22 +1,232 @@ \chapter{Die Implementierung}
-\section{Gliederung der Pakete}
+In diesem Kapitel wird auf die Implementierung des Simulators eingegangen. Der Simulator wurde in der Programmiersprache Java entwickelt. Bei der Betrachtung der Zielgruppe wird klar, dass Java f\"{u}r die gestellte Aufgabe die geigneste Programmiersprache ist. Der Simulator ist somit auf jeder Platform verf\"{u}gbar, f\"{u}r die es die JRE (Java Runtime Environment) gibt und erstreckt sich somit \"{u}ber alle g\"{a}ngigen Betriebssysteme. Da an der Fachhochschule Aachen auch Java gelehrt wird, sollten hier die meisten Studenten auch eigene Erweiterungen, wie beispielsweise neue Protokolle, entwerfen k\"{o}nnen. Der Simulator wurde mit dem derzeit aktuellsten Java SDK (Software Development Kit) in der Version 6 (1.6) kompiliert.
-\section{Editoren}
+\begin{table}
+ \fbox{
+ \begin{tabular}{l|l}
+ \textbf{Paketname} & \textbf{Beschreibung} \\
+ \hline
+ \textit{core} & Klassen f\"{u}r Prozesse und Nachrichten\\
+ \textit{core.time} & Klassen f\"{u}r Zeitformate\\
+ \textit{events} & Basisklassen f\"{u}r Ereignisse\\
+ \textit{events.implementations} & Implementierungen von Ereignissen\\
+ \textit{events.internal} & Implementierungen von internen Ereignissen\\
+ \textit{exceptions} & Klassen f\"{u}r Fehlerbehandlungen\\
+ \textit{prefs} & Klassen f\"{u}r die Einstellungen\\
+ \textit{prefs.editors} & Klassen f\"{u}r die Editoren\\
+ \textit{protocols} & Basisklassen f\"{u}r Protokolle\\
+ \textit{protocols.implementations} & Implementierungen von Protokollen\\
+ \textit{serialize} & Helferklassen f\"{u}r die Serialisierung von Simulationen\\
+ \textit{simulator} & Klassen f\"{u}r die GUI und die Visualisierung\\
+ \textit{utils} & Diverse Helferklassen\\
+ \end{tabular}
+ }
+ \caption{Die Paketstruktur}
+ \label{tb:Pakete}
+\end{table}
+
+Da es sonst den Rahmen sprengen w\"{u}rde, im Folgenden der komplette Quelltext nicht bis in das letzte Detail behandelt. Der Quelltext erstreckt sich n\"{a}mlich, einschließlich Kommentare, auf \"{u}ber 15.000 Zeilen und \"{u}ber 60 Dateien. Zudem ist die generierte Quelltext-Dokumentation (Javadoc) \"{u}ber 2MB groß. Alle folgenden UML-Diagramme stellen aufgrund der \"{U}bersichtlichkeit lediglich die wesentlichen Dinge dar. Alle Details lassen sich im Quelltext und der dazugeh\"{o}rigen Dokumentation einsehen. Die Paketstruktur des Quelltextes ist in Tabelle \ref{tb:Pakete} in alphanumerischer Reihenfolge aufgelistet.
+
+\section{Programmierrichtlinien}
+
+Die Programmierrichtlinien entsprechen in den meisten F\"{a}llen denen aus der Vorlesung \cite{OOS} und die Main-Methode befindet sich in der Klasse \textit{simulator.VSMain}.
+
+\begin{itemize}
+ \item Alle Klassen- und Interfacenamen tragen als Prefix \textit{VS}, was f\"{u}r Verteilte Systeme steht.
+ \item Alle Quelltext-Dateien besitzen einen Header, der Informationen der verwendeten Lizenz angibt.
+ \item Alle Quelltext-Dateien sind vollst\"{a}ndig mit Javadoc dokumentiert worden. Somit sind alle Klassen-, Attribute-, Methoden-, Methodenparameter- und Methodenr\"{u}ckgabewerte dokumentiert.
+ \item Eine Quelltext-Datei hat eine maximale Zeilenl\"{a}nge von 80 Zeichen. Eine Ausnahme stellt die Klasse \textit{prefs.VSDefaultPrefs} dar, denn hier befinden sich auch l\"{a}ngere Texte die in Strings abgespeichert werden, wo manuelle Zeilenumbr\"{u}che wenig Sinn ergeben.
+ \item Es werden zuerst Klassen aus der Java-Standardbibliothek importiert, bevor Klassen aus dem VS-Simulator selbst importiert werden.
+ \item F\"{u}r die Einr\"{u}ckung des Quelltextes wurde das Tool \textit{astyle} mit den Parametern \textit{--style=java --mode=java} verwendet. Hierbei wird eine Einr\"{u}ckungsl\"{a}nge von 4 Zeichen verwendet.
+ \item Klassen- und Interfacenamen beginnen mit großen Buchstaben, w\"{a}hrend alle Variablen-, Methoden- und Attributnamen mit kleinen Buchstaben beginnen. Statische Variablen und Attribute sind komplett in Großbuchstaben geschrieben.
+ \item Namen abstrakter Klassen beginnen stets mit \textit{VSAbstract}.
+\end{itemize}
+
+
+
+\section{Einstellungen und Editoren}
+
+Eine Simulation ist von einer Vielzahl von Einstellungen abh\"{a}ngig. Da auf diese Einstellungen in den weiteren Teilkapitel sets zur\"{u}ckgegriffen wird, macht es Sinn die dazugeh\"{o}rigen Klassen zuerst zu betrachten.
+
+\subsubsection{Das Paket \textit{prefs}}
+
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width=7cm]{images/prefs}
+ \caption{Das Paket \textit{prefs}}
+ \label{fig:PackagePrefs}
+\end{figure}
+
+Auf Abbilung \ref{fig:PackagePrefs} ist der Aufbau des Pakets \textit{prefs} zu sehen. In einer Instanz der Klasse \textit{VSPrefs} lassen sich viele verschiedene Daten als Variablen f\"{u}r eine sp\"{a}tere Verwendung dynamisch ablegen und stellt somit einen Container f\"{u}r diese Daten dar. In einem \textit{VSPrefs}-Objekt speichert der Simulator alle seine Einstellungen ab. Zudem besitzt jedes Prozessobjekt und jedes Protokollobjekt f\"{u}r lokale Einstellungen seine eigene Instanz von \textit{VSPrefs}. Selbst Nachrichtenobjekte besitzt hiervon seine eigene Instanz, wobei hier die zu verschickenden Daten abgelegt werden k\"{o}nnen.
+
+Jede Variable besteht aus einen Datentypen, einen Variablenamen und einer optionalen Beschreibung. Einige Datentypen unterst\"{u}tzen auch die Angabe von Minimum- und Maximumwerten (zum Beispiel besteht eine Prozentangabe aus einen Integerwert zwischen \textit{0} und \textit{100}), was mithilfe der \textit{VSPrefsRestriction}-Klasse geschieht. Da man beispielsweise bei Prozent ein \textit{\%} und bei Millisekunden ein \textit{ms} hinter der Variable sehen m\"{o}chte, kann f\"{u}r jede Variable auch ein optionaler Einheiten-String abgespeichert werden. Alle verf\"{u}gbaren Typen wurden bereits in Tabelle \ref{tb:VariablenDatentypen} aufgelistet. \textit{VSPrefs} stellt f\"{u}r alle Variablen entsprechende Zugriffsmethoden zur Verf\"{u}gung.
+
+Im Folgenden werden nicht alle exisierenden Methoden aufgelistet, da diese auch in der Quelltext-Dokumentation (Javadoc) eingesehen werden k\"{o}nnen. Die Methoden werden nun nur anhand des Integer-Datentyps verdeutlicht. F\"{u}r alle anderen Typen gilt fast alles analog. F\"{u}r Integer stehen in \textit{VSPrefs} folgende Methoden zur Verf\"{u}gung:
+
+\begin{itemize}
+ \setlength{\itemsep}{-2mm}
+ \item \textit{void setInteger(String key, Integer val)}
+ \item \textit{void setInteger(String key, Integer val, String descr)}
+ \item \textit{void setInteger(String key, int val)}
+ \item \textit{void setInteger(String key, int val, String descr)}
+ \item \textit{Integer getIntegerObj(String key)}
+ \item \textit{int getInteger(String key)}
+ \item \textit{java.util.Set<String> getIntegerKeySet()}
+ \item \textit{void initInteger(String key, int val) }
+ \item \textit{void initInteger(String key, int val, String descr) }
+ \item \textit{void initInteger(String key, int val, String descr, \\
+ int minValue, int maxValue) }
+ \item \textit{void initInteger(String key, int val, String descr, \\
+ int minValue, int maxValue, String unit) }
+ \item \textit{void initInteger(String key, int val, String descr, \\
+ VSPrefsRestriction.VSIntegerPrefsRestriction r) }
+ \item \textit{void initInteger(String key, int val, String descr, \\
+ VSPrefsRestriction.VSIntegerPrefsRestriction r, String unit) }
+\end{itemize}
+
+Hierbei stellt \textit{key} den Variablennamen- und \textit{val} den Variablenwert dar. \textit{descr} ist eine optionale Variablenbeschreibung. Wenn f\"{u}r eine Variable keine Beschreibung existiert so wird, wie auf Abbildung \ref{fig:SimulationseinstellungenExperten} anhand der Farbvariablen schon gesehen wurde, f\"{u}r die Anzeige der Datentyp und der Variablenname verwendet. Es k\"{o}nnen sowohl Java's Integer-Objekte, als auch Java's primitiver Integer-Typ \textit{int} verwendet werden. Ein \textit{int}-Wert wird intern allerdings als Integer-Objekt abgespeichert und macht somit keinen großen Unterschied. Die Methode \textit{getIntegerKeySet} gibt alle vorhandenen Integer-Variablennamen (\textit{key}s) als \textit{Set} zur\"{u}ck.
+
+\textit{VSPrefs} bietet auch eine Reihe von \textit{initInteger}-Methoden an, welche sich von den \textit{setInteger}-Methoden dadurch unterscheiden, dass sie eine Variable nur einen Wert zuweisen, wenn sie vorher noch nicht initialisiert wurde, was durch \textit{setInteger} oder \textit{initInteger} selbst geschehen sein kann. Eine komplette \"{U}bersicht aller Methoden (auch f\"{u}r andere Datentypen) gibt es in der Quelltext-Dokumentation.
+
+\textit{VSPrefs} speichert alle Integervariablen in einem \textit{HashMap<String,Integer>}-Objekt ab, wobei der String-Wert den Variablenamen \textit{key} angibt. F\"{u}r die Beschreibung \textit{descr}, den Einheiten-String \textit{unit} sowie m\"{o}glichen Minimum- und Maximumwerte werden separate Objekte der \textit{HashMap} verwendet. Da alle \textit{HashMap}-Objekte synchronisiert sind, k\"{o}nnen alle Methoden von verschiednenen Threads gleichzeitig verwendet werden.
+
+Die Klasse \textit{VSDefaultPrefs} erweitert \textit{VSPrefs} und initialisiert bei Instanzierung automatisch alle verf\"{u}gbaren Simulationsvariablen mit ihren Standardwerten. Dort sind auch alle Spracheinstellungen abgelegt. Sollte jemand den Simulator in eine andere Sprache, zum Beispiel ins Englische, \"{u}bersetzen wollen, so muß er lediglich diese Datei und die Protokoll-Klassen (mehr dazu sp\"{a}ter) editieren. Die Spracheinstellungen sind n\"{a}mlich in einem \textit{VSPrefs}--Objekt als versteckte String-Variablen abgespeichert. Versteckte Variablen werden im Editor nicht angezeigt.
+
+\subsubsection{Das Paket \textit{prefs.editors}}
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width=11cm]{images/prefs-editors}
+ \caption{Das Paket \textit{prefs.editors}}
+ \label{fig:PackagePrefsEditors}
+\end{figure}
+
+Wie Variablen intern abgespeichert werden ist bereits bekannt. F\"{u}r das Editieren der Variablen werden Editor-Objekte verwendet. Auf Abbildung \ref{fig:PackagePrefsEditors} ist die Klassenstruktur des dazugeh\"{o}rigen Paketes \textit{prefs.editors} angegeben.
+
+Die Basis eines Editors stellt die abstrakte Klasse \textit{VSAbstractEditor} dar, dem ein \textit{VSPrefs} Objekt zum Editieren \"{u}bergeben wird. Ein Editor stellt alle verf\"{u}gbaren Variablen des \textit{VSPrefs}-Objektes im GUI dar und stellt gleichzeitig die M\"{o}glichkeit alle Variablen dar\"{u}ber zu editieren zur Verf\"{u}gung. F\"{u}r das Editieren von Farbwerten wird auf \textit{VSColorChooser} zur\"{u}ckgegriffen. Die Klasse \textit{VSEditorTable} ist f\"{u}r das \textit{JTable}-Objekt aus Java's Swing-Bibliothek zust\"{a}ndig, welches bei der graphischen Darstellung aller Variablen eingesetzt wird. Die abstrakte Klasse \textit{VSAbstractBetterEditor} wurde, wegen der \"{U}bersicht, als Zwischenschritt eingef\"{u}gt.
+
+Die Klasse \textit{VSSimulatorEditor} dient f\"{u}r das Editieren der globalen Simulationseinstellungen und \textit{VSProcessEditor} f\"{u}r das Editieren der Prozesseinstellungen sowie der dazugeh\"{o}rigen Protokollvariablen. Da diese beiden Klassen von \textit{VSAbstractBetterEditor} erben, k\"{o}nnen sie mithilfe von \textit{VSEditorFrame} in einem separaten Fenster angezeigt werden. Alternativ k\"{o}nnen die Editoren auch in der Sidebar im Tab ``Variablen'' angezeigt werden. Auf Abbildung \ref{fig:Simulationseinstellungen} wurde bereits ein \textit{VSEditorFrame} in Aktion gesehen.
+
+F\"{u}r Protokolle gibt es keine separate Editor-Klasse, da sie bereits vom Prozesseditor aus editiert werden k\"{o}nnen. Dabei iteriert der Prozesseditor \"{u}ber alle f\"{u}r den Prozess verf\"{u}gbaren Protokollobjekte und f\"{u}gt deren Variablen zus\"{a}tzlich in den Prozesseditor ein. Somit erscheinen die Prozess- und die dazugeh\"{o}rigen Protokollvariablen im selben Editor.
\section{Ereignisse}
-\subsection{Interne Ereignisse}
+F\"{u}r jedes Ereignis existiert eine dazugeh\"{o}rige Klasse, welche die auszuf\"{u}hrenden Aktionen implementiert. Eine Instanz davon wird, f\"{u}r eine sp\"{a}tere Ausf\"{u}hrung, in einem \textit{VSTask}-Objekt verpackt dem Task-Manager \"{u}bergeben. Auf den Task-Manager wird sp\"{a}ter noch genauer eingegangen.
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width=13.5cm]{images/events}
+ \caption{Die Pakete \textit{events} und \textit{events.*}}
+ \label{fig:PackageEvents}
+\end{figure}
+
+Alle Ereignisklassen erweitern die abstrakte Klasse \textit{VSAbstractEvent} und m\"{u}ssen folgende Methoden implementieren:
+
+\begin{itemize}
+ \item \textit{onInit()}: Bevor ein Ereignisobjekt vom Simulator verwendet werden kann, muß es initialisiert werden. Je nach Ereignis k\"{o}nnen hier verschiedene Werte initialisiert werden. Diese Methode wird pro Ereignisobjekt nach Erstellung nur ein einziges Mal ausgef\"{u}hrt.
+ \item \textit{onStart()}: Diese Methode wird jedes Mal ausgef\"{u}hrt, wenn das Ereignis eintritt. Sie stellt somit das Kernst\"{u}ck eines Ereignisses dar.
+\end{itemize}
+
+Jedes programmierbare Ereignis muß, bevor es im Ereigniseditor programmiert werden kann, in der statischen Klasse \textit{VSRegisteredEvents} registriert werden. Da sich die Anzahl der verf\"{u}gbaren Ereignisse bei Laufzeit des Simulators nicht \"{a}ndert, gibt es keine Instanzen von \textit{VSRegisteredEvents}. Alle Methoden und Klassenattribute sind hier statisch. Wenn beispielsweise eigene Ereignisse implementiert werden, dann m\"{u}ssen alle neuen Ereignisse per Hand in die Datei \textit{VSRegisteredEvents.java} \"{u}bernommen- und der Simulator erneut kompiliert werden.
+
+In der Implementierung wird zwischen drei Haupttypen von Ereignissen unterschieden, die jeweils in verschiedenen Paketen liegen:
+
+\begin{enumerate}
+ \item \textit{events.implementations}: In diesem Paket befinden sich alle Ereignisse, die ohne weitere Spezialbehanldung im Simulator eingesetzt werden k\"{o}nnen und direkt im Ereigniseditor programmierbar sind.
+ \begin{itemize}
+ \item \textit{VSProcessCrashEvent}: Dieses Ereignis l\"{a}sst den dazugeh\"{o}rigen Prozess abst\"{u}rzen.
+ \item \textit{VSProcessRecoverEvent}: Dieses Ereignis l\"{a}sst den dazugeh\"{o}rigen Prozess wiederbeleben.
+ \end{itemize}
+
+ \item \textit{events.internal}: In diesem Paket befinden sich alle Ereignisse, die vom Simulator intern verwendet werden und dadurch eine direkte Programmierung via Ereigniseditor ausschließen.
+ \begin{itemize}
+ \item \textit{VSAbstractInternalEvent}: Alle nicht-abstrakten internen Ereignisklassen erben von dieser Klasse. Sie stellt weitere Methoden zur Verf\"{u}gung, die von allen inernen Ereignissen ben\"{o}tigt werden. Derzeit betrifft dies nur Methoden zur Serialisierung der gegebenen Objekte. Auf die Serialisierung (Abspeichern/Laden) von Simulationen wird sp\"{a}ter noch genauer eingegangen.
+ \item \textit{VSMessageReceiveEvent}: Diese Klasse wird f\"{u}r die Ankunft einer Nachricht bei einem Empf\"{a}ngerprozess ben\"{o}tigt. Sie kapselt die eigentliche Nachricht (ein \textit{VSMessage}-Objekt) und \"{u}berpr\"{u}ft, ob der Empf\"{a}ngerprozess das zur Nachricht dazugeh\"{o}rige Protokoll versteht. Diese Klasse \"{u}berpr\"{u}ft auch die Simulationseinstellung ``Nur relevante Nachrichten anzeigen'' und entscheidet, ob die Nachricht nach Eintreffen in der Visualisierung und im Loggfenster ber\"{u}cksichtigt werden soll oder nicht.
+ \item \textit{VSProtocolEvent}: Diese Klasse implementiert gleichzeitig vier verschiedene Ereignisse: Das Aktivieren/Deaktivieren eines Servers/Clients eines gegebenen Protokolls. Der Ereigniseditor berechnet, anhand der verf\"{u}gbaren Protokolle, automatisch alle m\"{o}glichen Kombinationen und bietet sie dem Anwender in seiner Auswahl an, was auch der Grund ist weshalb sich diese Klasse in diesem Paket befindet. F\"{u}r alle dieser vier Ereignisse wird jeweils ein Objekt von \textit{VSProtocolEvent} verwendet, jedoch mit jeweils anderen Attributwerten.
+ \item \textit{VSProtocolScheduleEvent}: Diese Klasse wird f\"{u}r die Wecker-Ereignisse ben\"{o}tigt. Wecker-Ereignisse k\"{o}nnen nur von Protokollen (mehr dazu sp\"{a}ter) erstellt werden. \textit{VSProtocolScheduleEvent} besitzt eine Referenz auf das gegebene Protokoll und ruft darauf bei Ereigniseintrittszeit entweder die Methode \textit{onServerScheduleStart} bei einem Server- oder \textit{onClientScheduleStart} bei einem Clientprotokoll auf.
+ \end{itemize}
+ \item \textit{protocols.implementations}: In diesem Paket befinden sich alle Protokollimplementierung. Jedes Protokoll besitzt hier seine eigene Klasse. Alle Protokolle erben hierbei von der auf Abbildung \ref{fig:PackageEvents} zu sehenden Klasse \textit{protocols.VSAbstractProtocol}. Da \textit{protocols.VSAbstractProtocol} von \textit{events.VSAbstractEvent} erbt, kann ein Protokollobjekt auch als Ereignis eingesetzt werden. Ein solches Ereignis ruft bei Eintritt entweder die Methode \textit{onServerStart} oder die Methode \textit{onClientStart} des Protokolls auf, was einer Server- beziehungsweise einer Clientanfrage entspricht. Die Implementierung von Protokollen wird sp\"{a}ter behandelt.
+\end{enumerate}
+
+Alle Ereignisse, die das Interface \textit{VSCopyableEvent} implementieren k\"{o}nnen im Ereigniseditor mit einem Rechtsklick kopiert werden.
+
+\section{Prozesse, Zeitformate, Nachrichten sowie Task-Manager}
+
+\subsubsection{Die Pakete \textit{core} und \textit{core.time}}
+
+Das Paket \textit{core.time} auf Abbildung \ref{fig:PackageCoreTime} stellt lediglich die Klassen f\"{u}r die Vektor- und Lamportzeitstempel zur Verf\"{u}gung. F\"{u}r die normale lokale Prozesszeit wird aus Performancegr\"{u}nden keine eigene Klasse, sondern ein einfaches \textit{long}-Attribut des Prozessobjektes verwendet.
+
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width=7cm]{images/core-time}
+ \caption{Das Paket \textit{core.time}}
+ \label{fig:PackageCoreTime}
+\end{figure}
+
+Auf Abbildung \ref{fig:PackageCore} ist stark vereinfacht (in Wirklichkeit existieren in den angegebenen Klassen viel mehr Attribute und Methoden) das Paket \textit{core} dargestellt. Eine Simulation besteht aus einer Hintereinanderausf\"{u}hrung endlich vieler Ereignisse. F\"{u}r jedes auszuf\"{u}hrendes Ereignis wird eine Instanz von \textit{VSTask} ben\"{o}tigt, welche die Ereigniseintrittszeit als Attribut abgespeichert hat sowie eine Referenz auf das Objekt des auszuf\"{u}hrenden Ereignisses (\textit{VSAbstractEvent}) und dem Prozessobjekt besitzt. Geplante \textit{VSTask}-Instanzen werden f\"{u}r eine sp\"{a}tere Ausf\"{u}hrung dem Task-Manager \"{u}bergeben.
+
+Die Kapselung eines \textit{VSAbstractEvent}-Objektes in einem \textit{VSTask}-Objekt erlaubt es, dass die selbe \textit{VSAbstractEvent}-Instanz mehrmals auf einmal im Task-Manager geplant werden kann. Ohne dieser Kapselung g\"{a}be es f\"{u}r jedes Ereignis lediglich nur eine einzige m\"{o}gliche Eintrittszeit. Von dieser M\"{o}glichkeit wird zum Beispiel bei den Server- und Clientanfragen eines Protokollobjektes Gebrauch gemacht. F\"{u}r jedes Protokoll kann der Anwender in einer Simulation beliebig viele Anfragen programmieren, wobei f\"{u}r jede Anfrage stets das selbe Protokollobjekt als Ereignis verwendet wird.
+
+Jede Simulation besitzt genau eine Instanz von \textit{VSTaskManager}. Eine Instanz dieser Klasse stellt den Task-Manager dar. Er verwaltet alle \textit{VSTask}-Instanzen und \"{u}berpr\"{u}ft periodisch, ob es auszuf\"{u}hrende Ereignisse gibt. Der Task-Manager unterscheidet zwischen globalen und lokalen Ereignissen. Hierbei werden alle globalen Ereignisse (gekapselt in einem \textit{VSTask}-Objekt) in einer Priorit\"{a}ts-Warteschlange abgelegt. Die Priorit\"{a}ts-Warteschlange stellt hierbei die korrekte Ereigniseintrittsreihenfolge sicher. Da sich die lokalen Zeiten aller beteiligten Prozesse voneinander unterscheiden k\"{o}nnen, muss f\"{u}r jeden Prozess eine separate lokale Priorit\"{a}ts-Warteschlange verwendet werden, auf die jedes Prozessobjekt seine eigene Referenz hat. In den lokalen Warteschlangen sind die geplanten lokalen Ereignisse (auch gekapselt in einem \textit{VSTask}-Objekt) abgelegt. Der Task-Manager greift \"{u}ber eine \textit{java.util.ArrayList} auf alle Prozessobjekte zu und kann somit auch auf alle lokalen Warteschlangen zugreifen und diese verwalten.
+
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width=10.0cm]{images/core}
+ \caption{Das Paket \textit{core}}
+ \label{fig:PackageCore}
+\end{figure}
+
+Eine Instanz von \textit{VSMessage} stellt eine Nachricht dar, die von einem Prozess verschickt wird. F\"{u}r jedes Versenden einer Nachricht wird hiervon eine Instanz gebildet, wo der Senderprozess die zu verschickende Daten ablegt. Da \textit{VSMessage} von \textit{VSPrefs} erbt, k\"{o}nnen zwischen zwei Prozessen beliebige Datentypen (Tabelle \ref{tb:VariablenDatentypen}) \"{u}ber eine Nachricht verschickt werden. Anschließend wird f\"{u}r jeden Empf\"{a}ngerprozess das neues Ereignisobjekt der Klasse \textit{VSMessageReceiveEvent} angelegt, welche eine Referenz der verschickten Nachricht besitzt. Danach wird ein \textit{VSTask}-Objekt instanziert, wo, wie bereits bekannt ist, die Referenz auf das Ereignisobjekt und das dazugeh\"{o}rige Prozessobjekt sowie die Ereigniseintrittszeit als Attribute gespeichert werden. Das \textit{VSTask}-Objekt wird dann dem Task-Manager "{u}bergeben, der das dazugeh\"{o}rige Ereignis ausf\"{u}hrt, wenn die Ereigniseintrittszeit eingetroffen ist.
+
+Via Java-Polymorphie wird das \textit{VSMessageReceiveEvent}-Objekt in ein \textit{VSAbstractEvent} umgewandelt. Die dazugeh\"{o}rige Ereigniseintrittszeit $t_e$ wird jeweils wie folgt bestimmt:
+
+\begin{equation*}
+ t_e := TODO
+\end{equation*}
+
+Erw\"{a}hnentswert ist auch die Klasse \textit{VSMessageStub}, welche ein \textit{VSMessage} kapselt. Ihr Zweck ist das Verstecken einiger Methoden von \textit{VSMessage} im Protokoll-API, welches f\"{u}r die Erstellung eigener Protokolle dient. Der Protokoll-Entwickler soll m\"{o}glichst nichts falsch machen k\"{o}nnen und deswegen soll den Protokoll-API ein eingeschr\"{a}nkter Funktionsumpfang zur Verf\"{u}rung gestellt werden. Da sich \textit{VSMessageStub} im selben Paket wie \textit{VSMessage} befindet, kann \textit{VSMessageStub} auf paket-private Methoden (diejenigen Methoden, die weder als \textit{private}, \textit{protected} noch \textit{public} gekennzeichnet sind) von \textit{VSMessage} zugreifen. Protokolle hingegen werden in einem anderen Paket implementiert und haben somit keinen Zugriff auf diese paket-privaten Methoden. Zwar kann der Protokollentwickler ein eigenes \textit{VSMessageStub}-Objekt anlegen, jedoch kann er auf diese Weise besser unterscheiden auf welche Mehhoden er zugreifen sollte und auf welche nicht. Das Protokoll-API wird sp\"{a}ter genauer behandelt.
+
+Der Task-Manager speichert anschließend die Empfangsereignisse in den lokalen Warteschlangen der Empf\"{a}ngerprozesse. Die Nachricht kommt bei einem Empf\"{a}ngerprozess an, sobald das Ereignis f\"{u}r den Empfang eintritt. F\"{u}r die korrekte Implementierung der Lamport- und Vektor-Zeitstempel wird jeder Nachricht automatisch eine Referenz der Lamport- sowie die Vektorzeit des sendenden Prozesses als Attribut beigef\"{u}gt. F\"{u}r die \"{U}berpr\"{u}fung des Protokolls wird in jeder Nachricht auch der Klassenname des jeweiligen Protokolls abgespeichert.
+
+Eine Instanz von \textit{VSInternalProcess} repr\"{a}sentiert einen simulierten Prozess. Ein \textit{VSInternalProcess} stellt alle vom Simulator intern verwendeten Methoden zur Verf\"{u}gung, w\"{a}hrend ein \textit{VSAbstractProcess} lediglich Methoden hat, die man im Protokoll-API f\"{u}r die Erstellung eigener Protokolle verwenden darf. Da \textit{VSAbstractProcess} abstrakt ist und hiervon keine Instanz gebildet werden darf, muss stets ein \textit{VSInternalProcess}-Objekt erstellt werden. Via Polymorphie wird dieses Objekt nach \textit{VSAbstractProcess} umgewandelt und so dem Protokoll-API zur Verf\"{u}gung gestellt.
+
+Alle einstellbaren Prozessvariablen werden von der Klasse \textit{VSPrefs} geerbt. Aus Performancegr\"{u}nden speichert \textit{VSInternalProcess} von einigen Variablen eine lokale Kopie damit bei Neuberechnungen die Variablen nicht dauernd \"{u}ber eine \textit{HashMap} von \textit{VSPrefs} zugregriffen werden muß. Zum Beispiel wird f\"{u}r die lokale Prozesszeit nicht auf das \textit{HashMap<String,Long>}-Objekt von \textit{VSPrefs}, sondern auf das Klassenattribut \textit{private long localTime} zugegriffen. Vor- und nach dem Editieren \"{u}ber den Prozesseditor werden die \textit{VSPrefs} beziehungsweise die lokalen Kopien auf den neusten Stand gebracht. Selbiges gilt f\"{u}r weitere Variablen wie zum Beispiel der Uhrabweichung.
+
\section{Protokolle}
-\subsection{Protokoll-API}
+\begin{figure}[htbp]
+ \centering
+ \includegraphics[width=12cm]{images/protocols}
+ \caption{Die Pakete \textit{protocols} und \textit{protocols.*}}
+ \label{fig:PackageProtocols}
+\end{figure}
+
+In diesem Abschnitt wird auf die Implementierung der Protokolle eingegangen. Auf Abbildung \ref{fig:PackageProtocols} sind die Pakete \textit{protocols} und \textit{protocols.implementations} dargestellt, welche f\"{u}r die Protokollimplementierungen zust\"{a}ndig sind. \textit{VSAbstractProtocol} stellt lediglich gemeinsame Methoden und Attribute zur Verf\"{u}gung, die von allen Protokollen verwendet verwenden werden k\"{o}nnen. Zus\"{a}tzlich werden von \textit{VSAbstractProtocol} die Methoden \textit{onInit()} sowie \textit{onStart()} aus der abstrakten Klasse \textit{VSAbstractEvent} implementiert, wo die jeweiligen Protokollmethoden (mit Unterscheidung zwischen Server und Client) aufgerufen werden. Jedes Protokoll hat im Paket \textit{protocols.implementations} seine eigene Klasse, die von \textit{VSAbstractProtocol} erbt. Wie bereits erw\"{a}hnt erbt \textit{VSAbstractProtocol} von \textit{VSAbstractEvent}, sodass jedes Protokoll auch als Ereignis (Server- beziehnungsweise Clientanfrage starten) eingesetzt werden kann.
+
+Jede Protokollklasse muß die folgenden Methoden implementieren:
+
+\begin{itemize}
+ \item Einen \"{o}ffentlichen (\textit{public}) Konstruktor. Der Konstruktor muß angeben, ob bei dem gegebene Protokoll der Client oder der Server die Anfragen startet.
+ \item \textit{public void onClientInit()}: Bevor das Protokollobjekt benutzt werden kann, muß es initialisiert werden. Diese Methode wird vor dem ersten Verwenden des Protokolls innerhalb einer Simulation ausgef\"{u}hrt. In der Regel werden hier Protokollvariablen unter Verwendung von \textit{VSPrefs} und Attribute der Protokollklasse initialisiert. Die hier initialisierten Protokollvariablen lassen sich vom Benutzer im Prozesseditor des jeweiligen Prozesses editieren.
+ \item \textit{public void onClientReset()}: Dese Methode wird jedes Mal ausgef\"{u}hrt, wenn die Simulation zur\"{u}ckgesetzt wird.
+ \item \textit{public void onClientStart()}: Diese Methode wird nur ben\"{o}tigt, wenn der Client immer die Anfragen startet. Diese Methode generiert in der Regel immer eine Clientanfrage, die via \textit{VSMessage}-Objekt an alle beteiligten Prozesse verschickt wird.
+ \item \textit{public void onClientRecv(VSMessage message)}: Diese Methode wird jedes Mal Ausgef\"{u}hrt, wenn eine Servernachricht \textit{message} bei dem Client eintrifft.
+ \item \textit{public void onClientSchedule()}: Diese Methode wird jedes Mal ausgef\"{u}hrt, wenn ein Wecker-Ereignis eintritt.
+ \item \textit{public String toString()}: Diese Methode ist nur optional. Hiermit lassen sich die Loggnachrichten eines Protokolls anpassen. Wenn diese Methode in einer Protokollimplementierung ausgelassen wird, so wird stets die \textit{toString}-Methode der Mutterklasse \textit{VSAbstractProtocol} verwendet.
+\end{itemize}
+
+F\"{u}r alle hier aufgelisteten Client-Methoden sind auch die korespondierenen Server-Methoden anzugeben. Die Server-Methoden sind analog so aufgebaut wie die Client-Methoden.
\section{Serialisierung von Simulationen}
\subsection{R\"{u}ckw\"{a}rtskompatibel}
-\section{Programmierrichtlinien}
-
\section{Entwicklungsumgebung}
+In diesem Teilkapitel soll ein kleiner Einblick in die Umgebung, mit der der Simulator entwickelt wurde, gew\"{a}hrt werden. F\"{u}r diese Diplomarbeit wurde ausschließlich Open Source Software verwendet. Die einzige Ausnahme stellt Microsoft Windows XP dar, worauf der Simulator auch getestet wurde. Der Simulator wurde jedoch haupts\"{a}chlich unter dem Betriebssystem FreeBSD 7.0 (\url{http://www.FreeBSD.org}), was ein open source Unix-Derivat ist, programmiert.
+
+Wie bereits bekannt ist, wurde Java (\url{http://java.sun.com}), was mittlerweile auch Open Source Software ist, in der Version 6 (1.6) als die Implementierungssprache gew\"{a}hlt. Als Built-Tool wurde hier auf Apache Ant gesetzt. F\"{u}r die Erstellung dieses Dokumentes wurde LaTeX verwendet.
+
+F\"{u}r schreiben von Quelltext (Java und LaTeX) wurde GVim (\url{http://www.vim.org}) sowie Eclipse (\url{http://www.eclipse.org}) verwendet. Eclipse unterst\"{u}tzt bessere Code-Refactoring-Methoden, w\"{a}hrend GVim mit seiner Flexibilit\"{a}t und schnelleren Editierm\"{o}glichkeiten und mit Vim-Script, der eigenen Script-Engine, gl\"{a}nzt. Je nach Zweck wurde zwischen diesen beiden Umgebungen gewechselt.
+
+Als Versionierungssystem wurde SVN (Subversion) verwendet. F\"{u}r den Zugriff auf das SVN-Repository mittels HTTPS (Hypertext Transfer Protocol via SSL) wurde der Apache-Websever (\url{http://httpd.apache.org}) mit web\_dav-Plugin verwendet. Als SSL Zertifikat diente ein Kostenloses von CaCert (\url{http://www.CaCert.org}).
diff --git a/LaTeX/chapters/introduction.tex b/LaTeX/chapters/introduction.tex index 6b97a06..9e2f2df 100644 --- a/LaTeX/chapters/introduction.tex +++ b/LaTeX/chapters/introduction.tex @@ -2,10 +2,16 @@ \section{Motivation} -In der Literatur findet man viele verschiedene Definitionen eines verteiltes Systems. Vieler dieser Definitionen unterschieden sich untereinander, so dass es schwerf\"{a}llt eine Definition zu finden, die als Alleinige als die Richtige gilt. Andrew Tanenbaum und Marten van Steen haben f\"{u}r die Beschreibung eins verteilten Systems die Folgende lockere Charakterisierung formuliert: +In der Literatur findet man viele verschiedene Definitionen eines verteilten Systems. Vieler dieser Definitionen unterschieden sich untereinander, so dass es schwer f\"{a}llt eine Definition zu finden, die als Alleinige als die Richtige gilt. Andrew Tanenbaum und Marten van Steen haben f\"{u}r die Beschreibung eins verteilten Systems die Folgende lockere Charakterisierung formuliert: \cite{Tanenbaum} \textit{``Ein verteiltes System ist eine Menge voneinander unabh\"{a}ngiger Computer, die dem Anwender wie ein einzelnes, koh\"{a}rentes System erscheinen''} +Der Anwender muss sich nur mit dem lokalen vor ihm befindenden Computer auseinandersetzen (Abbildung \ref{fig:VerteiltesSystem}) w\"{a}hrend die Software des lokalen Computers die reibungslose Kommunikation mit den anderen beteiligten Computern des verteilten Systems sicherstellt. + +Diese Diplomarbeit soll den Gebrauchern die Betrachtung von verteilten Systemen aus einer anderen Perspektive erleichtern. Es soll nicht die Sichtweise eines Endbenutzers eingenommen werden, sondern es sollen die Funktionsweisen von Protokollen und deren Prozesse in verteilten Systemen begreifbar gemacht werden. Es sollen alle relevanten Ereignisse eines verteilten Systems transparent dargestellt werden k\"{o}nnen. + +Um dieses Ziel zu erreichen soll ein Simulator entwickelt werden, der dies erm\"{o}glicht. Der Simulator soll insbesondere f\"{u}r Lehr- und Lernzwecke an der Fachhochschule Aachen entwickelt werden. Beispielsweise sollen Protokolle aus den verteilten Systemen mit ihren wichtigsten Einflussfaktoren simuliert werden k\"{o}nnen. Der Simulator soll zu verstehen helfen wie die gegebenen Protokolle funktionieren und es soll viel Spielraum f\"{u}r eigene Experimente zur Verf\"{u}gung stehen. Der Simulator soll nicht auf eine feste Anzahl von Protokollen beschr\"{a}nkt sein. Es muss daher dem Gebraucher erm\"{o}glicht werden, eigene Protokolle zu entwerfen. + \begin{figure}[htbp] \centering \fbox{\includegraphics{images/verteiltes-system}} @@ -13,15 +19,9 @@ In der Literatur findet man viele verschiedene Definitionen eines verteiltes Sys \label{fig:VerteiltesSystem} \end{figure} -Der Anwender muss sich nur mit dem lokalen vor ihm befindenden Computer auseinandersetzen (Abbildung \ref{fig:VerteiltesSystem}) w\"{a}hrend die Software des lokalen Computers die reibungslose Kommunikation mit den anderen beteiligten Computern des verteilten Systems sicher stellt. - -Der Sinn und der Zweck dieser Diplomarbeit ist die vereinfachte Betrachtung von verteilten Systemen aus einer anderen Perspektive. Es soll nicht die Sichtweise eines Endbenutzers eingenommen werden, sondern es sollen die Funktionsweisen von Protokollen und deren Prozesse in verteilten Systemen begreifbar gemacht werden. Es sollen alle relevanten Ereignisse eines verteilten Systems transparent dargestellt werden k\"{o}nnen. - -Um dieses Ziel zu erreichen soll ein Simulator entwickelt werden, der dies erm\"{o}glicht. Der Simulator soll insbesondere f\"{u}r Lehr- und Lernzwecke entwickelt werden. Beispielsweise sollen Protokolle aus den verteilten Systemen mit ihren wichtigsten Einflussfaktoren simuliert werden k\"{o}nnen. Der Simulator soll helfen zu verstehen wie die gegebenen Protokolle funktionieren und es soll viel Spielraum f\"{u}r eigene Experimente zur Verf\"{u}gung stehen. Der Simulator soll nicht auf eine feste Anzahl von Protokollen beschr\"{a}nkt sein. Es muss daher dem Gebraucher erm\"{o}glicht werden, eigene Protokolle zu entwerfen. - \section{Grundlagen} -F\"{u}r das Grundverst\"{a}ndnis werden im Folgenden einige Grundlagen erl\"{a}utert. Eine Vertiefung findet erst in sp\"{a}teren Kapiteln statt. +F\"{u}r das Grundverst\"{a}ndnis werden im Folgenden einige Grundlagen erl\"{a}utert. Eine Vertiefung findet erst in den sp\"{a}teren Kapiteln statt. \subsubsection{Client/Server Modell} @@ -36,7 +36,7 @@ Der Simulator basiert auf dem Client/Server Prinzip. Jeder Simulation besteht in \subsubsection{Prozesse und deren Rollen} -Ein verteiltes System wird anhand von Prozessen simuliert. Jeder Prozess nimmt hierbei eine oder mehrere Rollen ein. Beispielsweise kann ein Prozess die Rolle eines Clients einnehmen und ein weiterer Prozess die Rolle eines Servers. Ein Prozess kann auch Client und Server gleichzeitig sein. Es besteht auch die M\"{o}glichkeit, dass ein Prozess die Rollen mehrerer Server und Clients auf einmal einnimmt. Ob das sinnvoll ist h\"{a}ngt vom simulierten Szenario ab. Um einen Prozess zu kennzeichnen besitzt jeder Prozess eine \textbf{eindeutige} Prozess-Identifikationsnummer (PID). +Ein verteiltes System wird anhand von Prozessen simuliert. Jeder Prozess nimmt hierbei eine oder mehrere Rollen ein. Beispielsweise kann ein Prozess die Rolle eines Clients einnehmen und ein weiterer Prozess die Rolle eines Servers. Ein Prozess kann auch Client und Server gleichzeitig sein. Es besteht auch die M\"{o}glichkeit, dass ein Prozess die Rollen mehrerer Server und Clients gleichzeitig einnimmt. Ob das sinnvoll ist h\"{a}ngt vom simulierten Szenario ab. Um einen Prozess zu kennzeichnen besitzt jeder Prozess eine \textbf{eindeutige} Prozess-Identifikationsnummer (PID). \subsubsection{Nachrichten} @@ -63,7 +63,7 @@ Eine Simulation besteht auch aus der Anwendung von Protokollen. Es wurde bereits In Abbildung \ref{fig:ClientServerProtokolle} sind 3 Prozesse dargestellt. Prozess 1 unterst\"{u}tzt serverseitig das Protokoll ``A'' und clientseitig das Protokoll ``B''. Prozess 2 unterst\"{u}tzt clientseitig das Protokoll ``A'' und Prozess 3 serverseitig das Protokoll ``B''. Das heißt, dass Prozess 1 mit Prozess 2 via Protokoll ``A'' und mit Prozess 3 via Protokoll ``B'' kommunizieren kann. Die Prozesse 2 und 3 sind zueinander inkompatibel und k\"{o}nnen voneinander erhaltene Nachrichten nicht verarbeiten. -Clients k\"{o}nnen nicht mit Clients, und Server nicht mit Server kommunizieren. F\"{u}r eine Kommunikation wird stets mindestens ein Client und ein Server ben\"{o}tigt. Diese Einschr\"{a}nkung kann aber umgangen werden, indem Prozesse ein gegebenes Protokoll sowohl server- als auch clientseitig unters\"{u}tzten (siehe Broadcast-Sturm Protokoll sp\"{a}ter). Alle vom Simulator verf\"{u}gbaren Protokolle werden sp\"{a}ter genauer behandelt. +Clients k\"{o}nnen nicht mit Clients, und Server nicht mit Server kommunizieren. F\"{u}r eine Kommunikation wird stets mindestens ein Client und ein Server ben\"{o}tigt. Diese Einschr\"{a}nkung kann aber umgangen werden, indem Prozesse ein gegebenes Protokoll sowohl server- als auch clientseitig unterst\"{u}tzen (siehe Broadcast-Sturm Protokoll sp\"{a}ter). Alle vom Simulator verf\"{u}gbaren Protokolle werden sp\"{a}ter genauer behandelt. \begin{figure}[htbp] \centering diff --git a/LaTeX/chapters/simulator.tex b/LaTeX/chapters/simulator.tex index f287815..14afdb0 100644 --- a/LaTeX/chapters/simulator.tex +++ b/LaTeX/chapters/simulator.tex @@ -1,6 +1,6 @@ \chapter{Der Simulator}
-\section{Die grafische Anwenderschnittstelle}
+\section{Die grafische Benutzeroberfl\"{a}che (GUI)}
\begin{figure}[htbp]
\centering
@@ -9,7 +9,7 @@ \label{fig:NeuesFenster}
\end{figure}
-Der Simulator pr\"{a}sentiert sich nach dem ersten Starten wie auf Abbildung \ref{fig:NeuesFenster}. F\"{u}r die Erstellung einer neuen Simulation wird im Men\"{u} ``Datei'' (Abbildung \ref{fig:DateiMenue}) der Punkt ``Neue Simulation'' ausgew\"{a}hlt, wo anschließend das Einstellungsfenster f\"{u}r die neue Simulation erscheint. Auf die einzelnen Optionen wird sp\"{a}ter genauer eingegangen und es werden nun nur die Standardeinstellungen \"{u}bernommen. Die GUI mit einer frischen Simulation sieht aus wie auf Abbildung \ref{fig:NeuErstellteSimulation}.
+Der Simulator l\"{a}ßt sich mit dem Befehl \textit{java -jar VS-Sim.jar} starten und pr\"{a}sentiert sich nach dem ersten Starten wie auf Abbildung \ref{fig:NeuesFenster}. F\"{u}r die Erstellung einer neuen Simulation wird im Men\"{u} ``Datei'' (Abbildung \ref{fig:DateiMenue}) der Punkt ``Neue Simulation'' ausgew\"{a}hlt, wo anschließend das Einstellungsfenster f\"{u}r die neue Simulation erscheint. Auf die einzelnen Optionen wird sp\"{a}ter genauer eingegangen und es werden nun nur die Standardeinstellungen \"{u}bernommen. Die GUI mit einer frischen Simulation sieht aus wie auf Abbildung \ref{fig:NeuErstellteSimulation}.
\begin{figure}[htbp]
\centering
@@ -31,7 +31,7 @@ Im Datei-Men\"{u} (Abbildung \ref{fig:DateiMenue}) lassen sich neue Simulationen \"{U}ber das Editieren-Men\"{u} gelangt der Anwender zu den Simulationseinstellungen, worauf sp\"{a}ter genauer eingegangen wird. In diesem Men\"{u} werden auch alle beteiligten Prozesse zum Editieren aufgelistet. W\"{a}hlt der Anwender dort einen Prozess aus, dann \"{o}ffnet sich der dazugeh\"{o}rige Prozesseditor. Auf diesen wird ebenso sp\"{a}ter genauer eingegangen. Das Simulator-Men\"{u} bietet die selben Optionen wie die Toolbar, welche im n\"{a}chsten Teilkapitel beschrieben wird, an.
-Einige Men\"{u}unterpunkte sind erst erreichbar, wenn im aktuellen Fenster eine Simulation erstellt oder geladen wurde.
+Einige Men\"{u}unterpunkte sind erst erreichbar, wenn im aktuellen Fenster bereits eine Simulation erstellt oder geladen wurde.
\subsubsection{Die Toolbar}
@@ -44,14 +44,14 @@ Oben links im Simulator befindet sich die Toolbar (Abbildung \ref{fig:Toolbar}). \label{fig:Toolbar}
\end{figure}
-Die Toolbar bietet vier verschiedene Funktionalit\"{a}ten an:
+Die Toolbar bietet vier verschiedene Funktionen an:
\begin{itemize}
%\setlength{\itemsep}{-1mm}
- \item Starten der Simulation; kann nur bet\"{a}tigt werden, wenn die Simulation derzeit nicht l\"{a}uft.
- \item Pausieren der Simulation; kann nur bet\"{a}tigt werden, wenn die Simulation derzeit l\"{a}uft.
- \item Wiederholen der Simulation; kann nicht bet\"{a}tigt werden, wenn die Simulation noch nicht gestartet wurde.
\item Zur\"{u}cksetzen der Simulation; kann nur bet\"{a}tigt werden, wenn die Simulation pausiert wurde oder wenn die Simulation abgelaufen ist.
+ \item Wiederholen der Simulation; kann nicht bet\"{a}tigt werden, wenn die Simulation noch nicht gestartet wurde.
+ \item Pausieren der Simulation; kann nur bet\"{a}tigt werden, wenn die Simulation derzeit l\"{a}uft.
+ \item Starten der Simulation; kann nur bet\"{a}tigt werden, wenn die Simulation derzeit nicht l\"{a}uft.
\end{itemize}
Die Toolbar l\"{a}sst sich nach Wunsch repositionieren (z.B. links, rechts oder unten des Simulatorfensters). Hierf\"{u}r muss sie per ``Drag-n-Drop'' zur Zielposition gezogen werden.
@@ -69,7 +69,7 @@ Mittig rechts befindet sich die grafische Simulationsvisualisierung. Die X-Achse Die Prozessbalken dienen auch f\"{u}r Start- und Zielpunkte von Nachrichten. Wenn beispielsweise Prozess 1 eine Nachricht an Prozess 2 verschickt, so wird eine Linie vom einen Prozessbalken zum Anderen gezeichnet. Nachrichten, die ein Prozess an sich selbst schickt, werden nicht visualisiert. Sie werden aber im Loggfenster (mehr dazu sp\"{a}ter) protokolliert.
-Eine andere M\"{o}glichkeit einen Prozesseditor aufzurufen ist ein Linksklick auf den zum Prozess geh\"{o}rigen Prozessbalken. Dies muss also nicht zwingend \"{u}ber das Simulator-Men\"{u} geschehen. Ein Rechtsklick hingegen \"{o}ffnet ein Popup-Fenster mit weiteren Auswahlm\"{o}glichkeiten (Abbildung \ref{fig:RechtsklickProzessbalken}). Ein Prozess kann \"{u}ber das Popup-Men\"{u} nur w\"{a}hrend einer laufenden Simulation zu einem Absturz oder einer Wiederbelebung bewegt werden.
+Eine andere M\"{o}glichkeit einen Prozesseditor aufzurufen ist ein Linksklick auf den zum Prozess geh\"{o}rigen Prozessbalken. Dies muss also nicht immer \"{u}ber das Simulator-Men\"{u} geschehen. Ein Rechtsklick hingegen \"{o}ffnet ein Popup-Fenster mit weiteren Auswahlm\"{o}glichkeiten (Abbildung \ref{fig:RechtsklickProzessbalken}). Ein Prozess kann \"{u}ber das Popup-Men\"{u} nur w\"{a}hrend einer laufenden Simulation zu einem Absturz oder einer Wiederbelebung bewegt werden.
\begin{figure}[htbp]
\centering
@@ -78,7 +78,7 @@ Eine andere M\"{o}glichkeit einen Prozesseditor aufzurufen ist ein Linksklick au \label{fig:RechtsklickProzessbalken}
\end{figure}
-Generell kann die Anzahl der Prozesse nach belieben variieren. Die Dauer der Simulation betr\"{a}gt mindestens \texttt{5} und h\"{o}chstens \texttt{120} Sekunden. Die Simulation endet erst, wenn sie die globale Zeit die angegebene Simulationsendzeit (hier \texttt{15} Sekunden) erreicht hat, und nicht, wenn eine lokale Prozesszeit diese Endzeit erreicht.
+Generell kann die Anzahl der Prozesse nach belieben variieren. Die Dauer der Simulation betr\"{a}gt mindestens \textit{5} und h\"{o}chstens \textit{120} Sekunden. Die Simulation endet erst, wenn sie die globale Zeit die angegebene Simulationsendzeit (hier \textit{15} Sekunden) erreicht hat, und nicht, wenn eine lokale Prozesszeit diese Endzeit erreicht.
\subsubsection{Farbliche Differenzierung}
@@ -110,7 +110,7 @@ Farben helfen dabei die Vorg\"{a}nge einer Simulation besser zu deuten. Standard \subsubsection{Die Sidebar}
-Mit Hilfe der Sidebar lassen sich Prozessereignisse programmieren. Oben auf Abbildung \ref{fig:Sidebar} ist der zu verwaltende Prozess selektiert (hier mit der PID 1). In dieser Prozessauswahl gibt es auch die M\"{o}glichkeit ``Alle Prozesse'' auszuw\"{a}hlen, womit die Ereignisse aller Prozesse gleichzeitig verwaltet werden k\"{o}nnen. Unter ``Lokale Ereignisse'' versteht man diejenigen Ereignisse, die auftreten, wenn eine bestimmte lokale Zeit des dazugeh\"{o}rigen Prozesses eingetreten ist. Die darunterliegende Ereignistabelle listet alle programmierten Ereignisse (hier noch keine vorhanden) mitsamt Eintrittszeiten sowie den PIDs auf.
+Mithilfe der Sidebar lassen sich Prozessereignisse programmieren. Oben auf Abbildung \ref{fig:Sidebar} ist der zu verwaltende Prozess selektiert (hier mit der PID 1). In dieser Prozessauswahl gibt es auch die M\"{o}glichkeit ``Alle Prozesse'' auszuw\"{a}hlen, womit die Ereignisse aller Prozesse gleichzeitig verwaltet werden k\"{o}nnen. Unter ``Lokale Ereignisse'' versteht man diejenigen Ereignisse, die auftreten, wenn eine bestimmte lokale Zeit des dazugeh\"{o}rigen Prozesses eingetreten ist. Die darunterliegende Ereignistabelle listet alle programmierten Ereignisse (hier noch keine vorhanden) mitsamt Eintrittszeiten sowie den PIDs auf.
\begin{figure}[htbp]
\centering
@@ -119,7 +119,7 @@ Mit Hilfe der Sidebar lassen sich Prozessereignisse programmieren. Oben auf Abbi \label{fig:Sidebar}
\end{figure}
-F\"{u}r die Erstellung eines neuen Ereignisses kann der Anwender entweder mit einem Rechtsklick auf einen Prozessbalken (Abbildung \ref{fig:RechtsklickProzessbalken}) klicken und dort ``Lokales Ereignis einf\"{u}gen'' w\"{a}hlen, oder unterhalb der Ereignistabelle ein Ereignis ausw\"{a}hlen (Abbildung \ref{fig:Ereignisauswahl}), im darunter liegendem Textfeld die Ereigniseintrittszeit eintragen und auf ``\"{U}bernehmen'' gehen. Beispielsweise wurden auf Abbildung \ref{fig:SidebarMitEreignissen} drei Ereignisse hinzugef\"{u}gt: Absturz nach \texttt{123ms}, Wiederbelebung nach \texttt{321ms} und erneuter Absturz nach \texttt{3000ms} des Prozesses mit der ID 1.
+F\"{u}r die Erstellung eines neuen Ereignisses kann der Anwender entweder mit einem Rechtsklick auf einen Prozessbalken (Abbildung \ref{fig:RechtsklickProzessbalken}) klicken und dort ``Lokales Ereignis einf\"{u}gen'' w\"{a}hlen, oder unterhalb der Ereignistabelle ein Ereignis ausw\"{a}hlen (Abbildung \ref{fig:Ereignisauswahl}), im darunter liegendem Textfeld die Ereigniseintrittszeit eintragen und auf ``\"{U}bernehmen'' gehen. Beispielsweise wurden auf Abbildung \ref{fig:SidebarMitEreignissen} drei Ereignisse hinzugef\"{u}gt: Absturz nach \textit{123ms}, Wiederbelebung nach \textit{321ms} und erneuter Absturz nach \textit{3000ms} des Prozesses mit der ID 1.
\begin{figure}[htbp]
\centering
@@ -128,9 +128,9 @@ F\"{u}r die Erstellung eines neuen Ereignisses kann der Anwender entweder mit ei \label{fig:Ereignisauswahl}
\end{figure}
-Mit einem Rechtsklick auf den Ereigniseditor lassen sich alle selektierten Ereignisse entweder kopieren oder l\"{o}schen. Mit Hilfe der Strg-Taste k\"{o}nnen auch mehrere Ereignisse gleichzeitig markiert werden. Die Eintr\"{a}ge der Spalten f\"{u}r die Zeit und der PID lassen sich nachtr\"{a}glich editieren. Somit besteht eine komfortable M\"{o}glichkeit bereits programmierte Ereignisse auf eine andere Zeit zu verschieben oder einen anderen Prozess zuzuweisen. Allerdings sollte der Anwender darauf achten, dass er nach dem \"{A}ndern der Ereigniseintrittszeit die Enter-Taste bet\"{a}tigt, da sonst die \"{A}nderung unwirksam ist.
+Mit einem Rechtsklick auf den Ereigniseditor lassen sich alle selektierten Ereignisse entweder kopieren oder l\"{o}schen. Mithilfe der Strg-Taste k\"{o}nnen auch mehrere Ereignisse gleichzeitig markiert werden. Die Eintr\"{a}ge der Spalten f\"{u}r die Zeit und der PID lassen sich nachtr\"{a}glich editieren. Somit besteht eine komfortable M\"{o}glichkeit bereits programmierte Ereignisse auf eine andere Zeit zu verschieben oder einen anderen Prozess zuzuweisen. Allerdings sollte der Anwender darauf achten, dass er nach dem \"{A}ndern der Ereigniseintrittszeit die Enter-Taste bet\"{a}tigt, da sonst die \"{A}nderung unwirksam ist.
-In der Sidebar gibt es neben dem Ereignis-Tab einen weiteren Tab ``Variablen''. Hinter diesem Tab verbirgt sich der Prozesseditor des aktuell ausgew\"{a}hlten Prozesses. Dort k\"{o}nnen alle Variablen des Prozesses editiert werden. Der Prozesseditor wird sp\"{a}ter genauer behandelt.
+In der Sidebar gibt es neben dem Ereignis-Tab einen weiteren Tab ``Variablen''. Hinter diesem Tab verbirgt sich der Prozesseditor des aktuell ausgew\"{a}hlten Prozesses. Dort k\"{o}nnen alle Variablen des Prozesses editiert werden und ist somit eine weitere M\"{o}glichkeit einen Prozesseditor aufzurufen. Der Prozesseditor wird sp\"{a}ter genauer behandelt.
\begin{figure}[htbp]
\centering
@@ -141,7 +141,7 @@ In der Sidebar gibt es neben dem Ereignis-Tab einen weiteren Tab ``Variablen''. \subsubsection{Das Loggfenster}
-Das Loggfenster (Abbildung \ref{fig:NeuErstellteSimulation}, unten) protokolliert in chronologischer Reihenfolge alle eingetroffenen Ereignisse. Auf Abbildung \ref{fig:Loggfenster} sieht der Anwender das Loggfenster nach Erstellung unserer Simulation, an welcher 3 Prozesse beteiligt sind. Am Anfang eines Loggeintrages wird stets die globale Zeit in Millisekunden protokolliert. Bei jedem Prozess werden ebenso seine lokale Zeiten sowie die Lamport- und die Vektor-Zeitstempel aufgef\"{u}hrt. Letztere werden sp\"{a}ter genauer behandelt. Hinter den Zeitangaben werden weitere Angaben, wie beispielsweise welche Nachricht mit welchem Inhalt verschickt wurde und welchem Protokoll sie angeh\"{o}rt, gemacht. Dies wird sp\"{a}ter noch anhand von Beispielen demonstriert.
+Das Loggfenster (Abbildung \ref{fig:NeuErstellteSimulation}, unten) protokolliert in chronologischer Reihenfolge alle eingetroffenen Ereignisse. Auf Abbildung \ref{fig:Loggfenster} ist das Loggfenster nach Erstellung der Demo-Simulation zu sehen, an welcher 3 Prozesse beteiligt sind. Am Anfang eines Loggeintrages wird stets die globale Zeit in Millisekunden protokolliert. Bei jedem Prozess werden ebenso seine lokale Zeiten sowie die Lamport- und die Vektor-Zeitstempel aufgef\"{u}hrt. Letztere werden sp\"{a}ter genauer behandelt. Hinter den Zeitangaben werden weitere Angaben, wie beispielsweise welche Nachricht mit welchem Inhalt verschickt wurde und welchem Protokoll sie angeh\"{o}rt, gemacht. Dies wird sp\"{a}ter noch anhand von Beispielen demonstriert.
\begin{figure}[htbp]
\centering
@@ -163,7 +163,7 @@ Mit dem Deaktivieren der Checkbox ``Logging'' l\"{a}ßt sich das Loggen von Nachr \label{fig:SimulationExpertenmodus}
\end{figure}
-Der Simulator kann in zwei verschiedenen Modi betrieben werden. Es gibt einen einfachen- und einen Expertenmodus. Der Simulator startet standardm\"{a}ßig im einfachen Modus, sodass sich der Anwender nicht mit der vollen Funktionalit\"{a}t des Simulators auf einmal auseinandersetzen muß. Der einfache Modus ist \"{u}bersichtlicher, bietet jedoch weniger Funktionen an. Der Expertenmodus eignet sich f\"{u}r mehr erfahrene Anwender und bietet dementsprechend auch mehr Flexibilit\"{a}t. Der Expertenmodus kann \"{u}ber die gleichnamige Checkbox unterhalb des Loggfensters oder \"{u}ber die Simulationseinstellungen aktiviert oder deaktiviert werden. Auf Abbildung \ref{fig:SimulationExpertenmodus} ist der Simulator im Expertenmodus zu sehen. Wenn man den Expertenmodus mit dem normalen Modus vergleicht, dann fallen einige Unterschiede auf:
+Der Simulator kann in zwei verschiedenen Modi betrieben werden. Es gibt einen einfachen- und einen Expertenmodus. Der Simulator startet standardm\"{a}ßig im einfachen Modus, sodass sich der Anwender nicht mit der vollen Funktionalit\"{a}t des Simulators auf einmal auseinandersetzen muß. Der einfache Modus ist \"{u}bersichtlicher, bietet jedoch weniger Funktionen an. Der Expertenmodus eignet sich mehr f\"{u}r erfahrene Anwender und bietet dementsprechend auch mehr Flexibilit\"{a}t. Der Expertenmodus kann \"{u}ber die gleichnamige Checkbox unterhalb des Loggfensters oder \"{u}ber die Simulationseinstellungen aktiviert oder deaktiviert werden. Auf Abbildung \ref{fig:SimulationExpertenmodus} ist der Simulator im Expertenmodus zu sehen. Wenn der Expertenmodus mit dem normalen Modus verglichen wird, dann fallen einige Unterschiede auf:
\begin{figure}[htbp]
\centering
@@ -176,11 +176,11 @@ Der Simulator kann in zwei verschiedenen Modi betrieben werden. Es gibt einen ei Der erste Unterschied ist in der Sidebar erkennbar (Abbildung \ref{fig:SidebarExpertenmodus}). Dort sind nun, zus\"{a}tzlich den lokalen Ereignissen, auch globale Ereignisse editierbar. Wie bereits erw\"{a}hnt sind unter lokale Ereignisse diejenigen Ereignisse zu verstehen, die auftreten, wenn eine bestimmte lokale Zeit des dazugeh\"{o}rigen Prozesses eingetreten ist. Globale Ereignisse hingegen sind diejenigen Ereignisse, die auftreten, wenn eine bestimmte globale Zeit eingetreten ist. Ein globales Ereignis nimmt die globale Zeit- und ein lokales Ereignis die lokale Prozesszeit als Eintrittskriterium. Globale Ereignisse machen somit nur einen Unterschied, wenn sich die lokalen Prozesszeiten von der globalen Zeit unterscheiden.
-Des Weiteren kann der Anwender bei der Programmierung eines neuen Ereignisses direkt die dazugeh\"{o}rige PID selektieren. Im einfachen Modus wurde hier immer standardm\"{a}ßig die PID des aktuell (in der obersten Combo-Box) ausgew\"{a}hlten Prozesses verwendet. In dieser Combo-Box sollte der Anwender gegebenenfalls ``Alle Prozesse'' selektieren, damit im Ereigniseditor stets die Ereignisse aller Prozesse aufgelistet werden.
+Des Weiteren kann der Anwender bei der Programmierung eines neuen Ereignisses direkt die dazugeh\"{o}rige PID selektieren. Im einfachen Modus wurde hier immer standardm\"{a}ßig die PID des aktuell (in der obersten Combo-Box) ausgew\"{a}hlten Prozesses verwendet (hier mit PID 1). In dieser Combo-Box sollte der Anwender gegebenenfalls ``Alle Prozesse'' selektieren, damit im Ereigniseditor stets die Ereignisse aller Prozesse aufgelistet werden.
\subsubsection{Lamportzeit, Vektorzeit und Anti-Aliasing Schalter}
-Weitere Unterschiede machen sich unterhalb des Loggfensters bemerkbar. Dort gibt es unter Anderem zwei neue Checkboxen ``Lamportzeit'' und ``Vektorzeit''. Aktiviert der Anwender eine dieser beiden Checkboxen, so wird die Lamport- beziehungsweise Vektorzeit in der Visualisierung dargestellt. \"{U}bersichtshalber kann der Anwender nur jeweils eine dieser beiden Checkboxen auf einmal aktivieren.
+Weitere Unterschiede machen sich unterhalb des Loggfensters bemerkbar. Dort gibt es unter Anderem zwei neue Checkboxen ``Lamportzeit'' und ``Vektorzeit''. Aktiviert der Anwender eine dieser beiden Checkboxen, so wird die Lamport- beziehungsweise Vektorzeit in der Visualisierung dargestellt. Damit die \"{U}bersichtlichkeit nicht leidet, kann der Anwender nur jeweils eine dieser beiden Checkboxen zur gleichen Zeit aktiviert haben.
Die Anti-Aliasing-Checkbox erm\"{o}glicht dem Anwender Anti-Aliasing zu aktivieren beziehungsweise zu deaktivieren. Mit aktiviertem Anti-Aliasing werden alle Grafiken der Visualisierung gerundet dargestellt. Aus Performancegr\"{u}nden ist Anti-Aliasing standardm\"{a}ßig nicht aktiv.
@@ -188,7 +188,7 @@ Die Anti-Aliasing-Checkbox erm\"{o}glicht dem Anwender Anti-Aliasing zu aktivier Je komplexer eine Simulation wird, desto un\"{u}bersichtlicher werden die Eintr\"{a}ge im Loggfenster. Hier f\"{a}llt es zunehmend schwerer die \"{U}bersicht aller Ereignisse zu behalten. Um dem entgegenzuwirken gibt es im Expertenmodus einen Loggfilter, welcher es erm\"{o}glicht nur die wesentlichen Daten aus den Loggs zu filtern.
-Der Loggfilter wird anhand der dazugeh\"{o}rigen Checkbox ``Filter'' aktiviert beziehungsweise deaktiviert. In der dahinterliegenden Eingabezeile kann ein regul\"{a}rer Ausdruck in Java-Syntax angegeben werden. Beispielsweise werden mit ``\texttt{PID: (1|2)}'' nur Loggzeilen angezeigt, die entweder ``\texttt{PID: 1}'' oder ``\texttt{PID: 2}'' beinhalten. Alle anderen Zeilen, die zum Beispiel nur ``\texttt{PID: 3}'' beinhalten, werden dabei nicht angezeigt. Mit aktivem Loggfilter werden nur die Loggzeilen angezeigt, auf die der regul\"{a}re Ausdruck passt. Der Loggfilter kann auch nachtr\"{a}glich aktiviert werden, da bereits protokollierte Ereignisse nach jeder Filter\"{a}nderung erneut gefiltert werden.
+Der Loggfilter wird anhand der dazugeh\"{o}rigen Checkbox ``Filter'' aktiviert beziehungsweise deaktiviert. In der dahinterliegenden Eingabezeile kann ein regul\"{a}rer Ausdruck in Java-Syntax angegeben werden. Beispielsweise werden mit ``\textit{PID: (1|2)}'' nur Loggzeilen angezeigt, die entweder ``\textit{PID: 1}'' oder ``\textit{PID: 2}'' beinhalten. Alle anderen Zeilen, die zum Beispiel nur ``\textit{PID: 3}'' beinhalten, werden dabei nicht angezeigt. Mit aktivem Loggfilter werden nur die Loggzeilen angezeigt, auf die der regul\"{a}re Ausdruck passt. Der Loggfilter kann auch nachtr\"{a}glich aktiviert werden, da bereits protokollierte Ereignisse nach jeder Filter\"{a}nderung erneut gefiltert werden.
Der Loggfilter kann auch w\"{a}hrend einer laufenden Simulation verwendet werden. Bei Loggfilterdeaktivierung werden alle Nachrichten wieder angezeigt. Loggnachrichten, die aufgrund des Filters noch nie angezeigt wurden, werden dann nachtr\"{a}glich angezeigt.
@@ -198,10 +198,10 @@ Es wird zwischen zwei Haupttypen von Ereignissen unterschieden: Programmierbare \subsubsection{Prozessabsturz- und Wiederbelebung (programmierbar)}
-Die beiden einfachsten Ereignisse sind ``Prozessabsturz'' sowie ``Prozesswiederbelebung''. Wenn ein Prozess abgest\"{u}rzt ist, so wird sein Prozessbalken in rot dargestellt. Ein abgest\"{u}rzter Prozess kann keine weiteren Ereignisse mehr verarbeiten und, wenn er eine Nachricht empfangen sollte, geht diese verloren. Die einzige Ausnahme bildet ein Wiederbelebungsereignis. Ein abgest\"{u}rzter Prozess kann nichts, außer wiederbelebt werden. W\"{a}hrend eines Prozessabsturzes l\"{a}uft die lokale Prozessuhr, abgesehen der Lamport- und Vektor-Uhren, normal weiter. Das heißt es besteht die M\"{o}glichkeit, dass ein Prozess einige seiner Ereignisse gar nicht ausf\"{u}hrt, da er zu den Ereigniseintrittszeiten abgest\"{u}rzt ist. Wenn im echten Leben ein Computer abst\"{u}rzt oder abgeschaltet wird, dann l\"{a}uft seine Hardware-Uhr, unabh\"{a}ngig vom Betriebssystem, auch weiter.
+Die beiden einfachsten Ereignisse sind ``Prozessabsturz'' sowie ``Prozesswiederbelebung''. Wenn ein Prozess abgest\"{u}rzt ist, so wird sein Prozessbalken in rot dargestellt. Ein abgest\"{u}rzter Prozess kann keine weiteren Ereignisse mehr verarbeiten und wenn bei ihm eine Nachricht eintrifft, dann kann sie nicht verarbeitet werden und geht deshalb verloren. Die einzige Ausnahme bildet ein Wiederbelebungsereignis. Ein abgest\"{u}rzter Prozess kann nichts, außer wiederbelebt werden. W\"{a}hrend eines Prozessabsturzes l\"{a}uft die lokale Prozessuhr, abgesehen der Lamport- und Vektor-Uhren, normal weiter. Das heißt es besteht die M\"{o}glichkeit, dass ein Prozess einige seiner Ereignisse gar nicht ausf\"{u}hrt, da er zu den Ereigniseintrittszeiten abgest\"{u}rzt ist. Wenn im echten Leben ein Computer abst\"{u}rzt oder abgeschaltet wird, dann l\"{a}uft seine Hardware-Uhr unabh\"{a}ngig vom Betriebssystem auch weiter.
\subsubsection{Aktivierung und Deaktivierung von Protokollen sowie Starten von Anfragen (programmierbar)}
-Wir wissen bereits, dass ein Prozess mehrere Protokolle client- und auch serverseitig unterst\"{u}tzen kann. Welches Protokoll von einem Prozess unterst\"{u}tzt wird, kann der Anwender anhand von Protokollaktivierungs- und Protokolldeaktivierungsereignissen konfigurieren. Somit besteht die M\"{o}glichkeit, dass ein gegebener Prozess ein bestimmtes Protokoll erst zu einem bestimmten Zeitpunkt unterst\"{u}tzt und gegebenenfalls ein anderes Protokoll abl\"{o}st. Jedes Protokoll kann entweder server- oder clientseitig aktiviert beziehungsweise deaktiviert werden. Welche Protokolle es gibt wird sp\"{a}ter behandelt. Der Anwender hat die Auswahl zwischen f\"{u}nf verschiedenen Protokollereignistypen:
+Es ist bereits bekannt, dass ein Prozess mehrere Protokolle client- und auch serverseitig unterst\"{u}tzen kann. Welches Protokoll von einem Prozess unterst\"{u}tzt wird, kann der Anwender anhand von Protokollaktivierungs- und Protokolldeaktivierungsereignissen konfigurieren. Somit besteht die M\"{o}glichkeit, dass ein gegebener Prozess ein bestimmtes Protokoll erst zu einem bestimmten Zeitpunkt unterst\"{u}tzt und gegebenenfalls ein anderes Protokoll abl\"{o}st. Jedes Protokoll kann entweder server- oder clientseitig aktiviert beziehungsweise deaktiviert werden. Welche Protokolle es gibt wird sp\"{a}ter behandelt. Der Anwender hat die Auswahl zwischen f\"{u}nf verschiedenen Protokollereignistypen:
\begin{itemize}
\item Aktivierung des Clients eines gegebenen Protokolls
@@ -211,21 +211,21 @@ Wir wissen bereits, dass ein Prozess mehrere Protokolle client- und auch servers \item Starten einer Client/Server-Anfrage eines gegebenen Protokolls
\end{itemize}
-Ob sich das Ereignis f\"{u}r das Starten einer Anfrage auf einen Client oder einen Server bezieht h\"{a}ngt vom verwendeten Protokoll ab. Es gibt Protokolle, wo der Client die initiale Anfrage starten muss, und es gibt Protokolle, wo der Server diese Aufgabe \"{u}bernimmt. Beispielsweise startet bei dem ``Ping-Pong Protokoll'' der Client- und bei dem ``Commit-Protokollen'' der Server immer die erste Anfrage. Es gibt kein Protokoll, wo der Client und der Server jeweils eine initiale Anfragen starten k\"{o}nnen.
+Ob sich das Ereignis f\"{u}r das Starten einer Anfrage auf einen Client oder einen Server bezieht h\"{a}ngt vom verwendeten Protokoll ab. Es gibt Protokolle, wo der Client die Anfragen starten muss, und es gibt Protokolle, wo der Server diese Aufgabe \"{u}bernimmt. Beispielsweise startet bei dem ``Ping-Pong Protokoll'' der Client- und bei dem ``Commit-Protokollen'' der Server immer die erste Anfrage. Es gibt kein Protokoll, wo der Client und der Server jeweils Anfragen starten k\"{o}nnen.
Bei allen dieser f\"{u}nf Ereignissen kann der betroffene Prozess noch beliebig andere Dinge, abh\"{a}ngig vom Protokoll, tun. Beispielsweise kann er den Inhalt der Nachricht generieren oder lokale Variablen initialisieren oder eine der lokalen Uhzeiten \"{a}ndern oder einen Wecker f\"{u}r ``Callback Ereignisse'' setzen (mehr dazu sp\"{a}ter) und vieles mehr.
\subsubsection{Nachrichtenempfang sowie Antwortnachrichten (nicht-programmierbar)}
-Nachdem ein Prozess eine Nachricht empf\"{a}ngt wird zuerst \"{u}berpr\"{u}ft ob er das dazugeh\"{o}rige Protokoll unterst\"{u}tzt. Wenn der Prozess das Protokoll unterst\"{u}tzt, wird geschaut ob es sich um eine Client- oder eine Servernachricht handelt. Wenn es sich um eine Clientnachricht handelt, so muß der Empf\"{a}ngerprozess das Protokoll serverseitig unterst\"{u}tzen und virce versa. Wenn alles passt, dann f\"{u}hrt der Empf\"{a}ngerprozess die vom Protokoll definierten Aktionen aus. In der Regel berechnet der Prozess irgendeinen Wert und schickt ihn \"{u}ber eine Antwortnachricht zur\"{u}ck. Es k\"{o}nnen aber auch beliebig andere Aktionen ausgef\"{u}hrt werden. Welche dies sind h\"{a}ngt vom Protokoll ab.
+Nachdem ein Prozess eine Nachricht empf\"{a}ngt wird zuerst \"{u}berpr\"{u}ft ob er das dazugeh\"{o}rige Protokoll unterst\"{u}tzt. Wenn der Prozess das Protokoll unterst\"{u}tzt, wird geschaut ob es sich um eine Client- oder eine Servernachricht handelt. Wenn es sich um eine Clientnachricht handelt, so muß der Empf\"{a}ngerprozess das Protokoll serverseitig unterst\"{u}tzen und virce versa. Wenn alles passt, dann f\"{u}hrt der Empf\"{a}ngerprozess die vom Protokoll definierten Aktionen aus. In der Regel berechnet der Prozess einen bestimmten Wert und schickt ihn \"{u}ber eine Antwortnachricht zur\"{u}ck. Es k\"{o}nnen aber auch beliebig andere Aktionen ausgef\"{u}hrt werden. Welche dies sind h\"{a}ngt vom Protokoll ab.
\subsubsection{Callback-Ereignisse (nicht-programmierbar)}
-Ein Callback-Ereignis kann von einem Protokoll ausgel\"{o}st werden. Das Protokoll setzt einen Wecker, der angibt zur welcher lokalen Uhrzeit eine weitere Aktion ausgef\"{u}hrt werden soll. Zum Beispiel lassen sich hiermit Timeouts realisieren: Wenn ein Protokoll eine Antwort erwartet, diese aber nicht eintrifft, dann kann nach einer bestimmten Zeit eine Anfrage erneut verschickt werden! Es k\"{o}nnen beliebig viele Callback-Ereignisse definiert werden. Wenn sie noch nicht ausgef\"{u}hrt wurden und aufgrund eines anderen Ereignisses nicht mehr ben\"{o}tigt werden, k\"{o}nnen sie vom Protokoll auch wieder nachtr\"{a}glich entfernt werden. Wenn ein Callback-Ereignis ausgef\"{u}hrt wird, dann kann es sich selbst wieder f\"{u}r eine weitere Ausf\"{u}hrung erneut planen. So lassen sich periodisch wieder-eintreffende Ereignisse realisieren. Beispielsweise verwenden die ``Commit-Protokolle'' (mehr dazu sp\"{a}ter) Callback-Ereignisse, indem solange Anfragen verschickt werden, bis alle ben\"{o}tigten Antworten vorliegen.
+Ein Callback-Ereignis kann von einem Protokoll ausgel\"{o}st werden. Das Protokoll setzt einen Wecker, der angibt zur welcher lokalen Uhrzeit eine weitere Aktion ausgef\"{u}hrt werden soll. Zum Beispiel lassen sich hiermit Timeouts realisieren: Wenn ein Protokoll eine Antwort erwartet, diese aber nicht eintrifft, dann kann nach einer bestimmten Zeit eine Anfrage erneut verschickt werden! Es k\"{o}nnen beliebig viele Callback-Ereignisse definiert werden. Wenn sie noch nicht ausgef\"{u}hrt wurden und aufgrund eines anderen Ereignisses nicht mehr ben\"{o}tigt werden, dann k\"{o}nnen sie vom Protokoll wieder nachtr\"{a}glich entfernt werden. Wenn ein Callback-Ereignis ausgef\"{u}hrt wird, dann kann es sich selbst wieder f\"{u}r eine weitere Ausf\"{u}hrung erneut planen. So lassen sich periodisch wieder-eintreffende Ereignisse realisieren. Beispielsweise verwenden die ``Commit-Protokolle'' (mehr dazu sp\"{a}ter) Callback-Ereignisse, indem solange Anfragen verschickt werden, bis alle ben\"{o}tigten Antworten vorliegen.
\subsubsection{Zufallsereignisse (nicht-programmierbar)}
-Die Eintrittszeit eines Zufallsereignisses wird vom Simulator zuf\"{a}llig gew\"{a}hlt. Es besteht lediglich die M\"{o}glichkeit die Zuf\"{a}lligkeit anhand einer Wahrscheinlichkeit, dass das Ereignis \"{u}berhaupt eintritt, einzustellen. Ein Beispiel ist ein zuf\"{a}lliger Prozessabsturz, dessen Wahrscheinlichkeit unter den Prozessvariablen konfiguriert werden kann. Diese Variable wird im Abschnitt \"{u}ber Prozessvariablen noch ausf\"{u}hrlicher beschrieben.
+Die Eintrittszeit eines Zufallsereignisses wird vom Simulator zuf\"{a}llig gew\"{a}hlt. Es besteht lediglich die M\"{o}glichkeit die Wahrscheinlichkeit, dass das Ereignis \"{u}berhaupt eintritt, einzustellen. Ein Beispiel ist ein zuf\"{a}lliger Prozessabsturz, dessen Wahrscheinlichkeit unter den Prozessvariablen konfiguriert werden kann. Diese Variable wird im Abschnitt \"{u}ber den Prozesseditor noch ausf\"{u}hrlicher beschrieben.
\section{Einstellungen}
@@ -236,12 +236,13 @@ Die Eintrittszeit eines Zufallsereignisses wird vom Simulator zuf\"{a}llig gew\" \begin{tabular}{l|l}
\textbf{Prefix} & \textbf{Beschreibung}\\
\hline
- \texttt{Boolean} & boolschen Wert, z.B. \texttt{true} oder \texttt{false}\\
- \texttt{Color} & Java-Farbobjekt\\
- \texttt{Float} & Flieskommazahl einfacher genauigkeit\\
- \texttt{Integer} & Einfache Integerzahl\\
- \texttt{Integer[]} & Integervektor\\
- \texttt{Long} & Einfache Long-Zahl\\
+ \textit{Boolean} & boolschen Wert, z.B. \textit{true} oder \textit{false}\\
+ \textit{Color} & Java-Farbobjekt\\
+ \textit{Float} & Fließkommazahl einfacher genauigkeit\\
+ \textit{Integer[]} & Integervektor\\
+ \textit{Integer} & Einfache Integerzahl\\
+ \textit{Long} & Einfache Long-Zahl\\
+ \textit{String} & Java-Stringobjekt\\
\end{tabular}
}
\caption{Verf\"{u}gbare Datentypen f\"{u}r editierbare Variablen}
@@ -262,12 +263,12 @@ In diesem Abschnitt wird genauer auf die m\"{o}glichen Konfigurationsm\"{o}glich \end{figure}
-Der Simulator unterscheidet zwischen mehreren Datentypen, in denen die einstellbaren Variablen vorliegen k\"{o}nnen (Tabelle \ref{tb:VariablenDatentypen}). Im folgenden bedeutet \texttt{Prefix}: \textit{wert}, dass die Variable vom Typ \texttt{Prefix} ist, und standardm\"{a}ssig den Wert \textit{wert} zugewiesen hat. Vom Anwender lassen sich lediglich die Variablenwerte, jedoch nicht die Variablentypen sowie Variablennamen, \"{a}ndern.
+Der Simulator unterscheidet zwischen mehreren Datentypen, in denen die einstellbaren Variablen vorliegen k\"{o}nnen (Tabelle \ref{tb:VariablenDatentypen}). Im folgenden bedeutet \textit{Prefix}: \textit{wert}, dass die Variable vom Typ \textit{Prefix} ist, und standardm\"{a}ssig den Wert \textit{wert} zugewiesen hat. Vom Anwender lassen sich lediglich die Variablenwerte, jedoch nicht die Variablentypen sowie Variablennamen, \"{a}ndern.
\subsection{Simulationseinstellungen}
-Beim Erstellen einer neuen Simulation erscheint zun\"{a}chst das dazugeh\"{o}rige Einstellungsfenster (Abbildung \ref{fig:Simulationseinstellungen}). In der Regel reicht es, wenn der Anwender hier die Standardwerte \"{u}bernimmt. Es besteht auch die M\"{o}glichkeit die Einstellungen nachtr\"{a}glich zu editieren, indem das Einstellungsfenster via ``Editieren $\rightarrow$ Einstellungen'' erneut aufgerufen wird.
+Beim Erstellen einer neuen Simulation erscheint zun\"{a}chst das dazugeh\"{o}rige Einstellungsfenster (Abbildung \ref{fig:Simulationseinstellungen}). In der Regel reicht es, wenn der Anwender hier, bis auf die Anzahl beteiligter Prozesse, die Standardwerte \"{u}bernimmt. Es besteht auch die M\"{o}glichkeit die Einstellungen nachtr\"{a}glich zu editieren, indem das Einstellungsfenster via ``Editieren $\rightarrow$ Einstellungen'' erneut aufgerufen wird.
Im Folgenden werden alle in den Simulationseinstellungen verf\"{u}gbaren Variablen beschrieben. Die Klammern geben die Typen und die Standardwerte an, in denen die Variablen vorliegen.
@@ -280,25 +281,27 @@ Im Folgenden werden alle in den Simulationseinstellungen verf\"{u}gbaren Variabl \begin{itemize}
- \item \textbf{Prozesse empfangen eigene Nachrichten} \textit{(Boolean: false)}: Standardm\"{a}ßig k\"{o}nnen Prozesse \"{u}bersichtshalber keine Nachrichten empfangen, die sie selbst verschickt haben. Wenn diese Variable jedoch auf \texttt{true} gesetzt wird, dann kann ein Prozess auch selbst verschickte Nachrichten emfpangen und auf diese ebenso antworten. Die Zeit f\"{u}r das Versenden und Empfangen einer Nachricht an sich selbst betr\"{a}gt jedoch stets \texttt{0ms}. Diese Variable sollte mit Vorsicht verwendet werden, da hierdurch, bedingt aus den \texttt{0ms}, Endlosschleifen entstehen k\"{o}nnen.
+ \item \textbf{Prozesse empfangen eigene Nachrichten} \textit{(Boolean: false)}: Standardm\"{a}ßig k\"{o}nnen Prozesse keine Nachrichten empfangen, die sie selbst verschickt haben. Dies tr\"{a}gt zur \"{U}bersichtlichkeit der Simulation bei. Wenn diese Variable jedoch auf \textit{true} gesetzt wird, dann kann ein Prozess auch selbst verschickte Nachrichten emfpangen und auf diese ebenso antworten. Die Zeit f\"{u}r das Versenden und Empfangen einer Nachricht an sich selbst betr\"{a}gt jedoch stets \textit{0ms}. Diese Variable sollte mit Vorsicht verwendet werden, da hierdurch, bedingt aus den \textit{0ms}, Endlosschleifen entstehen k\"{o}nnen.
\item \textbf{Mittelwerte der Nachrichtenverlustwahrscheinlichkeiten bilden} \textit{(Boolean, true)}: Jede Nachricht die verschickt wird hat, je nach Einstellungen, eine vom verschickenden Prozess abh\"{a}ngige zuf\"{a}llige \"{U}bertragungszeit bis sie ihr Ziel erreicht. Wenn diese Option aktiviert ist, so wird der Mittelwert vom Sende- und Empfangsprozess gebildet. Ansonsten wird stets die \"{U}bertragungszeit, die beim Senderprozesses angegeben wurde, verwendet.
\item \textbf{Nur relevante Nachrichten anzeigen} \textit{(Boolean: true)}: Wenn nur alle relevanten Nachrichten angezeigt werden, so werden Nachrichten an einen Prozess die er selbst nicht verarbeiten kann, weil er das dazugeh\"{o}rige Protokoll nicht unterst\"{u}tzt, nicht angezeigt. Hierdurch wird eine Simulation viel \"{u}bersichtlicher dargestellt.
- \item \textbf{Expertenmodus aktivieren} \textit{(Boolean, false)}: Hier l\"{a}sst sich der Expertenmodus aktivieren beziehungsweise deaktivieren.
- \item \textbf{Simulation periodisch wiederholen} \textit{(Boolean: false)}: Wenn diese Variable auf \texttt{true} gesetzt ist, so wird die Simulation jedes Mal nach Ablauf automatisch erneut gestartet.
- \item \textbf{Abspielgeschwindigkeit der Simulation} \textit{(Float: 0.5)}: Gibt den Faktor der Simulationsabspielgeschindigkeit an. Wenn als Faktor \texttt{1} gew\"{a}hlt wird, dann dauert eine simulierte Sekunde so lange wie eine echte Sekunde. Der Faktor \texttt{0.5} gibt somit an, dass die Simulation mit halber Echtzeitgschwindigkeit abgespielt wird.
- \item \textbf{Anzahl der Prozesse} \textit{(Integer: 3)}: Gibt an wieviele Prozesse an der Simulation teilnehmen sollen. Wie schon erw\"{a}hnt kann der Anwender auch nachtr\"{a}glich via Rechtsklick auf den Prozessbalken den jeweiligen Prozess aus der Simulation entfernen oder weitere Prozesse hinzuf\"{u}gen.
+ \item \textbf{Expertenmodus aktivieren} \textit{(Boolean, false)}: Hier l\"{a}sst sich der Expertenmodus aktivieren beziehungsweise deaktivieren. Alternativ kann dies \"{u}ber die gleichnamige Checkbox unterhalb des Loggfensters geschehen.
+ \item \textbf{Simulation periodisch wiederholen} \textit{(Boolean: false)}: Wenn diese Variable auf \textit{true} gesetzt ist, so wird die Simulation jedes Mal nach Ablauf automatisch erneut gestartet.
+ \item \textbf{Lamportzeiten betreffen alle Ereignisse} \textit{(Boolean: false)}: Wenn diese Variable auf \textit{true} gesetzt ist, so werden bei jedem Ereignis alle Lamportzeitstempel aller Prozesse jeweils inkrementiert. Bei einem Wert \textit{false} inkrementieren sich die Lamportzeitstempel jeweils nur, wenn eine Nachricht empfangen oder verschickt wurde.
+ \item \textbf{Vektorzeiten betreffen alle Ereignisse} \textit{(Boolean: false)}: Wenn diese Variable auf \textit{true} gesetzt ist, so werden bei jedem Ereignis alle Vektor-Zeitstempel aller Prozesse jeweils inkrementiert. Bei einem Wert \textit{false} inkrementieren sich die Vektor-Zeitstempel jeweils nur, wenn eine Nachricht empfangen oder verschickt wurde.
+ \item \textbf{Abspielgeschwindigkeit der Simulation} \textit{(Float: 0.5)}: Gibt den Faktor der Simulationsabspielgeschindigkeit an. Wenn als Faktor \textit{1} gew\"{a}hlt wird, dann dauert eine simulierte Sekunde so lange wie eine echte Sekunde. Der Faktor \textit{0.5} gibt somit an, dass die Simulation mit halber Echtzeitgschwindigkeit abgespielt wird.
+ \item \textbf{Anzahl der Prozesse} \textit{(Integer: 3)}: Gibt an wieviele Prozesse an der Simulation teilnehmen sollen. Der Anwender kann auch nachtr\"{a}glich via Rechtsklick auf den Prozessbalken den jeweiligen Prozess aus der Simulation entfernen oder weitere Prozesse hinzuf\"{u}gen.
\item \textbf{Dauer der Simulation} \textit{(Integer: 15)}: Gibt die Dauer der Simulation in Sekunden an.
\end{itemize}
-Die weiteren Einstellungen unter ``Einstellungen f\"{u}r neue Prozesse'' sowie ``Nachrichteneinstellungen f\"{u}r neue Prozesse'' geben lediglich Standardwerte an, die f\"{u}r neu zu erstellende Prozesse verwendet werden. Die dort verf\"{u}gbaren Variablen werden im folgenden Teilkapitel genauer beschrieben.
+Die weiteren Simulationseinstellungen unter ``Einstellungen f\"{u}r neue Prozesse'' sowie ``Nachrichteneinstellungen f\"{u}r neue Prozesse'' geben lediglich Standardwerte an, die f\"{u}r neu zu erstellende Prozesse verwendet werden. Die dort verf\"{u}gbaren Variablen werden im folgenden Teilkapitel genauer beschrieben.
\subsection{Prozess- und Protokolleinstellungen}
-Jeder Prozess besitzt folgende Variablen, die entweder via dem Variablen-Tab in der Sidebar oder ``Editieren $\rightarrow$ Prozess \textit{PID}'' oder Linksklick auf den Prozessbalken editiert werden k\"{o}nnen. Das Fenster f\"{u}r die Prozesseinstellungen wird auch als Prozesseditor bezeichnet.
+Jeder Prozess besitzt folgende Variablen, die entweder via dem Variablen-Tab in der Sidebar oder ``Editieren $\rightarrow$ Prozess \textit{PID}'' oder Linksklick auf den Prozessbalken editiert werden k\"{o}nnen. Auf allen drei Wegen kommt jeweils der selbe Prozesseditor zum Vorschein.
\begin{itemize}
- \item \textbf{Uhrabweichung} \textit{(Float: 0.0)}: Gibt den Faktor an, um den die lokale Prozessuhr abweicht. Der Faktor \texttt{0.0} besagt beispielsweise, dass die Uhr keine Abweichung hat. Ein Faktor von \texttt{1} w\"{u}rde hingegen bedeuten, dass die Uhr mit doppelter Geschwindigkeit liefe. Es sind nur Werte > \texttt{-1.0} erlaubt, da sonst die Prozessuhr r\"{u}ckw\"{a}rts laufen k\"{o}nnte. Bei allen anderen Werten wird der Faktor wieder automatisch auf \texttt{0.0} gesetzt. Da der Simulator intern mit Fließkommazahlen doppelter Genauigkeit arbeitet, kann es zu kleinen, jedoch vernachl\"{a}ssigbaren, Rundungsfehlern kommen.
- \item \textbf{Prozessausfallwahrscheinlichkeit} \textit{(Integer: 0)}: Gibt eine Wahrscheinlichkeit in Prozent an, ob der gegebene Prozess w\"{a}hrend der Simulation zuf\"{a}llig abst\"{u}rzt. Die Wahrscheinlichkeit bezieht sich auf die komplette Simulationsdauer. Bei einer Einstellung von \texttt{100} Prozent und der Simulationsdauer von \texttt{15} Sekunden st\"{u}rzt der Prozess auf jeden Fall zwischen \texttt{0ms} und \texttt{15000ms} ab. An welcher Stelle dies geschieht wird zuf\"{a}llig bestimmt. Wenn der Prozess nach seinem Absturz wiederbelebt wird, st\"{u}rzt er nicht noch einmal zuf\"{a}llig ab. Dies gilt allerdings nicht, wenn die Prozesseinstellungen nach dem Zufallsabsturz erneut ge\"{a}ndert und \"{u}bernommen werden, da dann das Zufallsabst\"{u}rzereignis erneut erstellt wird.
+ \item \textbf{Uhrabweichung} \textit{(Float: 0.0)}: Gibt den Faktor an, um den die lokale Prozessuhr abweicht. Der Faktor \textit{0.0} besagt beispielsweise, dass die Uhr keine Abweichung hat und somit global-korrekt l\"{a}uft. Ein Faktor von \textit{1.0} w\"{u}rde hingegen bedeuten, dass die Uhr mit doppelter Geschwindigkeit- und ein Faktor von \textit{-0.5}, dass die lokale Prozessuhr mit halber Geschwindigkeit der globalen Uhr fortschreitet. Es sind nur Werte > \textit{-1.0} erlaubt, da sonst die Prozessuhr r\"{u}ckw\"{a}rts laufen k\"{o}nnte. Bei allen anderen Werten wird der Faktor wieder automatisch auf \textit{0.0} gesetzt. Da der Simulator intern mit Fließkommazahlen doppelter Genauigkeit arbeitet, kann es zu kleinen, jedoch vernachl\"{a}ssigbaren, Rundungsfehlern kommen.
+ \item \textbf{Prozessausfallwahrscheinlichkeit} \textit{(Integer: 0)}: Gibt eine Wahrscheinlichkeit in Prozent an, ob der gegebene Prozess w\"{a}hrend der Simulation zuf\"{a}llig abst\"{u}rzt. Die Wahrscheinlichkeit bezieht sich auf die komplette Simulationsdauer. Bei einer Einstellung von \textit{100} Prozent und der Simulationsdauer von \textit{15} Sekunden st\"{u}rzt der Prozess auf jeden Fall zwischen \textit{0ms} und \textit{15000ms} ab. An welcher Stelle dies geschieht wird zuf\"{a}llig bestimmt. Wenn der Prozess nach seinem Absturz wiederbelebt wird, st\"{u}rzt er nicht noch einmal zuf\"{a}llig ab. Dies gilt allerdings nicht, wenn die Prozesseinstellungen nach dem Zufallsabsturz erneut ge\"{a}ndert und \"{u}bernommen werden, da dann das Zufallsabst\"{u}rzereignis erneut erstellt wird.
\item \textbf{Lokale Zeit} \textit{(Long: 0)}: Gibt die lokale Prozesszeit in Millisekunden an.
\item \textbf{Nachrichtenverlustwahrscheinlichkeit} \textit{(Integer: 0)}: Gibt eine Wahrscheinlichkeit in Prozent an, ob eine vom aktuell ausgew\"{a}hlten Prozess verschickte Nachricht unterwegs verloren geht. An welcher Stelle die Nachricht zwischen dem Sende- und Empfangsprozess verloren geht wird vom Simulator zuf\"{a}llig gew\"{a}hlt.
\item \textbf{Maximale \"{U}bertragungszeit} \textit{(Long: 2000)}: Gibt die Dauer in Millisekunden an, die eine vom Prozess verschickte Nachricht maximal ben\"{o}tigt, bis sie einen Empf\"{a}ngerprozess erreicht. Im weiteren Verlauf wird dieser Wert mit $t_{max}$ bezeichnet. Der tats\"{a}chlich verwendete Wert wird zuf\"{a}llig zwischen der minimalen- und der maximalen Zeit (jeweils inklusive) gew\"{a}hlt.
@@ -308,7 +311,7 @@ Jeder Prozess besitzt folgende Variablen, die entweder via dem Variablen-Tab in \end{itemize}
-Im selben Fenster lassen sich auch die Protokollvariablen editieren. Die Protokollvariablen werden jedoch sp\"{a}ter in der Protokollsektion beschrieben.
+Im selben Fenster lassen sich auch die Protokollvariablen editieren. Die Protokollvariablen werden jedoch sp\"{a}ter bei den Protokollen beschrieben.
\subsection{Einstellungen im Expertenmodus}
@@ -318,32 +321,32 @@ Im selben Fenster lassen sich auch die Protokollvariablen editieren. Die Protoko \begin{tabular}{l|l}
\textbf{Schl\"{u}ssel} & \textbf{Beschreibung}\\
\hline
- \texttt{col.background} & Die Hintergrundfarbe der Simulation\\
- \texttt{col.message.arrived} & Nachrichtenfarbe wenn sie ihr Ziel erreicht hat\\
- \texttt{col.message.lost} & Nachrichtenfarbe wenn sie verloren ging\\
- \texttt{col.message.sending} & Nachrichtenfarbe wenn sie noch unterwegs ist\\
- \textbf{\texttt{col.process.crashed}} & Prozessfarbe wenn er abgest\"{u}rzt ist\\
- \textbf{\texttt{col.process.default}} & Prozessfarbe wenn die Simulation aktuell nicht l\"{a}uft und \\
+ \textit{col.background} & Die Hintergrundfarbe der Simulation\\
+ \textit{col.message.arrived} & Nachrichtenfarbe wenn sie ihr Ziel erreicht hat\\
+ \textit{col.message.lost} & Nachrichtenfarbe wenn sie verloren ging\\
+ \textit{col.message.sending} & Nachrichtenfarbe wenn sie noch unterwegs ist\\
+ \textbf{\textit{col.process.crashed}} & Prozessfarbe wenn er abgest\"{u}rzt ist\\
+ \textbf{\textit{col.process.default}} & Prozessfarbe wenn die Simulation aktuell nicht l\"{a}uft und \\
& der Prozess aktuell nicht abgest\"{u}rzt ist \\
- \textbf{\texttt{col.process.highlight}} & Prozessfarbe wenn die Maus \"{u}ber seinem Balken liegt\\
- \texttt{col.process.line} & Farbe, in der die kleine ``Prozessfane'' an der auch die \\
+ \textbf{\textit{col.process.highlight}} & Prozessfarbe wenn die Maus \"{u}ber seinem Balken liegt\\
+ \textit{col.process.line} & Farbe, in der die kleine ``Prozessfane'' an der auch die \\
& lokale Prozesszeit angegeben wird, dargestellt wird\\
- \textbf{\texttt{col.process.running}} & Prozessfarbe wenn er nicht abgest\"{u}rzt ist und die\\
+ \textbf{\textit{col.process.running}} & Prozessfarbe wenn er nicht abgest\"{u}rzt ist und die\\
& Simulation aktuell l\"{a}uft\\
- \texttt{col.process.secondline} & Farbe in der die Sekunden-Zeitgitter dargestellt werden \\
- \texttt{col.process.sepline} & Farbe der globalen Zeitachse\\
- \textbf{\texttt{col.process.stopped}} & Prozessfarbe wenn die Simulation pausiert wurde\\
+ \textit{col.process.secondline} & Farbe in der die Sekunden-Zeitgitter dargestellt werden \\
+ \textit{col.process.sepline} & Farbe der globalen Zeitachse\\
+ \textbf{\textit{col.process.stopped}} & Prozessfarbe wenn die Simulation pausiert wurde\\
\end{tabular}
}
\caption{Farbeinstellungen}
\label{tb:Farbeinstellungen}
\end{table}
-Im Expertenmodus lassen sich zus\"{a}tzliche Variablen, wie beispielsweise diverse Farbwerte und Anzahl der Pixel verschiedener der GUI-Elemente, editieren. Auf Abbildung \ref{fig:SimulationseinstellungenExperten} sieht der Anwender alle einstellbaren Farben. Die fett-gedruckten Schl\"{u}ssel in Tabelle \ref{tb:Farbeinstellungen} dienen nur als Standardwerte f\"{u}r die neu zu erstellenen Prozesse und sind auch jeweils in den Prozesseinstellungen separat editierbar.
+Im Expertenmodus lassen sich zus\"{a}tzliche Variablen, wie beispielsweise diverse Farbwerte und Anzahl oder Pixel verschiedener der GUI-Elemente, editieren. Auf Abbildung \ref{fig:SimulationseinstellungenExperten} sieht der Anwender alle einstellbaren Farben. Die fett-gedruckten Schl\"{u}ssel in Tabelle \ref{tb:Farbeinstellungen} dienen nur als Standardwerte f\"{u}r die neu zu erstellenen Prozesse und sind auch jeweils in den Prozesseinstellungen f\"{u}r jeden Prozess separat editierbar.
\section{Protokolle}
-Im Folgenden werden alle verf\"{u}gbaren Protokolle behandelt. Wie bereits beschrieben wird bei Protokollen zwischen Server- und Clientseite unterschieden. Server k\"{o}nnen auf Clientnachrichten, und Client auf Servernachrichten antworten. Jeder Prozess kann beliebig viele Protokolle sowohl Clientseitig als auch Serverseitig untest\"{u}tzen. Theoretisch ist es auch m\"{o}glich, dass ein Prozess f\"{u}r ein bestimmtes Protokoll gleichzeitig Server und Client ist. Der Anwender kann auch weitere eigene Protokolle in der Programmiersprache Java mittels einer speziellen API (Application Programming Interface) erstellen. Wie eigene Protokolle erstellt werden k\"{o}nnen wird sp\"{a}ter behandelt.
+Im Folgenden werden alle verf\"{u}gbaren Protokolle behandelt. Wie bereits beschrieben wird bei Protokollen zwischen Server- und Clientseite unterschieden. Server k\"{o}nnen auf Clientnachrichten, und Client auf Servernachrichten antworten. Jeder Prozess kann beliebig viele Protokolle sowohl clientseitig als auch serverseitig unterst\"{u}tzen. Theoretisch ist es auch m\"{o}glich, dass ein Prozess f\"{u}r ein bestimmtes Protokoll gleichzeitig der Server und der Client ist. Der Anwender kann auch weitere eigene Protokolle in der Programmiersprache Java mittels einer speziellen API (Application Programming Interface) erstellen. Wie eigene Protokolle erstellt werden k\"{o}nnen wird sp\"{a}ter behandelt.
\subsection{Beispiel (Dummy) Protokoll}
@@ -374,7 +377,7 @@ Das Dummy-Protokoll dient lediglich als leeres Template f\"{u}r die Erstellung e \end{table}
-Bei dem Ping-Pong Protokoll (Abbildung \ref{fig:PingPongProto}) werden zwischen zwei Prozessen, Client P1 und Server P2, st\"{a}ndig Nachrichten hin- und hergeschickt. Der Ping-Pong Client startet die erste Anfrage, worauf der Server dem Client antwortet. Auf diese Antwort wird vom Client wiederum geantwortet und so weiter. Jeder Nachricht wird ein Z\"{a}hler mitgeschickt, der bei jeder Station um eins inkrementiert- und jeweils im Loggfenster protokolliert wird. In Tabelle \ref{tb:PingPongTasks} sind alle f\"{u}r dieses Beispiel programmierten Ereignisse aufgef\"{u}hrt! Wichtig ist, dass Prozess 1 seinen Ping-Pong Client aktiviert, bevor er eine Ping-Pong Clientanfrage startet! Wenn die Eintrittszeiten f\"{u}r Aktivierung und das Starten der Anfrage identisch sind, so ordnet der Ereigniseditor diese Ereignisse automatisch in der richtigen Reihenfolge an. Wenn der Ping-Pong Client nicht aktiviert werden w\"{u}rde, dann k\"{o}nnte P1 auch keine Ping-Pong Anfrage starten. Der Prozess muss das jeweilige Protokoll unterst\"{u}tzen bevor er eine Anfrage starten kann. Dies gilt nat\"{u}rlich f\"{u}r alle anderen Protokolle analog. Anhand dieses Beispiels ist auch erkennbar, dass die noch nicht ausgelieferte Nachrichten g\"{u}n eingef\"{a}rbt ist. Alle ausgelieferten Nachrichten tragen bereits die Farbe Blau.
+Bei dem Ping-Pong Protokoll (Abbildung \ref{fig:PingPongProto}) werden zwischen zwei Prozessen, Client P1 und Server P2, st\"{a}ndig Nachrichten hin- und hergeschickt. Der Ping-Pong Client startet die erste Anfrage, worauf der Server dem Client antwortet. Auf diese Antwort wird vom Client ebenfalls geantwortet und so weiter. Jeder Nachricht wird ein Z\"{a}hler mitgeschickt, der bei jeder Station um eins inkrementiert- und jeweils im Loggfenster protokolliert wird. In Tabelle \ref{tb:PingPongTasks} sind alle f\"{u}r dieses Beispiel programmierten Ereignisse aufgef\"{u}hrt. Wichtig ist, dass Prozess 1 seinen Ping-Pong Client aktiviert, bevor er eine Ping-Pong Clientanfrage startet! Wenn die Eintrittszeiten f\"{u}r die Aktivierung des Protokolls und das Starten der Anfrage identisch sind, so ordnet der Task-Manager (mehr dazu sp\"{a}ter) diese Ereignisse automatisch in der richtigen Reihenfolge an. Wenn der Ping-Pong Client nicht aktiviert werden w\"{u}rde, dann k\"{o}nnte P1 auch keine Ping-Pong Anfrage starten. Bevor ein Prozess eine Anfrage starten kann, muss er das dazugeh\"{o}rige Protokoll unterst\"{u}tzen beziehungsweise aktiviert haben. Dies gilt nat\"{u}rlich f\"{u}r alle anderen Protokolle analog. Anhand diesem Beispiel ist erkennbar, dass die noch nicht ausgelieferte Nachrichten gr\"{u}n eingef\"{a}rbt ist. Alle ausgelieferten Nachrichten tragen bereits die Farbe Blau.
\begin{figure}[htbp]
\centering
@@ -383,7 +386,7 @@ Bei dem Ping-Pong Protokoll (Abbildung \ref{fig:PingPongProto}) werden zwischen \label{fig:PingPongSturmProto}
\end{figure}
-Werden die Ereignisse wie in Tabelle \ref{tb:PingPongSturmTasks} abge\"{a}ndert, so l\"{a}sst sich ein Ping-Pong Sturm realisieren. Dort wurde ein neuer Prozess 3 eingef\"{u}hrt, der als zus\"{a}tzlicher Ping-Pong Server agiert. Als Resultat verdoppelt sich die Anzahl der kursierenden Nachrichten bei jedem Ping-Pong Durchgang, da auf jede Clientnachricht stets 2 Serverantworten verschickt werden. Auf Abbildung \ref{fig:PingPongSturmProto} ist der dazugeh\"{o}rige Simulationsverlauf dargestellt.
+Werden die Ereignisse wie in Tabelle \ref{tb:PingPongSturmTasks} abge\"{a}ndert, so l\"{a}sst sich ein Ping-Pong Sturm realisieren. Dort wurde ein neuer Prozess 3 eingef\"{u}hrt, der als zus\"{a}tzlicher Ping-Pong Server agiert. Da auf jede Clientnachricht stets zwei Serverantworten folgen, verdoppelt sich bei jedem Ping-Pong Durchgang die Anzahl der kursierenden Nachrichten. Auf Abbildung \ref{fig:PingPongSturmProto} ist der dazugeh\"{o}rige Simulationsverlauf bis zum Zeitpunkt \textit{12676ms} dargestellt.
\begin{table}
\centering
@@ -401,16 +404,16 @@ Werden die Ereignisse wie in Tabelle \ref{tb:PingPongSturmTasks} abge\"{a}ndert, \label{tb:PingPongSturmTasks}
\end{table}
-\subsection{Das Broadcast-Sturm Protokoll}
+\subsection{Das Broadcast Protokoll}
\begin{figure}[htbp]
\centering
\fbox{\includegraphics[width=10cm]{images/ss-protokoll-broadcast-sturm}}
- \caption{Das Broadcast-Sturm Protokoll}
+ \caption{Das Broadcast Protokoll}
\label{fig:BroadcastSturmProto}
\end{figure}
-Das Broadcast-Sturm Protokoll verh\"{a}lt sich \"{a}hnlich wie das Ping-Pong Protokoll. Der Unterschied besteht darin, dass sich das Protokoll anhand einer eindeutigen Broadcast-ID merkt, welche Nachrichten bereits verschickt wurden. Das Broadcast-Sturm Protokoll (Server- und Clientseitig) verschickt alle erhaltenen Nachrichten, sofern sie vom jeweiligen Prozess noch nicht schon einmal verschickt wurden, erneut. Somit l\"{a}sst sich, unter Verwendung mehrerer Prozesse (hier 6), wie auf Abbildung \ref{fig:BroadcastSturmProto}, ein Broadcast-Sturm erzeugen. P1 ist der Client und startet je eine Anfrage nach \texttt{0ms} und \texttt{2500ms}. Die Simulationsdauer betr\"{a}gt hier genau \texttt{5000ms}. Da ein Client nur Servernachrichten und ein Server nur Clientnachrichten empfangen kann, ist in dieser Simulation jeder Prozess, wie in Tabelle \ref{tb:BroadcastSturmTasks} angegeben, gleichzeitig Server und Client.
+Das Broadcast Protokoll verh\"{a}lt sich \"{a}hnlich wie das Ping-Pong Protokoll. Der Unterschied besteht darin, dass sich das Protokoll anhand einer eindeutigen Broadcast-ID merkt, welche Nachrichten bereits verschickt wurden. Das Broadcast Protokoll (server- und clientseitig) verschickt alle erhaltenen Nachrichten, sofern sie vom jeweiligen Prozess noch nicht schon einmal verschickt wurden, erneut. Der Server und der Client unterscheiden sich in diesem Fall nicht und f\"{u}hren bei Ankunft einer Nachricht jeweis die selben Aktionen durch. Somit l\"{a}sst sich, unter Verwendung mehrerer Prozesse (hier 6), wie auf Abbildung \ref{fig:BroadcastSturmProto}, ein Broadcast erzeugen. P1 ist der Client und startet je eine Anfrage nach \textit{0ms} und \textit{2500ms}. Die Simulationsdauer betr\"{a}gt hier genau \textit{5000ms}. Da ein Client nur Servernachrichten und ein Server nur Clientnachrichten empfangen kann, ist in dieser Simulation jeder Prozess, wie in Tabelle \ref{tb:BroadcastSturmTasks} angegeben, gleichzeitig Server und Client.
\begin{table}
\centering
@@ -418,23 +421,23 @@ Das Broadcast-Sturm Protokoll verh\"{a}lt sich \"{a}hnlich wie das Ping-Pong Pro \begin{tabular}{c|c|l}
\textbf{Zeit (ms)} & \textbf{PID} & \textbf{Ereignis} \\
\hline
- 0000 & 1 & Broadcaststurn Client aktivieren\\
- 0000 & 2 & Broadcaststurn Client aktivieren\\
- 0000 & 3 & Broadcaststurn Client aktivieren\\
- 0000 & 4 & Broadcaststurn Client aktivieren\\
- 0000 & 5 & Broadcaststurn Client aktivieren\\
- 0000 & 6 & Broadcaststurn Client aktivieren\\
- 0000 & 1 & Broadcaststurn Server aktivieren\\
- 0000 & 2 & Broadcaststurn Server aktivieren\\
- 0000 & 3 & Broadcaststurn Server aktivieren\\
- 0000 & 4 & Broadcaststurn Server aktivieren\\
- 0000 & 5 & Broadcaststurn Server aktivieren\\
- 0000 & 6 & Broadcaststurn Server aktivieren\\
- 0000 & 1 & Broadcaststurn Clientanfrage starten\\
- 2500 & 1 & Broadcaststurn Clientanfrage starten
+ 0000 & 1 & Broadcast Client aktivieren\\
+ 0000 & 2 & Broadcast Client aktivieren\\
+ 0000 & 3 & Broadcast Client aktivieren\\
+ 0000 & 4 & Broadcast Client aktivieren\\
+ 0000 & 5 & Broadcast Client aktivieren\\
+ 0000 & 6 & Broadcast Client aktivieren\\
+ 0000 & 1 & Broadcast Server aktivieren\\
+ 0000 & 2 & Broadcast Server aktivieren\\
+ 0000 & 3 & Broadcast Server aktivieren\\
+ 0000 & 4 & Broadcast Server aktivieren\\
+ 0000 & 5 & Broadcast Server aktivieren\\
+ 0000 & 6 & Broadcast Server aktivieren\\
+ 0000 & 1 & Broadcast Clientanfrage starten\\
+ 2500 & 1 & Broadcast Clientanfrage starten
\end{tabular}
}
- \caption{Programmierte Broadcast-Sturm Ereignisse}
+ \caption{Programmierte Broadcast Ereignisse}
\label{tb:BroadcastSturmTasks}
\end{table}
@@ -447,7 +450,7 @@ Das Broadcast-Sturm Protokoll verh\"{a}lt sich \"{a}hnlich wie das Ping-Pong Pro \label{fig:TimeSyncProto}
\end{figure}
-Bisher haben wir uns nur mit Protokollen besch\"{a}ftigt, in denen die beteiligten Prozesse keine Uhrabweichung hatten. Das Protokoll zur internen Synchronisierung ist ein Protokoll zur Synchronisierung der lokalen Prozesszeit, welches beispielsweise angewandt werden kann, wenn eine Prozesszeit aufgrund einer Uhrabweichung falsch geht. Wenn der Client seine falsche lokale Zeit $t_c$ mit einem Server synchronisieren m\"{o}chte, so schickt er ihm eine Clientanfrage. Der Server schickt als Antwort seine eigene lokale Prozesszeit $t_s$ zur\"{u}ck, womit der Client seine neue und genauere Prozesszeit berechnen kann. Wie genau die neue Prozesszeit berechnet wird, wird im Folgenden beschrieben.
+Bisher wurden nur Protokolle vorgef\"{u}hrt, in denen die beteiligten Prozesse keine Uhrabweichung eingestellt hatten. Das Protokoll zur internen Synchronisierung ist ein Protokoll zur Synchronisierung der lokalen Prozesszeit, welches beispielsweise angewendet werden kann, wenn eine Prozesszeit aufgrund einer Uhrabweichung falsch geht. Wenn der Client seine falsche lokale Zeit $t_c$ mit einem Server synchronisieren m\"{o}chte, so schickt er ihm eine Clientanfrage. Der Server schickt als Antwort seine eigene lokale Prozesszeit $t_s$ zur\"{u}ck, womit der Client seine neue und genauere Prozesszeit berechnen kann. Wie genau die neue Prozesszeit berechnet wird, wird im Folgenden beschrieben.
\begin{table}
\centering
@@ -474,7 +477,7 @@ Hier (Abbildung \ref{fig:TimeSyncProto}) stellt P1 den Client und P2 den Server Somit wurde die lokale Zeit von P1, bis auf einen Fehler von $< \frac{1}{2} (t'_{max} - t'_{min})$, synchronisiert.
-Der Clientprozess hat in der Abbildung \ref{fig:TimeSyncProto} als Uhrabweichung den Wert \texttt{0.1} und der Server hat als Uhrabweichung den Wert \texttt{0.0} konfiguriert. Der Client startet, wie in Tabelle \ref{tb:InterneSyncTasks} angegeben, nach \texttt{0ms}, \texttt{5000ms} und \texttt{10000ms} seiner lokalen Prozesszeit jeweils eine Clientanfrage. In der Abbildung l\"{a}sst sich erkennen, dass die 2. und die 3. Anfrage nicht synchron zu der globalen Zeit (Sekunden-Gatter) gestartet werden, was auf die Uhrabweichung von P1 zur\"{u}ckzuf\"{u}hren ist. Nach Simulationsende ist die Zeit von P1 bis auf \texttt{15000ms} - \texttt{15976ms} = \texttt{-976ms} synchronisiert.
+Der Clientprozess hat in der Abbildung \ref{fig:TimeSyncProto} als Uhrabweichung den Wert \textit{0.1} und der Server hat als Uhrabweichung den Wert \textit{0.0} konfiguriert. Der Client startet, wie in Tabelle \ref{tb:InterneSyncTasks} angegeben, nach \textit{0ms}, \textit{5000ms} und \textit{10000ms} seiner lokalen Prozesszeit jeweils eine Clientanfrage. In der Abbildung l\"{a}sst sich erkennen, dass die 2. und die 3. Anfrage nicht synchron zu der globalen Zeit (siehe Sekunden-Gatter) gestartet werden, was auf die Uhrabweichung von P1 zur\"{u}ckzuf\"{u}hren ist. Nach Simulationsende ist die Zeit von P1 bis auf \textit{15000ms} - \textit{15976ms} = \textit{-976ms} synchronisiert.
\subsubsection{Protokollvariablen}
@@ -485,7 +488,7 @@ Dieses Protokoll verwendet folgende zwei clientseitige Variablen, die in den Pro \item \textbf{Max. \"{U}bertragungszeit} \textit{(Long: 2000)}: Gibt den Wert $t'_{max}$ in Millisekunden an
\end{itemize}
-$t'_{min}$ und $t'_{max}$ sind die bei den Protokollberechnungen verwendeten Werte. Sie k\"{o}nnen sich allerdings von den tats\"{a}chlichen Nachrichten\"{u}bertragungszeiten $t_{min}$ und $t_{max}$ (siehe Sektion \"{u}ber Prozesseinstellungen) unterscheiden. Somit lassen sich auch Szenarien simulieren, in denen das Protokoll falsch eingestellt wurde und wo in der Zeitsynchronisation gr\"{o}ßere Fehler auftreten k\"{o}nnen.
+$t'_{min}$ und $t'_{max}$ sind die bei den Protokollberechnungen verwendeten Werte. Sie k\"{o}nnen sich allerdings von den tats\"{a}chlichen Nachrichten\"{u}bertragungszeiten $t_{min}$ und $t_{max}$ (siehe Sektion \"{u}ber Prozesseinstellungen) unterscheiden. Somit lassen sich auch Szenarien simulieren, in denen das Protokoll falsch eingestellt wurde und wo in der Zeitsynchronisierung gr\"{o}ßere Fehler auftreten k\"{o}nnen.
\subsection{Christians Methode zur externen Synchronisierung}
@@ -498,7 +501,7 @@ $t'_{min}$ und $t'_{max}$ sind die bei den Protokollberechnungen verwendeten Wer Ein weiteres Protokoll f\"{u}r die Synchronisierung von Uhrzeiten funktioniert nach der Christians Methode zur externen Synchronisierung. Die Christians Methode benutzt die RTT (Round Trip Time) $t_{rtt}$, um die \"{U}bertragungszeiten von einzelnen Nachrichten zu approximieren.
-Wenn der Client seine lokale Zeit $t_c$ bei einem Server synchronisieren m\"{o}chte, so verschickt er eine Anfrage, und misst dabei bis zur Ankunft der Serverantwort die dazugeh\"{o}rige RTT $t_{rtt}$. Die Serverantwort beinhaltet die lokale Prozesszeit $t_s$ vom Server von dem Zeitpunkt, als der Server die Antwort verschickte. Der Client setzt dann seine lokale Zeit neu mit
+Wenn der Client seine lokale Zeit $t_c$ bei einem Server synchronisieren m\"{o}chte, so verschickt er eine Anfrage, und misst dabei bis zur Ankunft der Serverantwort die dazugeh\"{o}rige RTT $t_{rtt}$. Die Serverantwort beinhaltet die lokale Prozesszeit $t_s$ vom Server von dem Zeitpunkt, als der Server die Antwort verschickte. Der Client setzt dann seine lokale Zeit neu auf:
\begin{equation*}
t_c := t_s + \frac{1}{2} t_{rtt}
@@ -506,9 +509,9 @@ Wenn der Client seine lokale Zeit $t_c$ bei einem Server synchronisieren m\"{o}c und zwar mit einer Genauigkeit von $\pm(\frac{1}{2} t_{rtt} - u_{min}$) wenn $u_{min}$ eine Schranke f\"{u}r eine Nachrichten\"{u}bertragung mit $t_{rtt} < u_{min}$ ist (siehe \cite{Vorlesung}).
-Im Prinzip sieht eine Christians-Simulation so aus wie auf Abbildung \ref{fig:TimeSyncProto}, daher wird hier auf eine einfache Abbildung vom Christians-Protokoll verzichtet. Viel Interessanter ist der direkte Vergleich zwischen dem Protokoll zur internen Synchronisierung und der Christians Methode der externen Synchronisierung (Abbildung \ref{fig:TimeSync2Proto}). Hier stellt P1 den Client zur internen Synchronisierung und P3 den Client zur externen Synchronisierung dar. P2 fungiert f\"{u}r beide Protokolle gleichzeitig als Server. P1 und P3 starten jeweils zu den lokalen Prozesszeiten \texttt{0ms}, \texttt{5000ms} und \texttt{10000ms} eine Clientanfrage (Tabelle \ref{tb:InterneSync2Tasks}). P1 und P3 haben als Uhrabweichung \texttt{0.1} eingestellt und die Simulationsdauer betr\"{a}gt insgesamt \texttt{15000ms}.
+Im Prinzip sieht eine Christians-Simulation so aus wie auf Abbildung \ref{fig:TimeSyncProto}, daher wird hier auf eine einfache Abbildung vom Christians-Protokoll verzichtet. Viel Interessanter ist der direkte Vergleich zwischen dem Protokoll zur internen Synchronisierung und der Christians Methode der externen Synchronisierung (Abbildung \ref{fig:TimeSync2Proto}). Hier stellt P1 den Client zur internen Synchronisierung und P3 den Client zur externen Synchronisierung dar. P2 fungiert f\"{u}r beide Protokolle gleichzeitig als Server. P1 und P3 starten jeweils zu den lokalen Prozesszeiten \textit{0ms}, \textit{5000ms} und \textit{10000ms} eine Clientanfrage (Tabelle \ref{tb:InterneSync2Tasks}). P1 und P3 haben als Uhrabweichung \textit{0.1} eingestellt und die Simulationsdauer betr\"{a}gt insgesamt \textit{15000ms}.
-Auf der Abbildung \ref{fig:TimeSync2Proto} ist ablesbar, dass nach Ablauf der Simulation P1 seine Zeit bis auf \texttt{15000ms} - \texttt{14567ms} = \texttt{433ms} und P3 seine Zeit bis auf \texttt{15000ms} - \texttt{15539ms} = \texttt{-539ms} synchronisiert hat. In diesem Beispiel hat also das Protokoll zur internen Synchronisierung ein besseres Ergebnis geliefert. Dies ist allerdings nicht zwingend immer der Fall, da nach einer erneuten Ausf\"{u}hrung alle Nachrichten jeweils eine neue zuf\"{a}llige \"{U}bertragungszeit zwischen $t_{min}$ und $t_{max}$ haben werden, die auf das eine oder andere Protokoll wieder andere Auswirkungen haben k\"{o}nnen.
+Auf der Abbildung \ref{fig:TimeSync2Proto} ist ablesbar, dass nach Ablauf der Simulation P1 seine Zeit bis auf \textit{15000ms} - \textit{14567ms} = \textit{433ms} und P3 seine Zeit bis auf \textit{15000ms} - \textit{15539ms} = \textit{-539ms} synchronisiert hat. In diesem Beispiel hat also das Protokoll zur internen Synchronisierung ein besseres Ergebnis geliefert. Dies ist allerdings nicht zwingend immer der Fall, da nach einer erneuten Ausf\"{u}hrung alle Nachrichten jeweils eine neue zuf\"{a}llige \"{U}bertragungszeit zwischen $t_{min}$ und $t_{max}$ haben werden, die auf das eine oder andere Protokoll wieder andere Auswirkungen haben k\"{o}nnen.
\begin{table}
\centering
@@ -541,7 +544,7 @@ Auf der Abbildung \ref{fig:TimeSync2Proto} ist ablesbar, dass nach Ablauf der Si \label{fig:BerkeleyProto}
\end{figure}
-Der Berkeley Algorithmus zur internen Synchronisierung ist eine weitere M\"{o}glichkeit lokale Uhrzeiten abzugleichen. Dies ist das erste Protokoll, wo der Server die initiale Anfrage startet. Der Server stellt den Koordinator des Protokolls dar. Die Clients sind somit passiv und m\"{u}ssen warten, bis eine Serveranfrage eintritt. Hierbei muss der Server wissen, welche Clientprozesse an dem Protokoll teilnehmen, was sich in den Prozesseinstellungen des Servers einstellen l\"{a}sst.
+Der Berkeley Algorithmus zur internen Synchronisierung ist eine weitere M\"{o}glichkeit lokale Uhrzeiten abzugleichen. Dies ist das erste Protokoll, wo der Server die Anfragen startet. Der Server stellt den Koordinator des Protokolls dar. Die Clients sind somit passiv und m\"{u}ssen warten, bis eine Serveranfrage eintrifft. Hierbei muss der Server wissen, welche Clientprozesse an dem Protokoll teilnehmen, was sich in den Protokolleinstellungen des Servers einstellen l\"{a}sst.
\begin{table}
\centering
@@ -577,9 +580,9 @@ Nachdem alle Antworten vorliegen, setzt er zun\"{a}chst seine eigene Zeit $t_s$ t_s := t_{avg}
\end{equation*}
-Anschließend berechnet der Server f\"{u}r jeden Client einen Korrekturwert $k_i := t_{avg} - t_i$, den er jeweils in einer separaten Nachricht zur\"{u}ckschickt. Die Clients setzten dann jeweils die lokale Prozesszeit auf $t'_i := t'_i + k_i$. Hierbei stellt $t'_i$ die derzeit aktuelle Prozesszeit des jeweiligen Clients dar. Denn bis zum Eintreffen des Korrekturwertes ist inzwischen wieder Zeit verstrichen.
+Anschließend berechnet der Server f\"{u}r jeden Client einen Korrekturwert $k_i := t_{avg} - t_i$, den er jeweils in einer separaten Nachricht zur\"{u}ckschickt. Die Clients setzten dann jeweils die lokale Prozesszeit auf $t'_i := t'_i + k_i$. Hierbei stellt $t'_i$ die derzeit aktuelle Prozesszeit des jeweiligen Clients dar. Denn bis zum Eintreffen des Korrekturwertes ist inzwischen wieder neue Zeit verstrichen.
-Im Beispiel auf Abbildung \ref{fig:BerkeleyProto} gibt es die 2 Clientprozesse P1 und P3 sowie den Serverprozess P2. Der Server startet nach jeweils \texttt{0ms} und \texttt{7500ms} eine Synchronisationsanfrage (Tabelle \ref{tb:BerkeleyTasks}). Hier f\"{a}llt auf, dass der Server stets 2 Korrekturwerte verschickt, die jeweils P1 und P3 erreichen. Es werden hier also pro Synchronisierungsvorgang insgesamt 4 Korrekturwerte ausgeliefert. Eine Korrekturnachricht enth\"{a}lt neben dem Korrekturwert $k_i$ auch die PID des Prozesses, f\"{u}r den die Nachricht bestimmt ist. Indem das Protokoll die PID \"{u}berprf\"{u}ft verarbeitet ein Client so nur die f\"{u}r ihn bestimmten Korrekturwerte.
+Im Beispiel auf Abbildung \ref{fig:BerkeleyProto} gibt es die 2 Clientprozesse P1 und P3 sowie den Serverprozess P2. Der Server startet nach jeweils \textit{0ms} und \textit{7500ms} eine Synchronisierungsanfrage (Tabelle \ref{tb:BerkeleyTasks}). Hier f\"{a}llt auf, dass der Server stets 2 Korrekturwerte verschickt, die jeweils P1 und P3 erreichen. Es werden hier also pro Synchronisierungsvorgang insgesamt 4 Korrekturwerte ausgeliefert. Eine Korrekturnachricht enth\"{a}lt neben dem Korrekturwert $k_i$ auch die PID des Prozesses, f\"{u}r den die Nachricht bestimmt ist. Indem das Protokoll die PID \"{u}berprf\"{u}ft verarbeitet ein Client so nur die f\"{u}r ihn bestimmten Korrekturwerte.
\subsubsection{Protokollvariablen}
@@ -598,9 +601,9 @@ Dieses Protokoll verwendet folgende serverseitige Variable, die in den Prozessei \label{fig:OnePhaseCommitProto}
\end{figure}
-Das Ein-Phasen Commit Protokoll ist daf\"{u}r da, beliebig vielen Clients zu einer Festschreibung zu bewegen. Im realen Leben k\"{o}nnte dies beispielsweise das Erstellen oder L\"{o}schen einer Datei sein, von der auf jedem Client eine lokale Kopie existiert. Der Server ist der Koordinator und auch derjenige, der einen Festschreibewunsch initiiert. Hierbei verschickt der Server periodisch so oft den Festschreibewunsch, bis er von jedem Client eine Best\"{a}tigung erhalten hat. Der Server muss dabei die PIDs aller beteiligten Clientprozesse sowie einen Wecker f\"{u}r erneutes Versenden des Festschreibewunsches eingestellt bekommen.
+Das Ein-Phasen Commit Protokoll ist daf\"{u}r gedacht beliebig vielen Clients zu einer Festschreibung zu bewegen. Im realen Leben k\"{o}nnte dies beispielsweise das Erstellen oder L\"{o}schen einer Datei sein, von der auf jedem Client eine lokale Kopie existiert. Der Server ist der Koordinator und auch derjenige, der einen Festschreibewunsch initiiert. Hierbei verschickt der Server periodisch so oft den Festschreibewunsch, bis er von jedem Client eine Best\"{a}tigung erhalten hat. Der Server muss dabei die PIDs aller beteiligten Clientprozesse sowie einen Wecker f\"{u}r erneutes Versenden des Festschreibewunsches eingestellt bekommen.
-Die programmierten Ereignisse des Beispiels auf Abbildung \ref{fig:OnePhaseCommitProto} sind in Tabelle \ref{tb:OnePhaseCommitTasks} aufgelistet. P1 und P3 simulieren jeweils einen Client und P2 den Server. Damit die Simulation mehrere Festschreibew\"{u}nsche verschickt, st\"{u}rzt in der Simulation P1 nach \texttt{1000ms} ab und nach \texttt{5000ms} steht er wieder zur Verf\"{u}gung. Die ersten beide Festschreibew\"{u}nsche erreichen dadurch P1 nicht und erst der dritte Versuch verl\"{a}uft erfolgreich. Bevor die Best\"{a}tigung von P1 bei P2 eintrifft, l\"{a}uft jedoch der Wecker erneut ab, so dass ein weiterer Festschreibewunsch versendet wird. Da P1 und P3 jeweils schon eine Best\"{a}tigung verschickt haben, wird diese Festschreibewunschnachricht ignoriert.
+Die programmierten Ereignisse des Beispiels auf Abbildung \ref{fig:OnePhaseCommitProto} sind in Tabelle \ref{tb:OnePhaseCommitTasks} aufgelistet. P1 und P3 simulieren jeweils einen Client und P2 den Server. Damit die Simulation mehrere Festschreibew\"{u}nsche verschickt, st\"{u}rzt in der Simulation P1 nach \textit{1000ms} ab und nach \textit{5000ms} steht er wieder zur Verf\"{u}gung. Die ersten beide Festschreibew\"{u}nsche erreichen dadurch P1 nicht und erst der dritte Versuch verl\"{a}uft erfolgreich. Bevor die Best\"{a}tigung von P1 bei P2 eintrifft, l\"{a}uft jedoch der Wecker erneut ab, so dass ein weiterer Festschreibewunsch versendet wird. Da P1 und P3 jeweils schon eine Best\"{a}tigung verschickt haben, wird diese Festschreibewunschnachricht ignoriert. Jeder Client best\"{a}tigt auf einen Festschreibewunsch nur ein einziges Mal.
\begin{table}
\centering
@@ -638,7 +641,7 @@ Dieses Protokoll verwendet folgende serverseitige Variablen, die in den Prozesse \label{fig:TwoPhaseCommitProto}
\end{figure}
-Das Zwei-Phasen Commit Protokoll ist eine Erweiterung des Ein-Phasen Commit Protokolls. Der Server startet zun\"{a}chst eine Anfrage an alle beteiligten Clients, ob festgeschrieben werden soll. Jeder Client antwortet dann mit \texttt{true} oder \texttt{false}. Der Server fragt so oft periodisch nach, bis alle Ergebnisse aller Clients vorliegen. Nach Erhalt aller Abstimmungen \"{u}berpr\"{u}ft der Server, ob alle mit \texttt{true} abgestimmt haben. F\"{u}r den Fall dass mindestens ein Client mit \texttt{false} abgestimmt hat, wird der Festschreibevorgang abgebrochen und als globales Abstimmungsergebnis \texttt{false} verschickt. Wenn jedoch alle mit \texttt{true} abstimmten, soll festgeschrieben werden. Dabei wird das globale Abstimmungsergebnis \texttt{true} verschickt. Das globale Abstimmungsergebnis wird periodisch so oft erneut verschickt, bis von jedem Client eine Best\"{a}tigung des Erhalts vorliegt.
+Das Zwei-Phasen Commit Protokoll ist eine Erweiterung des Ein-Phasen Commit Protokolls. Der Server startet zun\"{a}chst eine Anfrage an alle beteiligten Clients, ob festgeschrieben werden soll. Jeder Client antwortet dann mit \textit{true} oder \textit{false}. Der Server fragt so oft periodisch nach, bis alle Ergebnisse aller Clients vorliegen. Nach Erhalt aller Abstimmungen \"{u}berpr\"{u}ft der Server, ob alle mit \textit{true} abgestimmt haben. F\"{u}r den Fall dass mindestens ein Client mit \textit{false} abgestimmt hat, wird der Festschreibevorgang abgebrochen und als globales Abstimmungsergebnis \textit{false} verschickt. Wenn jedoch alle mit \textit{true} abstimmten, soll festgeschrieben werden. Dabei wird das globale Abstimmungsergebnis \textit{true} verschickt. Das globale Abstimmungsergebnis wird periodisch so oft erneut verschickt, bis von jedem Client eine Best\"{a}tigung des Erhalts vorliegt.
\begin{table}
\centering
@@ -656,7 +659,7 @@ Das Zwei-Phasen Commit Protokoll ist eine Erweiterung des Ein-Phasen Commit Prot \label{tb:TwoPhaseCommitTasks}
\end{table}
-In dem Beispiel (Abbildung \ref{fig:TwoPhaseCommitProto}) sind P1 und P3 Clients und P2 der Server. Der Server verschickt nach \texttt{0ms} seine initiale Anfrage (Tabelle \ref{tb:TwoPhaseCommitTasks}). Da diese Simulation recht un\"{u}bersichtlich ist, liegen in den Tabellen \ref{tb:TwoPhaseCommitLoggs} und \ref{tb:TwoPhaseCommitLoggs2} Ausz\"{u}ge aus dem Loggfenster vor. Auf die Lamport- und Vektorzeitstempel sowie die lokalen Prozesszeiten wurde hier wegen Irrelevanz verzichtet. Da keine Uhrabweichungen konfiguriert wurden, sind die lokalen Prozesszeiten stets gleich der globalen Zeit und deswegen wird hier pro Loggeintrag jeweils nur eine Zeit angegeben. Anhand der Nachrichten IDs lassen sich dort die einzelnen Sendungen zuordnen. In den Loggs wird auch st\"{a}ndig der Inhalt der verschickten Nachricht sowie die dazugeh\"{o}rigen Datentypen aufgef\"{u}hrt. Hier stimmen P1 und P3 jeweils mit \texttt{true}, d.h. es soll festgeschrieben werden, ab.
+In dem Beispiel (Abbildung \ref{fig:TwoPhaseCommitProto}) sind P1 und P3 Clients und P2 der Server. Der Server verschickt nach \textit{0ms} seine erste Anfrage (Tabelle \ref{tb:TwoPhaseCommitTasks}). Da diese Simulation recht un\"{u}bersichtlich ist, liegen in den Tabellen \ref{tb:TwoPhaseCommitLoggs} und \ref{tb:TwoPhaseCommitLoggs2} Ausz\"{u}ge aus dem Loggfenster vor. Auf die Lamport- und Vektorzeitstempel sowie die lokalen Prozesszeiten wurde hier wegen Irrelevanz verzichtet. Da keine Uhrabweichungen konfiguriert wurden, sind die lokalen Prozesszeiten stets gleich der globalen Zeit und deswegen wird hier pro Loggeintrag jeweils nur eine Zeit angegeben. Anhand der Nachrichten IDs lassen sich dort die einzelnen Sendungen zuordnen. In den Loggs wird auch st\"{a}ndig der Inhalt der verschickten Nachricht sowie die dazugeh\"{o}rigen Datentypen aufgef\"{u}hrt. Hier stimmen P1 und P3 jeweils mit \textit{true}, d.h. es soll festgeschrieben werden, ab.
\begin{table}
\centering
\fbox{
@@ -794,7 +797,7 @@ Dieses Protokoll verwendet folgende serverseitige Variablen, die in den Prozesse Und folgende Clientvariable kann unter den Prozesseinstellungen unter dem Punkt ``2-Phasen Commit Client'' konfiguriert werden:
\begin{itemize}
- \item \textbf{Festschreibwahrscheinlichkeit} \textit{(Integer: 50)}: Gibt die Wahrscheinlichkeit in Prozent an, die der Client mit \texttt{true}, also f\"{u}r das Festschreiben, abstimmt.
+ \item \textbf{Festschreibwahrscheinlichkeit} \textit{(Integer: 50)}: Gibt die Wahrscheinlichkeit in Prozent an, die der Client mit \textit{true}, also f\"{u}r das Festschreiben, abstimmt.
\end{itemize}
\subsection{Der ungen\"{u}gende (Basic) Multicast}
@@ -830,9 +833,9 @@ Und folgende Clientvariable kann unter den Prozesseinstellungen unter dem Punkt \end{table}
-Das Basic-Multicast Protokoll ist sehr einfach aufgebaut. Im Beispiel auf Abbildung \ref{fig:BasicMulticastProto} sind P1 und P3 Server und P2 der Client. Bei diesem Protokoll startet der Client immer die Anfrage, welche bei diesem Protokoll eine einfache Multicast-Nachricht darstellen soll. Die Basic-Multicast Server dienen lediglich f\"{u}r den Empfang einer Nachricht. Es werden keine Best\"{a}tigungen verschickt. Wie in Tabelle \ref{tb:BasicMulticastTasks} aufgef\"{u}hrt verschickt P2 alle \texttt{2500ms} jeweils eine Multicast-Nachricht, die alle voneinander v\"{o}llig unabh\"{a}ngig sind.
+Das Basic-Multicast Protokoll ist sehr einfach aufgebaut. Im Beispiel auf Abbildung \ref{fig:BasicMulticastProto} sind P1 und P3 Server und P2 der Client. Bei diesem Protokoll startet der Client immer die Anfrage, welche bei diesem Protokoll eine einfache Multicast-Nachricht darstellen soll. Die Basic-Multicast Server dienen lediglich f\"{u}r den Empfang einer Nachricht. Es werden keine Best\"{a}tigungen verschickt. Wie in Tabelle \ref{tb:BasicMulticastTasks} aufgef\"{u}hrt verschickt P2 alle \textit{2500ms} jeweils eine Multicast-Nachricht, die alle voneinander v\"{o}llig unabh\"{a}ngig sind.
-P1 kann jedoch erst nach \texttt{2500ms} Multicast-Nachrichten empfangen, da er vorher das Protokoll nicht unterst\"{u}tzt w\"{a}hrend P3 von \texttt{3000ms} bis \texttt{6000ms} abgest\"{u}rzt ist und in dieser Zeit auch keine Nachrichten empfangen kann. Je nach Interpretation k\"{o}nnte P1 einen Server simulieren, der erst sp\"{a}ter ans Netz angeschlossen wird. Da die Einstellung ``Nur relevante Nachrichten anzeigen'' aktiviert ist, wird die erste Multicast-Nachricht von P2 an P1 nicht dargestellt. Bei jedem Prozess wurde die Nachrichtenverlustwahrscheinlichkeit auf \texttt{30} Prozent gestellt, worauf alle in dieser Simulation verschickten Nachrichten mit einer Wahrscheinlichkeit von \texttt{30} Prozent ausfallen.
+P1 kann jedoch erst nach \textit{2500ms} Multicast-Nachrichten empfangen, da er vorher das Protokoll nicht unterst\"{u}tzt w\"{a}hrend P3 von \textit{3000ms} bis \textit{6000ms} abgest\"{u}rzt ist und in dieser Zeit auch keine Nachrichten empfangen kann. Je nach Interpretation k\"{o}nnte P1 einen Server simulieren, der erst sp\"{a}ter ans Netz angeschlossen wird. Da die Einstellung ``Nur relevante Nachrichten anzeigen'' aktiviert ist, wird die erste Multicast-Nachricht von P2 an P1 nicht dargestellt. Bei jedem Prozess wurde die Nachrichtenverlustwahrscheinlichkeit auf \textit{30} Prozent gestellt, weswegen alle in dieser Simulation verschickten Nachrichten mit einer Wahrscheinlichkeit von \textit{30} Prozent ausfallen.
In diesem Beispiel ging die 3. Multicast-Nachricht auf den Weg zu P3- und die 5. sowie 6. Nachricht auf den Weg zu P1 verloren. Lediglich die 4. Multicast-Nachricht hat alle beiden Ziele aufeinmal erreicht.
@@ -845,7 +848,7 @@ In diesem Beispiel ging die 3. Multicast-Nachricht auf den Weg zu P3- und die 5. \label{fig:ReliableMulticastProto}
\end{figure}
-Bei dem zuverl\"{a}ssigen (Reliable) Multicast verschickt der Client so oft periodisch seine Multicast-Nachricht erneut, bis er von allen beteiligten Servern eine Best\"{a}tigung erhalten hat. Nach jedem erneuten Versuch vergisst der Client, von welchen Servern er bereits eine Best\"{a}tigung erhalten hat, womit jeder erneuter Versuch von allen Teilnehmern aufs Neue best\"{a}tigt werden muss. In dem Beispiel (Abbildung \ref{fig:ReliableMulticastProto}, Tabelle \ref{tb:ReliableMulticastTasks}, sowie den Loggs in den Tabellen \ref{tb:ReliableMulticastLoggs} und \ref{tb:ReliableMulticastLoggs2}) ist P2 der Multicast-verschickende Client, w\"{a}hrend P1 und P3 die Server darstellen. Bei \texttt{0ms} initiiert der Client seine Multicast-Nachricht. Die Nachrichtenverlustwahrscheinlichkeiten sind \"{u}berall auf \texttt{30} Prozent eingestellt.
+Bei dem zuverl\"{a}ssigen (Reliable) Multicast verschickt der Client so oft periodisch seine Multicast-Nachricht erneut, bis er von allen beteiligten Servern eine Best\"{a}tigung erhalten hat. Nach jedem erneuten Versuch vergisst der Client, von welchen Servern er bereits eine Best\"{a}tigung erhalten hat, womit jeder erneuter Versuch von allen Teilnehmern aufs Neue best\"{a}tigt werden muss. In dem Beispiel (Abbildung \ref{fig:ReliableMulticastProto}, Tabelle \ref{tb:ReliableMulticastTasks}, sowie den Loggs in den Tabellen \ref{tb:ReliableMulticastLoggs} und \ref{tb:ReliableMulticastLoggs2}) ist P2 der Multicast-verschickende Client, w\"{a}hrend P1 und P3 die Server darstellen. Bei \textit{0ms} initiiert der Client seine Multicast-Nachricht. Die Nachrichtenverlustwahrscheinlichkeiten sind bei allen Prozessen auf \textit{30} Prozent eingestellt.
In diesem Beispiel ben\"{o}tigt der Client bis zur erfolgreichen Auslieferung des zuverl\"{a}ssigen Multicasts genau 5 Versuche:
@@ -1023,13 +1026,13 @@ Bisher wurden alle verf\"{u}gbaren Protokolle anhand von Beispielen aufgef\"{u}h \label{fig:Lamportzeit}
\end{figure}
-Die Vektor- und Lamportzeitstempel lassen sich sehr gut am bereits behandelten Beispiel zum Berkeley-Protokoll demonstrieren. Nach Aktivierung der Lamportzeit-Checkbox erscheinen bei jedem Ereignis die zum jeweiligen Prozess geh\"{o}rigen Lamportzeitstempel (Abbildung \ref{fig:Lamportzeit}). Jeder Prozess besitzt einen eigenen Lamportzeitstempel, der bei jedem Versenden oder Erhalten einer Nachricht inkrementiert wird. Jeder Nachricht wird die aktuelle Lamportzeit $t_l(i)$ des sendenden Prozesses $i$ beigef\"{u}gt. Wenn ein anderer Prozess $j$ diese Nachricht erh\"{a}lt, so wird sein aktueller Lamportzeitstempel $t_l(j)$ wie folgt neu berechnet:
+Die Vektor- und Lamportzeitstempel lassen sich sehr gut am bereits behandeltem Beispiel des Berkeley-Protokoll's demonstrieren. Nach Aktivierung der Lamportzeit-Checkbox erscheinen bei jedem Ereignis die zum jeweiligen Prozess geh\"{o}rigen Lamportzeitstempel (Abbildung \ref{fig:Lamportzeit}). Jeder Prozess besitzt einen eigenen Lamportzeitstempel, der bei jedem Versenden oder Erhalten einer Nachricht inkrementiert wird. Jeder Nachricht wird die aktuelle Lamportzeit $t_l(i)$ des sendenden Prozesses $i$ beigef\"{u}gt. Wenn ein weiterer Prozess $j$ diese Nachricht erh\"{a}lt, so wird der aktuelle Lamportzeitstempel $t_l(j)$ von Prozess $j$ wie folgt neu berechnet:
\begin{equation*}
t_l(j) := 1 + max(t_l(j), t_l(i))
\end{equation*}
-Es wird also stets die gr\"{o}ssere Lamportzeit vom Sende- und Empfangsprozess verwendet und anschließend um 1 inkrementiert. Nach Ablauf der Berkeley-Simulation hat P1 (16), P2 (14) und P3 (15) als Lamportzeitstempel.
+Es wird also stets die gr\"{o}ssere Lamportzeit vom Sender- und Empf\"{a}ngerprozess verwendet und anschließend wird diese um \textit{1} inkrementiert. Nach Ablauf der Berkeley-Simulation hat P1 \textit{(16)}, P2 (\textit{14}) und P3 (\textit{15}) als Lamportzeitstempel abgespeichert.
\begin{figure}[htbp]
\centering
@@ -1038,5 +1041,13 @@ Es wird also stets die gr\"{o}ssere Lamportzeit vom Sende- und Empfangsprozess v \label{fig:Vektorzeit}
\end{figure}
-Mit aktivierter Vektorzeit-Checkbox werden, wie auf Abbildung \ref{fig:Vektorzeit}, alle Vektor-Zeitstempel angezeigt. Ja, guckst du krass! Machst du Klick und siehst du f\"{a}tte Vektor-Zeitstamps! w000t! Isch muss schreiben zuende hier den Teil tun! J0!
+Mit aktivierter Vektorzeit-Checkbox werden, wie auf Abbildung \ref{fig:Vektorzeit}, alle Vektor-Zeitstempel angezeigt. Wie bei den Lamportzeitstempeln wird auch hier jeder Nachricht der aktuelle Vektor-Zeitstempel des Senderprozesses beigegef\"{u}gt. Bei $n$ beteiligten Prozessen hat der Vektor-Zeitstempel $v$ die gr\"{o}ße $n$. Somit gibt es f\"{u}r jeden beteiligten Prozess $i$ einen eigenen Index $i$. \"{U}ber $v(i)$ kann jeder Prozess auf seine lokale logische Zeit zugreifen.
+
+Standardm\"{a}ßig wird der Vektor-Zeitstempel nur inkrementiert, wenn eine Nachricht verschickt- oder erhalten wird. Bei beiden F\"{a}llen inkrementiert der Sender- beziehungsweise Senderprozess seinen eigenen Index im Vektor-Zeitstempel mit $v(i) = v(i) + 1$. Beim Empfang einer Nachricht wird anschließend der lokale Vektor-Zeitstempel mit dem des Senderprozesses verglichen und f\"{u}r alle Indizies stets der gr\"{o}ßere Wert in den lokalen Vektor-Zeitstempel \"{u}bernommen.
+
+Im Beispiel auf Abbildung \ref{fig:Vektorzeit} hat P1 \textit{(8,10,6)}, P2 \textit{(6,10,6)} und P3 \textit{(6,10,8)} als Vektor-Zeitstempel abgespeichert.
+
+Wenn im Laufe einer Simulation Prozesse entfernt- oder neue Prozesse hinzugef\"{u}gt werden, so passt sich die Gr\"{o}ße der Vektor-Zeitstempel aller anderen Prozesse automatisch der Anzahl der Prozesse an.
+
+Wie bereits beschrieben gibt es in den Simulationseinstellungen die boolschen Variablen ``Lamportzeiten betreffen alle Ereignisse'' und ``Vektorzeiten betreffen alle Ereignisse'', die standardm\"{a}ßig auf \textit{false} gesetzt sind. Mit \textit{true} werden alle Ereignisse, und nicht nur der Empfang oder das Versenden einer Nachricht, ber\"{u}cksichtigt. F\"{u}r eine weitere Betrachtung der Lamport- sowie Vektor-Zeitstempel siehe \cite{Vorlesung} oder \cite{Tanenbaum}.
diff --git a/LaTeX/chapters/titlepage.tex b/LaTeX/chapters/titlepage.tex index 1045134..a344d8f 100644 --- a/LaTeX/chapters/titlepage.tex +++ b/LaTeX/chapters/titlepage.tex @@ -32,12 +32,10 @@ \vspace*{1cm} - {\Huge\bf DIPLOMARBEIT \\[1cm]} + {\Huge\bf 1. DIPLOMARBEITSPREVIEW \\[1cm]} {\Large\bf {\maintitle} \\} - %{~\\Subversion Revision \input{revision}} - - {~\\Durchgeführt an der} + {~\\Es fehlt noch 1 Kapitel und Schlusswort! Durchgeführt an der} {\large Fachhochschule Aachen\\} {\large Fachbereich Elektrotechnik und Informationstechnik} @@ -74,11 +72,11 @@ Ohne die Hilfe folgender Personen w\"{a}re die Anfertigung dieser Diplomarbeit in diesem Maße nicht m\"{o}glich gewesen. Daher m\"{o}chte ich mich bedanken bei: \begin{itemize} - \item Martin Oßmann f\"{u}r die Betreuung der Diplomarbeit und der Bereitstellung des f\"{u}r mich sehr interessanten Themas - \item Andre Herbst, f\"{u}r das Testen des Simulators; durch seine Hilfe wurden viele M\"{a}ngel und Bugs aufgedeckt - \item Meinem Bruder Florian B\"{u}tow, f\"{u}r Tipps und Tricks rund um Java, f\"{u}r die Bereitstellung eines Buches sowie f\"{u}r das Testen des Simulators - \item Meinen Eltern J\"{o}rn und Leslie B\"{u}tow, die mir das Studium erm\"{o}glichten und stets f\"{u}r alle Dinge ein offenes Ohr hatten sowie f\"{u}r das Sponsoren eines weiteren Buches - \item Meiner Tante Carrie Callahan f\"{u}r das Probelesen + \item Prof. Oßmann f\"{u}r die Betreuung der Diplomarbeit und der Bereitstellung des f\"{u}r mich sehr interessanten Themas sowie Prof. Fassbender als 2. Pr\"{u}fer + \item Meinem Bruder Florian B\"{u}tow + \item Meinen Eltern J\"{o}rn und Leslie B\"{u}tow + \item Meiner Tante Carrie Callahan + \item Andre Herbst \item Der Open Source Gemeinde; diese Diplomarbeit wurde ausschließlich mit Hilfe von Open Source Software angefertigt \end{itemize} diff --git a/LaTeX/images/core-time.eps b/LaTeX/images/core-time.eps new file mode 100644 index 0000000..d6aab90 --- /dev/null +++ b/LaTeX/images/core-time.eps @@ -0,0 +1,290 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 188 148 471 324 +%%BeginProcSet: reencode 1.0 0 +/RE +{ findfont begin + currentdict dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /FontName exch def dup length 0 ne + { /Encoding Encoding 256 array copy def + 0 exch + { dup type /nametype eq + { Encoding 2 index 2 index put + pop 1 add + } + { exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop + } bind def +%%EndProcSet: reencode 1.0 0 +%%BeginProcSet: ellipse 1.0 0 +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse { ellipsedict begin +/endangle exch def +/startangle exch def +/yrad exch def +/xrad exch def +/y exch def +/x exch def +/savematrix mtrx currentmatrix def +x y translate +xrad yrad scale +0 0 1 0 360 arc +savematrix setmatrix end } def +%%EndProcSet: ellipse 1.0 0 +%%EndProlog +%%BeginSetup +/isolatin1encoding +[ 32 /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one + /two /three /four /five /six /seven /eight /nine /colon /semicolon + /less /equal /greater /question /at /A /B /C /D /E + /F /G /H /I /J /K /L /M /N /O + /P /Q /R /S /T /U /V /W /X /Y + /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c + /d /e /f /g /h /i /j /k /l /m + /n /o /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright + /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf + /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring + /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis + /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def +%%EndSetup +1 setlinewidth +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +12 scalefont setfont +0.0 0.0 0.0 setrgbcolor +0 472 translate +1.0 1.0 scale +1.0 1.0 1.0 setrgbcolor +newpath +192 -152 moveto +222 0 rlineto +0 -20 rlineto +-222 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +192 -152 moveto +222 0 rlineto +0 -20 rlineto +-222 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +196 -165 moveto +(core.time) show +1.0 1.0 1.0 setrgbcolor +newpath +192 -172 moveto +271 0 rlineto +0 -147 rlineto +-271 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +192 -172 moveto +271 0 rlineto +0 -147 rlineto +-271 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +280 -184 moveto +81 0 rlineto +0 -40 rlineto +-81 0 rlineto +closepath +eofill +newpath +280 -184 moveto +81 0 rlineto +0 -14 rlineto +-81 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +280 -184 moveto +82 0 rlineto +0 -15 rlineto +-82 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +283 -198 moveto +(<<interface>>) show +1.0 1.0 1.0 setrgbcolor +newpath +280 -199 moveto +81 0 rlineto +0 -19 rlineto +-81 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +303 -212 moveto +(VSTime) show +newpath +280 -184 moveto +82 0 rlineto +0 -41 rlineto +-82 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +208 -280 moveto +84 0 rlineto +0 -21 rlineto +-84 0 rlineto +closepath +eofill +newpath +208 -280 moveto +84 0 rlineto +0 -1 rlineto +-84 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +208 -280 moveto +85 0 rlineto +0 -2 rlineto +-85 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +208 -282 moveto +84 0 rlineto +0 -19 rlineto +-84 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +212 -295 moveto +(VSLamportTime) show +newpath +208 -280 moveto +85 0 rlineto +0 -22 rlineto +-85 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +312 -280 moveto +74 0 rlineto +0 -21 rlineto +-74 0 rlineto +closepath +eofill +newpath +312 -280 moveto +74 0 rlineto +0 -1 rlineto +-74 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +312 -280 moveto +75 0 rlineto +0 -2 rlineto +-75 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +312 -282 moveto +74 0 rlineto +0 -19 rlineto +-74 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +315 -295 moveto +(VSVectorTime) show +newpath +312 -280 moveto +75 0 rlineto +0 -22 rlineto +-75 0 rlineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +352 -280 moveto +352 -225 lineto +stroke +1.0 1.0 1.0 setrgbcolor +[] 0 setdash +newpath +352 -225 moveto +359 -237 lineto +345 -237 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +352 -225 moveto +359 -237 lineto +345 -237 lineto +closepath +stroke +389 -266 moveto +(<<realize>>) show +[5.0 5.0 ] 0 setdash +newpath +240 -280 moveto +240 -224 lineto +stroke +newpath +240 -224 moveto +280 -224 lineto +stroke +1.0 1.0 1.0 setrgbcolor +[] 0 setdash +newpath +280 -224 moveto +268 -231 lineto +268 -217 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +280 -224 moveto +268 -231 lineto +268 -217 lineto +closepath +stroke +277 -245 moveto +(<<realize>>) show +showpage +%%Trailer diff --git a/LaTeX/images/core.eps b/LaTeX/images/core.eps new file mode 100644 index 0000000..f6a124f --- /dev/null +++ b/LaTeX/images/core.eps @@ -0,0 +1,629 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 172 52 591 396 +%%BeginProcSet: reencode 1.0 0 +/RE +{ findfont begin + currentdict dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /FontName exch def dup length 0 ne + { /Encoding Encoding 256 array copy def + 0 exch + { dup type /nametype eq + { Encoding 2 index 2 index put + pop 1 add + } + { exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop + } bind def +%%EndProcSet: reencode 1.0 0 +%%BeginProcSet: ellipse 1.0 0 +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse { ellipsedict begin +/endangle exch def +/startangle exch def +/yrad exch def +/xrad exch def +/y exch def +/x exch def +/savematrix mtrx currentmatrix def +x y translate +xrad yrad scale +0 0 1 0 360 arc +savematrix setmatrix end } def +%%EndProcSet: ellipse 1.0 0 +%%EndProlog +%%BeginSetup +/isolatin1encoding +[ 32 /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one + /two /three /four /five /six /seven /eight /nine /colon /semicolon + /less /equal /greater /question /at /A /B /C /D /E + /F /G /H /I /J /K /L /M /N /O + /P /Q /R /S /T /U /V /W /X /Y + /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c + /d /e /f /g /h /i /j /k /l /m + /n /o /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright + /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf + /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring + /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis + /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def +%%EndSetup +1 setlinewidth +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +12 scalefont setfont +0.0 0.0 0.0 setrgbcolor +0 448 translate +1.0 1.0 scale +1.0 1.0 1.0 setrgbcolor +newpath +176 -96 moveto +358 0 rlineto +0 -20 rlineto +-358 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +176 -96 moveto +358 0 rlineto +0 -20 rlineto +-358 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +180 -109 moveto +(core) show +1.0 1.0 1.0 setrgbcolor +newpath +176 -116 moveto +407 0 rlineto +0 -275 rlineto +-407 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +176 -116 moveto +407 0 rlineto +0 -275 rlineto +-407 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +392 -216 moveto +167 0 rlineto +0 -43 rlineto +-167 0 rlineto +closepath +eofill +newpath +392 -216 moveto +167 0 rlineto +0 -1 rlineto +-167 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +392 -216 moveto +168 0 rlineto +0 -2 rlineto +-168 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +392 -218 moveto +167 0 rlineto +0 -19 rlineto +-167 0 rlineto +closepath +eofill +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +432 -231 moveto +(VSInternalProcess) show +1.0 1.0 1.0 setrgbcolor +newpath +393 -239 moveto +166 0 rlineto +0 -20 rlineto +-166 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +393 -239 moveto +560 -239 lineto +stroke +396 -253 moveto +(getTasks\(\) : utils.VSPriorityQueue) show +newpath +392 -216 moveto +168 0 rlineto +0 -44 rlineto +-168 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +264 -136 moveto +62 0 rlineto +0 -21 rlineto +-62 0 rlineto +closepath +eofill +newpath +264 -136 moveto +62 0 rlineto +0 -1 rlineto +-62 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +264 -136 moveto +63 0 rlineto +0 -2 rlineto +-63 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +264 -138 moveto +62 0 rlineto +0 -19 rlineto +-62 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +268 -151 moveto +(VSMessage) show +newpath +264 -136 moveto +63 0 rlineto +0 -22 rlineto +-63 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +192 -296 moveto +161 0 rlineto +0 -78 rlineto +-161 0 rlineto +closepath +eofill +newpath +192 -296 moveto +161 0 rlineto +0 -1 rlineto +-161 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +192 -296 moveto +162 0 rlineto +0 -2 rlineto +-162 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +192 -298 moveto +161 0 rlineto +0 -19 rlineto +-161 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +255 -311 moveto +(VSTask) show +1.0 1.0 1.0 setrgbcolor +newpath +193 -354 moveto +160 0 rlineto +0 -20 rlineto +-160 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +193 -354 moveto +354 -354 lineto +stroke +196 -368 moveto +(runTask\(... : void\) : void) show +1.0 1.0 1.0 setrgbcolor +newpath +193 -319 moveto +160 0 rlineto +0 -33 rlineto +-160 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +193 -319 moveto +354 -319 lineto +stroke +196 -333 moveto +(process : VSProcess) show +196 -346 moveto +(event : VSAbstractEvent) show +newpath +192 -296 moveto +162 0 rlineto +0 -79 rlineto +-162 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +392 -296 moveto +176 0 rlineto +0 -78 rlineto +-176 0 rlineto +closepath +eofill +newpath +392 -296 moveto +176 0 rlineto +0 -1 rlineto +-176 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +392 -296 moveto +177 0 rlineto +0 -2 rlineto +-177 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +392 -298 moveto +176 0 rlineto +0 -19 rlineto +-176 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +441 -311 moveto +(VSTaskManager) show +1.0 1.0 1.0 setrgbcolor +newpath +393 -354 moveto +175 0 rlineto +0 -20 rlineto +-175 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +393 -354 moveto +569 -354 lineto +stroke +396 -368 moveto +(runTasks\(... : void\) : void) show +1.0 1.0 1.0 setrgbcolor +newpath +393 -319 moveto +175 0 rlineto +0 -33 rlineto +-175 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +393 -319 moveto +569 -319 lineto +stroke +396 -333 moveto +(processes : java.util.ArrayList) show +396 -346 moveto +(globalTasks : utils.VSPriorityQueue) show +newpath +392 -296 moveto +177 0 rlineto +0 -79 rlineto +-177 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +320 -56 moveto +72 0 rlineto +0 -21 rlineto +-72 0 rlineto +closepath +eofill +newpath +320 -56 moveto +72 0 rlineto +0 -1 rlineto +-72 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +320 -56 moveto +73 0 rlineto +0 -2 rlineto +-73 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +320 -58 moveto +72 0 rlineto +0 -19 rlineto +-72 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +324 -71 moveto +(prefs.VSPrefs) show +newpath +320 -56 moveto +73 0 rlineto +0 -22 rlineto +-73 0 rlineto +closepath +stroke +newpath +320 -136 moveto +320 -78 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +320 -78 moveto +327 -90 lineto +313 -90 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +320 -78 moveto +327 -90 lineto +313 -90 lineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +392 -344 moveto +354 -344 lineto +stroke +[] 0 setdash +newpath +366 -337 moveto +354 -344 lineto +stroke +newpath +366 -351 moveto +354 -344 lineto +stroke +newpath +373 -344 2 -2 0 360 ellipse +eofill +1.0 1.0 1.0 setrgbcolor +newpath +373 -344 1 -1 0 360 ellipse +eofill +newpath +240 -216 moveto +112 0 rlineto +0 -43 rlineto +-112 0 rlineto +closepath +eofill +newpath +240 -216 moveto +112 0 rlineto +0 -1 rlineto +-112 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +240 -216 moveto +113 0 rlineto +0 -2 rlineto +-113 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +240 -218 moveto +112 0 rlineto +0 -19 rlineto +-112 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +258 -231 moveto +(VSMessageStub) show +1.0 1.0 1.0 setrgbcolor +newpath +241 -239 moveto +111 0 rlineto +0 -20 rlineto +-111 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +241 -239 moveto +353 -239 lineto +stroke +244 -253 moveto +(message : VSMessage) show +newpath +240 -216 moveto +113 0 rlineto +0 -44 rlineto +-113 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +392 -136 moveto +142 0 rlineto +0 -43 rlineto +-142 0 rlineto +closepath +eofill +newpath +392 -136 moveto +142 0 rlineto +0 -1 rlineto +-142 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +392 -136 moveto +143 0 rlineto +0 -2 rlineto +-143 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +392 -138 moveto +142 0 rlineto +0 -19 rlineto +-142 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +418 -151 moveto +(VSAbstractProcess) show +1.0 1.0 1.0 setrgbcolor +newpath +393 -159 moveto +141 0 rlineto +0 -20 rlineto +-141 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +393 -159 moveto +535 -159 lineto +stroke +396 -173 moveto +(tasks : utils.VSPriorityQueue) show +newpath +392 -136 moveto +143 0 rlineto +0 -44 rlineto +-143 0 rlineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +472 -296 moveto +472 -260 lineto +stroke +[] 0 setdash +newpath +479 -272 moveto +472 -260 lineto +stroke +newpath +465 -272 moveto +472 -260 lineto +stroke +newpath +393 -136 moveto +393 -78 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +393 -78 moveto +400 -90 lineto +386 -90 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +393 -78 moveto +400 -90 lineto +386 -90 lineto +closepath +stroke +newpath +464 -216 moveto +464 -180 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +464 -180 moveto +471 -192 lineto +457 -192 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +464 -180 moveto +471 -192 lineto +457 -192 lineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +392 -180 moveto +354 -296 lineto +stroke +[] 0 setdash +newpath +351 -282 moveto +354 -296 lineto +stroke +newpath +364 -286 moveto +354 -296 lineto +stroke +[5.0 5.0 ] 0 setdash +newpath +296 -216 moveto +296 -158 lineto +stroke +[] 0 setdash +newpath +303 -170 moveto +296 -158 lineto +stroke +newpath +289 -170 moveto +296 -158 lineto +stroke +showpage +%%Trailer diff --git a/LaTeX/images/events.eps b/LaTeX/images/events.eps new file mode 100644 index 0000000..bfd6d08 --- /dev/null +++ b/LaTeX/images/events.eps @@ -0,0 +1,831 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 132 20 668 348 +%%BeginProcSet: reencode 1.0 0 +/RE +{ findfont begin + currentdict dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /FontName exch def dup length 0 ne + { /Encoding Encoding 256 array copy def + 0 exch + { dup type /nametype eq + { Encoding 2 index 2 index put + pop 1 add + } + { exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop + } bind def +%%EndProcSet: reencode 1.0 0 +%%BeginProcSet: ellipse 1.0 0 +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse { ellipsedict begin +/endangle exch def +/startangle exch def +/yrad exch def +/xrad exch def +/y exch def +/x exch def +/savematrix mtrx currentmatrix def +x y translate +xrad yrad scale +0 0 1 0 360 arc +savematrix setmatrix end } def +%%EndProcSet: ellipse 1.0 0 +%%EndProlog +%%BeginSetup +/isolatin1encoding +[ 32 /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one + /two /three /four /five /six /seven /eight /nine /colon /semicolon + /less /equal /greater /question /at /A /B /C /D /E + /F /G /H /I /J /K /L /M /N /O + /P /Q /R /S /T /U /V /W /X /Y + /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c + /d /e /f /g /h /i /j /k /l /m + /n /o /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright + /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf + /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring + /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis + /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def +%%EndSetup +1 setlinewidth +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +12 scalefont setfont +0.0 0.0 0.0 setrgbcolor +0 368 translate +1.0 1.0 scale +1.0 1.0 1.0 setrgbcolor +newpath +136 -64 moveto +478 0 rlineto +0 -20 rlineto +-478 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +136 -64 moveto +478 0 rlineto +0 -20 rlineto +-478 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +140 -77 moveto +(events) show +1.0 1.0 1.0 setrgbcolor +newpath +136 -84 moveto +527 0 rlineto +0 -259 rlineto +-527 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +136 -84 moveto +527 0 rlineto +0 -259 rlineto +-527 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +224 -104 moveto +86 0 rlineto +0 -21 rlineto +-86 0 rlineto +closepath +eofill +newpath +224 -104 moveto +86 0 rlineto +0 -1 rlineto +-86 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +224 -104 moveto +87 0 rlineto +0 -2 rlineto +-87 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +224 -106 moveto +86 0 rlineto +0 -19 rlineto +-86 0 rlineto +closepath +eofill +isolatin1encoding /_Helvetica-Oblique /Helvetica-Oblique RE +/_Helvetica-Oblique findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +228 -119 moveto +(VSAbstractEvent) show +newpath +224 -104 moveto +87 0 rlineto +0 -22 rlineto +-87 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +152 -152 moveto +182 0 rlineto +0 -20 rlineto +-182 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +152 -152 moveto +182 0 rlineto +0 -20 rlineto +-182 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +156 -165 moveto +(events.implementations) show +1.0 1.0 1.0 setrgbcolor +newpath +152 -172 moveto +231 0 rlineto +0 -51 rlineto +-231 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +152 -172 moveto +231 0 rlineto +0 -51 rlineto +-231 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +224 -264 moveto +90 0 rlineto +0 -40 rlineto +-90 0 rlineto +closepath +eofill +newpath +224 -264 moveto +90 0 rlineto +0 -14 rlineto +-90 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +224 -264 moveto +91 0 rlineto +0 -15 rlineto +-91 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +231 -278 moveto +(<<interface>>) show +1.0 1.0 1.0 setrgbcolor +newpath +224 -279 moveto +90 0 rlineto +0 -19 rlineto +-90 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +228 -292 moveto +(VSCopyableEvent) show +newpath +224 -264 moveto +91 0 rlineto +0 -41 rlineto +-91 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +360 -104 moveto +102 0 rlineto +0 -21 rlineto +-102 0 rlineto +closepath +eofill +newpath +360 -104 moveto +102 0 rlineto +0 -1 rlineto +-102 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +360 -104 moveto +103 0 rlineto +0 -2 rlineto +-103 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +360 -106 moveto +102 0 rlineto +0 -19 rlineto +-102 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +364 -119 moveto +(VSRegisteredEvents) show +newpath +360 -104 moveto +103 0 rlineto +0 -22 rlineto +-103 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +160 -184 moveto +110 0 rlineto +0 -21 rlineto +-110 0 rlineto +closepath +eofill +newpath +160 -184 moveto +110 0 rlineto +0 -1 rlineto +-110 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +160 -184 moveto +111 0 rlineto +0 -2 rlineto +-111 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +160 -186 moveto +110 0 rlineto +0 -19 rlineto +-110 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +164 -199 moveto +(VSProcessCrashEvent) show +newpath +160 -184 moveto +111 0 rlineto +0 -22 rlineto +-111 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +280 -184 moveto +83 0 rlineto +0 -21 rlineto +-83 0 rlineto +closepath +eofill +newpath +280 -184 moveto +83 0 rlineto +0 -1 rlineto +-83 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +280 -184 moveto +84 0 rlineto +0 -2 rlineto +-84 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +280 -186 moveto +83 0 rlineto +0 -19 rlineto +-83 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +284 -199 moveto +(VSRecoverEvent) show +newpath +280 -184 moveto +84 0 rlineto +0 -22 rlineto +-84 0 rlineto +closepath +stroke +newpath +248 -184 moveto +248 -126 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +248 -126 moveto +255 -138 lineto +241 -138 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +248 -126 moveto +255 -138 lineto +241 -138 lineto +closepath +stroke +newpath +290 -184 moveto +290 -126 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +290 -126 moveto +297 -138 lineto +283 -138 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +290 -126 moveto +297 -138 lineto +283 -138 lineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +184 -206 moveto +184 -248 lineto +stroke +newpath +184 -248 moveto +224 -264 lineto +stroke +1.0 1.0 1.0 setrgbcolor +[] 0 setdash +newpath +224 -264 moveto +210 -266 lineto +215 -253 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +224 -264 moveto +210 -266 lineto +215 -253 lineto +closepath +stroke +211 -248 moveto +(<<realize>>) show +[5.0 5.0 ] 0 setdash +newpath +307 -206 moveto +307 -264 lineto +stroke +1.0 1.0 1.0 setrgbcolor +[] 0 setdash +newpath +307 -264 moveto +300 -252 lineto +314 -252 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +307 -264 moveto +300 -252 lineto +314 -252 lineto +closepath +stroke +344 -248 moveto +(<<realize>>) show +[5.0 5.0 ] 0 setdash +newpath +360 -112 moveto +311 -112 lineto +stroke +[] 0 setdash +newpath +323 -105 moveto +311 -112 lineto +stroke +newpath +323 -119 moveto +311 -112 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +424 -152 moveto +166 0 rlineto +0 -20 rlineto +-166 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +424 -152 moveto +166 0 rlineto +0 -20 rlineto +-166 0 rlineto +closepath +stroke +428 -165 moveto +(events.internal) show +1.0 1.0 1.0 setrgbcolor +newpath +424 -172 moveto +215 0 rlineto +0 -155 rlineto +-215 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +424 -172 moveto +215 0 rlineto +0 -155 rlineto +-215 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +448 -184 moveto +129 0 rlineto +0 -21 rlineto +-129 0 rlineto +closepath +eofill +newpath +448 -184 moveto +129 0 rlineto +0 -1 rlineto +-129 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +448 -184 moveto +130 0 rlineto +0 -2 rlineto +-130 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +448 -186 moveto +129 0 rlineto +0 -19 rlineto +-129 0 rlineto +closepath +eofill +isolatin1encoding /_Helvetica-Oblique /Helvetica-Oblique RE +/_Helvetica-Oblique findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +454 -199 moveto +(VSAbstractInternalEvent) show +newpath +448 -184 moveto +130 0 rlineto +0 -22 rlineto +-130 0 rlineto +closepath +stroke +newpath +448 -184 moveto +311 -126 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +311 -126 moveto +324 -124 lineto +319 -137 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +311 -126 moveto +324 -124 lineto +319 -137 lineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +504 -232 moveto +125 0 rlineto +0 -21 rlineto +-125 0 rlineto +closepath +eofill +newpath +504 -232 moveto +125 0 rlineto +0 -1 rlineto +-125 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +504 -232 moveto +126 0 rlineto +0 -2 rlineto +-126 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +504 -234 moveto +125 0 rlineto +0 -19 rlineto +-125 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +508 -247 moveto +(VSMessageReceiveEvent) show +newpath +504 -232 moveto +126 0 rlineto +0 -22 rlineto +-126 0 rlineto +closepath +stroke +newpath +528 -232 moveto +528 -206 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +528 -206 moveto +535 -218 lineto +521 -218 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +528 -206 moveto +535 -218 lineto +521 -218 lineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +472 -264 moveto +85 0 rlineto +0 -21 rlineto +-85 0 rlineto +closepath +eofill +newpath +472 -264 moveto +85 0 rlineto +0 -1 rlineto +-85 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +472 -264 moveto +86 0 rlineto +0 -2 rlineto +-86 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +472 -266 moveto +85 0 rlineto +0 -19 rlineto +-85 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +476 -279 moveto +(VSProtocolEvent) show +newpath +472 -264 moveto +86 0 rlineto +0 -22 rlineto +-86 0 rlineto +closepath +stroke +newpath +496 -264 moveto +496 -206 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +496 -206 moveto +503 -218 lineto +489 -218 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +496 -206 moveto +503 -218 lineto +489 -218 lineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +432 -296 moveto +128 0 rlineto +0 -21 rlineto +-128 0 rlineto +closepath +eofill +newpath +432 -296 moveto +128 0 rlineto +0 -1 rlineto +-128 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +432 -296 moveto +129 0 rlineto +0 -2 rlineto +-129 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +432 -298 moveto +128 0 rlineto +0 -19 rlineto +-128 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +436 -311 moveto +(VSProtocolScheduleEvent) show +newpath +432 -296 moveto +129 0 rlineto +0 -22 rlineto +-129 0 rlineto +closepath +stroke +newpath +464 -296 moveto +464 -206 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +464 -206 moveto +471 -218 lineto +457 -218 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +464 -206 moveto +471 -218 lineto +457 -218 lineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +472 -272 moveto +315 -272 lineto +stroke +1.0 1.0 1.0 setrgbcolor +[] 0 setdash +newpath +315 -272 moveto +327 -265 lineto +327 -279 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +315 -272 moveto +327 -265 lineto +327 -279 lineto +closepath +stroke +361 -260 moveto +(<<realize>>) show +1.0 1.0 1.0 setrgbcolor +newpath +200 -24 moveto +148 0 rlineto +0 -21 rlineto +-148 0 rlineto +closepath +eofill +newpath +200 -24 moveto +148 0 rlineto +0 -1 rlineto +-148 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +200 -24 moveto +149 0 rlineto +0 -2 rlineto +-149 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +200 -26 moveto +148 0 rlineto +0 -19 rlineto +-148 0 rlineto +closepath +eofill +isolatin1encoding /_Helvetica-Oblique /Helvetica-Oblique RE +/_Helvetica-Oblique findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +204 -39 moveto +(protocols.VSAbstractProtocol) show +newpath +200 -24 moveto +149 0 rlineto +0 -22 rlineto +-149 0 rlineto +closepath +stroke +newpath +272 -46 moveto +272 -104 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +272 -104 moveto +265 -92 lineto +279 -92 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +272 -104 moveto +265 -92 lineto +279 -92 lineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +showpage +%%Trailer diff --git a/LaTeX/images/prefs-editors.eps b/LaTeX/images/prefs-editors.eps new file mode 100644 index 0000000..4b5b1b7 --- /dev/null +++ b/LaTeX/images/prefs-editors.eps @@ -0,0 +1,558 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 28 36 420 284 +%%BeginProcSet: reencode 1.0 0 +/RE +{ findfont begin + currentdict dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /FontName exch def dup length 0 ne + { /Encoding Encoding 256 array copy def + 0 exch + { dup type /nametype eq + { Encoding 2 index 2 index put + pop 1 add + } + { exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop + } bind def +%%EndProcSet: reencode 1.0 0 +%%BeginProcSet: ellipse 1.0 0 +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse { ellipsedict begin +/endangle exch def +/startangle exch def +/yrad exch def +/xrad exch def +/y exch def +/x exch def +/savematrix mtrx currentmatrix def +x y translate +xrad yrad scale +0 0 1 0 360 arc +savematrix setmatrix end } def +%%EndProcSet: ellipse 1.0 0 +%%EndProlog +%%BeginSetup +/isolatin1encoding +[ 32 /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one + /two /three /four /five /six /seven /eight /nine /colon /semicolon + /less /equal /greater /question /at /A /B /C /D /E + /F /G /H /I /J /K /L /M /N /O + /P /Q /R /S /T /U /V /W /X /Y + /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c + /d /e /f /g /h /i /j /k /l /m + /n /o /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright + /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf + /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring + /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis + /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def +%%EndSetup +1 setlinewidth +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +12 scalefont setfont +0.0 0.0 0.0 setrgbcolor +0 320 translate +1.0 1.0 scale +1.0 1.0 1.0 setrgbcolor +newpath +32 -88 moveto +334 0 rlineto +0 -20 rlineto +-334 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +32 -88 moveto +334 0 rlineto +0 -20 rlineto +-334 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +36 -101 moveto +(prefs.editors) show +1.0 1.0 1.0 setrgbcolor +newpath +32 -108 moveto +383 0 rlineto +0 -171 rlineto +-383 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +32 -108 moveto +383 0 rlineto +0 -171 rlineto +-383 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +184 -120 moveto +88 0 rlineto +0 -21 rlineto +-88 0 rlineto +closepath +eofill +newpath +184 -120 moveto +88 0 rlineto +0 -1 rlineto +-88 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +184 -120 moveto +89 0 rlineto +0 -2 rlineto +-89 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +184 -122 moveto +88 0 rlineto +0 -19 rlineto +-88 0 rlineto +closepath +eofill +isolatin1encoding /_Helvetica-Oblique /Helvetica-Oblique RE +/_Helvetica-Oblique findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +188 -135 moveto +(VSAbstractEditor) show +newpath +184 -120 moveto +89 0 rlineto +0 -22 rlineto +-89 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +136 -168 moveto +116 0 rlineto +0 -21 rlineto +-116 0 rlineto +closepath +eofill +newpath +136 -168 moveto +116 0 rlineto +0 -1 rlineto +-116 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +136 -168 moveto +117 0 rlineto +0 -2 rlineto +-117 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +136 -170 moveto +116 0 rlineto +0 -19 rlineto +-116 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +139 -183 moveto +(VSAbstractBetterEditor) show +newpath +136 -168 moveto +117 0 rlineto +0 -22 rlineto +-117 0 rlineto +closepath +stroke +newpath +224 -168 moveto +224 -142 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +224 -142 moveto +231 -154 lineto +217 -154 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +224 -142 moveto +231 -154 lineto +217 -154 lineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +88 -240 moveto +94 0 rlineto +0 -21 rlineto +-94 0 rlineto +closepath +eofill +newpath +88 -240 moveto +94 0 rlineto +0 -1 rlineto +-94 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +88 -240 moveto +95 0 rlineto +0 -2 rlineto +-95 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +88 -242 moveto +94 0 rlineto +0 -19 rlineto +-94 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +92 -255 moveto +(VSSimulatorEditor) show +newpath +88 -240 moveto +95 0 rlineto +0 -22 rlineto +-95 0 rlineto +closepath +stroke +newpath +144 -240 moveto +144 -190 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +144 -190 moveto +151 -202 lineto +137 -202 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +144 -190 moveto +151 -202 lineto +137 -202 lineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +208 -240 moveto +84 0 rlineto +0 -21 rlineto +-84 0 rlineto +closepath +eofill +newpath +208 -240 moveto +84 0 rlineto +0 -1 rlineto +-84 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +208 -240 moveto +85 0 rlineto +0 -2 rlineto +-85 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +208 -242 moveto +84 0 rlineto +0 -19 rlineto +-84 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +212 -255 moveto +(VSProcessEditor) show +newpath +208 -240 moveto +85 0 rlineto +0 -22 rlineto +-85 0 rlineto +closepath +stroke +newpath +240 -240 moveto +240 -190 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +240 -190 moveto +247 -202 lineto +233 -202 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +240 -190 moveto +247 -202 lineto +233 -202 lineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +304 -120 moveto +74 0 rlineto +0 -21 rlineto +-74 0 rlineto +closepath +eofill +newpath +304 -120 moveto +74 0 rlineto +0 -1 rlineto +-74 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +304 -120 moveto +75 0 rlineto +0 -2 rlineto +-75 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +304 -122 moveto +74 0 rlineto +0 -19 rlineto +-74 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +308 -135 moveto +(VSEditorTable) show +newpath +304 -120 moveto +75 0 rlineto +0 -22 rlineto +-75 0 rlineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +273 -128 moveto +304 -128 lineto +stroke +[] 0 setdash +newpath +292 -135 moveto +304 -128 lineto +stroke +newpath +292 -121 moveto +304 -128 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +64 -120 moveto +85 0 rlineto +0 -21 rlineto +-85 0 rlineto +closepath +eofill +newpath +64 -120 moveto +85 0 rlineto +0 -1 rlineto +-85 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +64 -120 moveto +86 0 rlineto +0 -2 rlineto +-86 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +64 -122 moveto +85 0 rlineto +0 -19 rlineto +-85 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +68 -135 moveto +(VSColorChooser) show +newpath +64 -120 moveto +86 0 rlineto +0 -22 rlineto +-86 0 rlineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +184 -128 moveto +150 -128 lineto +stroke +[] 0 setdash +newpath +162 -121 moveto +150 -128 lineto +stroke +newpath +162 -135 moveto +150 -128 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +304 -168 moveto +77 0 rlineto +0 -21 rlineto +-77 0 rlineto +closepath +eofill +newpath +304 -168 moveto +77 0 rlineto +0 -1 rlineto +-77 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +304 -168 moveto +78 0 rlineto +0 -2 rlineto +-78 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +304 -170 moveto +77 0 rlineto +0 -19 rlineto +-77 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +308 -183 moveto +(VSEditorFrame) show +newpath +304 -168 moveto +78 0 rlineto +0 -22 rlineto +-78 0 rlineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +304 -176 moveto +253 -176 lineto +stroke +[] 0 setdash +newpath +265 -169 moveto +253 -176 lineto +stroke +newpath +265 -183 moveto +253 -176 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +192 -40 moveto +71 0 rlineto +0 -21 rlineto +-71 0 rlineto +closepath +eofill +newpath +192 -40 moveto +71 0 rlineto +0 -1 rlineto +-71 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +192 -40 moveto +72 0 rlineto +0 -2 rlineto +-72 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +192 -42 moveto +71 0 rlineto +0 -19 rlineto +-71 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +195 -55 moveto +(prefs.VSPrefs) show +newpath +192 -40 moveto +72 0 rlineto +0 -22 rlineto +-72 0 rlineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +224 -120 moveto +224 -62 lineto +stroke +[] 0 setdash +newpath +231 -74 moveto +224 -62 lineto +stroke +newpath +217 -74 moveto +224 -62 lineto +stroke +showpage +%%Trailer diff --git a/LaTeX/images/prefs.eps b/LaTeX/images/prefs.eps new file mode 100644 index 0000000..7b22bd4 --- /dev/null +++ b/LaTeX/images/prefs.eps @@ -0,0 +1,272 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 108 44 380 204 +%%BeginProcSet: reencode 1.0 0 +/RE +{ findfont begin + currentdict dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /FontName exch def dup length 0 ne + { /Encoding Encoding 256 array copy def + 0 exch + { dup type /nametype eq + { Encoding 2 index 2 index put + pop 1 add + } + { exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop + } bind def +%%EndProcSet: reencode 1.0 0 +%%BeginProcSet: ellipse 1.0 0 +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse { ellipsedict begin +/endangle exch def +/startangle exch def +/yrad exch def +/xrad exch def +/y exch def +/x exch def +/savematrix mtrx currentmatrix def +x y translate +xrad yrad scale +0 0 1 0 360 arc +savematrix setmatrix end } def +%%EndProcSet: ellipse 1.0 0 +%%EndProlog +%%BeginSetup +/isolatin1encoding +[ 32 /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one + /two /three /four /five /six /seven /eight /nine /colon /semicolon + /less /equal /greater /question /at /A /B /C /D /E + /F /G /H /I /J /K /L /M /N /O + /P /Q /R /S /T /U /V /W /X /Y + /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c + /d /e /f /g /h /i /j /k /l /m + /n /o /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright + /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf + /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring + /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis + /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def +%%EndSetup +1 setlinewidth +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +12 scalefont setfont +0.0 0.0 0.0 setrgbcolor +0 248 translate +1.0 1.0 scale +1.0 1.0 1.0 setrgbcolor +newpath +112 -48 moveto +214 0 rlineto +0 -20 rlineto +-214 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +112 -48 moveto +214 0 rlineto +0 -20 rlineto +-214 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +116 -61 moveto +(prefs) show +1.0 1.0 1.0 setrgbcolor +newpath +112 -68 moveto +263 0 rlineto +0 -131 rlineto +-263 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +112 -68 moveto +263 0 rlineto +0 -131 rlineto +-263 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +144 -88 moveto +59 0 rlineto +0 -21 rlineto +-59 0 rlineto +closepath +eofill +newpath +144 -88 moveto +59 0 rlineto +0 -1 rlineto +-59 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +144 -88 moveto +60 0 rlineto +0 -2 rlineto +-60 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +144 -90 moveto +59 0 rlineto +0 -19 rlineto +-59 0 rlineto +closepath +eofill +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +155 -103 moveto +(VSPrefs) show +newpath +144 -88 moveto +60 0 rlineto +0 -22 rlineto +-60 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +136 -152 moveto +78 0 rlineto +0 -21 rlineto +-78 0 rlineto +closepath +eofill +newpath +136 -152 moveto +78 0 rlineto +0 -1 rlineto +-78 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +136 -152 moveto +79 0 rlineto +0 -2 rlineto +-79 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +136 -154 moveto +78 0 rlineto +0 -19 rlineto +-78 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +139 -167 moveto +(VSDefaultPrefs) show +newpath +136 -152 moveto +79 0 rlineto +0 -22 rlineto +-79 0 rlineto +closepath +stroke +newpath +176 -152 moveto +176 -110 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +176 -110 moveto +183 -122 lineto +169 -122 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +176 -110 moveto +183 -122 lineto +169 -122 lineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +256 -88 moveto +95 0 rlineto +0 -21 rlineto +-95 0 rlineto +closepath +eofill +newpath +256 -88 moveto +95 0 rlineto +0 -1 rlineto +-95 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +256 -88 moveto +96 0 rlineto +0 -2 rlineto +-96 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +256 -90 moveto +95 0 rlineto +0 -19 rlineto +-95 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +259 -103 moveto +(VSPrefsRestriction) show +newpath +256 -88 moveto +96 0 rlineto +0 -22 rlineto +-96 0 rlineto +closepath +stroke +[5.0 5.0 ] 0 setdash +newpath +204 -96 moveto +256 -96 lineto +stroke +[] 0 setdash +newpath +244 -103 moveto +256 -96 lineto +stroke +newpath +244 -89 moveto +256 -96 lineto +stroke +showpage +%%Trailer diff --git a/LaTeX/images/protocols.eps b/LaTeX/images/protocols.eps new file mode 100644 index 0000000..3186c43 --- /dev/null +++ b/LaTeX/images/protocols.eps @@ -0,0 +1,850 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 100 92 572 404 +%%BeginProcSet: reencode 1.0 0 +/RE +{ findfont begin + currentdict dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /FontName exch def dup length 0 ne + { /Encoding Encoding 256 array copy def + 0 exch + { dup type /nametype eq + { Encoding 2 index 2 index put + pop 1 add + } + { exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop + } bind def +%%EndProcSet: reencode 1.0 0 +%%BeginProcSet: ellipse 1.0 0 +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse { ellipsedict begin +/endangle exch def +/startangle exch def +/yrad exch def +/xrad exch def +/y exch def +/x exch def +/savematrix mtrx currentmatrix def +x y translate +xrad yrad scale +0 0 1 0 360 arc +savematrix setmatrix end } def +%%EndProcSet: ellipse 1.0 0 +%%EndProlog +%%BeginSetup +/isolatin1encoding +[ 32 /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one + /two /three /four /five /six /seven /eight /nine /colon /semicolon + /less /equal /greater /question /at /A /B /C /D /E + /F /G /H /I /J /K /L /M /N /O + /P /Q /R /S /T /U /V /W /X /Y + /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c + /d /e /f /g /h /i /j /k /l /m + /n /o /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright + /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf + /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring + /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis + /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def +%%EndSetup +1 setlinewidth +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +12 scalefont setfont +0.0 0.0 0.0 setrgbcolor +0 496 translate +1.0 1.0 scale +1.0 1.0 1.0 setrgbcolor +newpath +104 -136 moveto +414 0 rlineto +0 -20 rlineto +-414 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +104 -136 moveto +414 0 rlineto +0 -20 rlineto +-414 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +108 -149 moveto +(protocols) show +1.0 1.0 1.0 setrgbcolor +newpath +104 -156 moveto +463 0 rlineto +0 -243 rlineto +-463 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +104 -156 moveto +463 0 rlineto +0 -243 rlineto +-463 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +112 -176 moveto +383 0 rlineto +0 -23 rlineto +-383 0 rlineto +closepath +eofill +newpath +112 -176 moveto +383 0 rlineto +0 -1 rlineto +-383 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +112 -176 moveto +384 0 rlineto +0 -2 rlineto +-384 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +112 -178 moveto +383 0 rlineto +0 -19 rlineto +-383 0 rlineto +closepath +eofill +isolatin1encoding /_Helvetica-Oblique /Helvetica-Oblique RE +/_Helvetica-Oblique findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +257 -191 moveto +(VSAbstractProtocol) show +newpath +112 -176 moveto +384 0 rlineto +0 -24 rlineto +-384 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +160 -96 moveto +121 0 rlineto +0 -21 rlineto +-121 0 rlineto +closepath +eofill +newpath +160 -96 moveto +121 0 rlineto +0 -1 rlineto +-121 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +160 -96 moveto +122 0 rlineto +0 -2 rlineto +-122 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +160 -98 moveto +121 0 rlineto +0 -19 rlineto +-121 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +164 -111 moveto +(events.VSAbstractEvent) show +newpath +160 -96 moveto +122 0 rlineto +0 -22 rlineto +-122 0 rlineto +closepath +stroke +newpath +204 -176 moveto +204 -118 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +204 -118 moveto +211 -130 lineto +197 -130 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +204 -118 moveto +211 -130 lineto +197 -130 lineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +112 -216 moveto +398 0 rlineto +0 -20 rlineto +-398 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +112 -216 moveto +398 0 rlineto +0 -20 rlineto +-398 0 rlineto +closepath +stroke +116 -229 moveto +(protocols.implementations) show +1.0 1.0 1.0 setrgbcolor +newpath +112 -236 moveto +447 0 rlineto +0 -147 rlineto +-447 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +112 -236 moveto +447 0 rlineto +0 -147 rlineto +-447 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +1.0 1.0 1.0 setrgbcolor +newpath +120 -248 moveto +95 0 rlineto +0 -21 rlineto +-95 0 rlineto +closepath +eofill +newpath +120 -248 moveto +95 0 rlineto +0 -1 rlineto +-95 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +120 -248 moveto +96 0 rlineto +0 -2 rlineto +-96 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +120 -250 moveto +95 0 rlineto +0 -19 rlineto +-95 0 rlineto +closepath +eofill +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +124 -263 moveto +(VSDummyProtocol) show +newpath +120 -248 moveto +96 0 rlineto +0 -22 rlineto +-96 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +224 -248 moveto +104 0 rlineto +0 -21 rlineto +-104 0 rlineto +closepath +eofill +newpath +224 -248 moveto +104 0 rlineto +0 -1 rlineto +-104 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +224 -248 moveto +105 0 rlineto +0 -2 rlineto +-105 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +224 -250 moveto +104 0 rlineto +0 -19 rlineto +-104 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +228 -263 moveto +(VSPingPongProtocol) show +newpath +224 -248 moveto +105 0 rlineto +0 -22 rlineto +-105 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +336 -248 moveto +107 0 rlineto +0 -21 rlineto +-107 0 rlineto +closepath +eofill +newpath +336 -248 moveto +107 0 rlineto +0 -1 rlineto +-107 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +336 -248 moveto +108 0 rlineto +0 -2 rlineto +-108 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +336 -250 moveto +107 0 rlineto +0 -19 rlineto +-107 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +340 -263 moveto +(VSBroadcastProtocol) show +newpath +336 -248 moveto +108 0 rlineto +0 -22 rlineto +-108 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +120 -344 moveto +126 0 rlineto +0 -21 rlineto +-126 0 rlineto +closepath +eofill +newpath +120 -344 moveto +126 0 rlineto +0 -1 rlineto +-126 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +120 -344 moveto +127 0 rlineto +0 -2 rlineto +-127 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +120 -346 moveto +126 0 rlineto +0 -19 rlineto +-126 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +124 -359 moveto +(VSBasicMuticastProtocol) show +newpath +120 -344 moveto +127 0 rlineto +0 -22 rlineto +-127 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +256 -344 moveto +140 0 rlineto +0 -21 rlineto +-140 0 rlineto +closepath +eofill +newpath +256 -344 moveto +140 0 rlineto +0 -1 rlineto +-140 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +256 -344 moveto +141 0 rlineto +0 -2 rlineto +-141 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +256 -346 moveto +140 0 rlineto +0 -19 rlineto +-140 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +260 -359 moveto +(VSReliableMuticastProtocol) show +newpath +256 -344 moveto +141 0 rlineto +0 -22 rlineto +-141 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +120 -312 moveto +146 0 rlineto +0 -21 rlineto +-146 0 rlineto +closepath +eofill +newpath +120 -312 moveto +146 0 rlineto +0 -1 rlineto +-146 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +120 -312 moveto +147 0 rlineto +0 -2 rlineto +-147 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +120 -314 moveto +146 0 rlineto +0 -19 rlineto +-146 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +124 -327 moveto +(VSOnePhaseCommitProtocol) show +newpath +120 -312 moveto +147 0 rlineto +0 -22 rlineto +-147 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +272 -312 moveto +146 0 rlineto +0 -21 rlineto +-146 0 rlineto +closepath +eofill +newpath +272 -312 moveto +146 0 rlineto +0 -1 rlineto +-146 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +272 -312 moveto +147 0 rlineto +0 -2 rlineto +-147 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +272 -314 moveto +146 0 rlineto +0 -19 rlineto +-146 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +276 -327 moveto +(VSTwoPhaseCommitProtocol) show +newpath +272 -312 moveto +147 0 rlineto +0 -22 rlineto +-147 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +424 -280 moveto +125 0 rlineto +0 -21 rlineto +-125 0 rlineto +closepath +eofill +newpath +424 -280 moveto +125 0 rlineto +0 -1 rlineto +-125 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +424 -280 moveto +126 0 rlineto +0 -2 rlineto +-126 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +424 -282 moveto +125 0 rlineto +0 -19 rlineto +-125 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +428 -295 moveto +(VSBerkeleyTimeProtocol) show +newpath +424 -280 moveto +126 0 rlineto +0 -22 rlineto +-126 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +272 -280 moveto +144 0 rlineto +0 -21 rlineto +-144 0 rlineto +closepath +eofill +newpath +272 -280 moveto +144 0 rlineto +0 -1 rlineto +-144 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +272 -280 moveto +145 0 rlineto +0 -2 rlineto +-145 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +272 -282 moveto +144 0 rlineto +0 -19 rlineto +-144 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +276 -295 moveto +(VSExternalTimeSyncProtocol) show +newpath +272 -280 moveto +145 0 rlineto +0 -22 rlineto +-145 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +120 -280 moveto +142 0 rlineto +0 -21 rlineto +-142 0 rlineto +closepath +eofill +newpath +120 -280 moveto +142 0 rlineto +0 -1 rlineto +-142 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +120 -280 moveto +143 0 rlineto +0 -2 rlineto +-143 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +120 -282 moveto +142 0 rlineto +0 -19 rlineto +-142 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +124 -295 moveto +(VSInternalTimeSyncProtocol) show +newpath +120 -280 moveto +143 0 rlineto +0 -22 rlineto +-143 0 rlineto +closepath +stroke +newpath +280 -248 moveto +280 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +280 -200 moveto +287 -212 lineto +273 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +280 -200 moveto +287 -212 lineto +273 -212 lineto +closepath +stroke +newpath +168 -248 moveto +168 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +168 -200 moveto +175 -212 lineto +161 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +168 -200 moveto +175 -212 lineto +161 -212 lineto +closepath +stroke +newpath +389 -248 moveto +389 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +389 -200 moveto +396 -212 lineto +382 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +389 -200 moveto +396 -212 lineto +382 -212 lineto +closepath +stroke +newpath +191 -280 moveto +191 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +191 -200 moveto +198 -212 lineto +184 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +191 -200 moveto +198 -212 lineto +184 -212 lineto +closepath +stroke +newpath +344 -280 moveto +344 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +344 -200 moveto +351 -212 lineto +337 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +344 -200 moveto +351 -212 lineto +337 -212 lineto +closepath +stroke +newpath +486 -280 moveto +486 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +486 -200 moveto +493 -212 lineto +479 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +486 -200 moveto +493 -212 lineto +479 -212 lineto +closepath +stroke +newpath +208 -312 moveto +208 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +208 -200 moveto +215 -212 lineto +201 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +208 -200 moveto +215 -212 lineto +201 -212 lineto +closepath +stroke +newpath +368 -312 moveto +368 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +368 -200 moveto +375 -212 lineto +361 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +368 -200 moveto +375 -212 lineto +361 -212 lineto +closepath +stroke +newpath +224 -344 moveto +224 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +224 -200 moveto +231 -212 lineto +217 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +224 -200 moveto +231 -212 lineto +217 -212 lineto +closepath +stroke +newpath +326 -344 moveto +326 -200 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +326 -200 moveto +333 -212 lineto +319 -212 lineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +326 -200 moveto +333 -212 lineto +319 -212 lineto +closepath +stroke +showpage +%%Trailer diff --git a/LaTeX/images/ss-sidebare-variablen.png b/LaTeX/images/ss-sidebare-variablen.png Binary files differnew file mode 100644 index 0000000..ddfefbe --- /dev/null +++ b/LaTeX/images/ss-sidebare-variablen.png |
