From 8606454ddc9d2bf1eb61d0d3cbe689d7c10c57db Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 13 Aug 2008 23:44:50 +0000 Subject: update --- LaTeX/chapters/implementierung.tex | 87 +- LaTeX/diplomarbeit.pdf | 1558 ++++++++++++++++++------------------ 2 files changed, 817 insertions(+), 828 deletions(-) diff --git a/LaTeX/chapters/implementierung.tex b/LaTeX/chapters/implementierung.tex index 90fd713..29e451b 100644 --- a/LaTeX/chapters/implementierung.tex +++ b/LaTeX/chapters/implementierung.tex @@ -229,6 +229,8 @@ Die Kapselung eines \textit{VSAbstractEvent}-Objektes in einem \textit{VSTask}-O 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 berprft periodisch, ob es auszufhrende Ereignisse gibt. Der Task-Manager unterscheidet zwischen globalen und lokalen Ereignissen. Hierbei werden alle globalen Ereignisse (gekapselt in einem \textit{VSTask}-Objekt) in einer Prioritts-Warteschlange (vgl. \cite{Algorithms}, \cite{AlgorithmsC}) abgelegt. Die Prioritts-Warteschlange stellt hierbei die korrekte Ereigniseintrittsreihenfolge sicher. Da sich die lokalen Zeiten aller beteiligten Prozesse voneinander unterscheiden knnen, muss fr jeden Prozess eine separate lokale Prioritts-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 ber eine \textit{java.util.ArrayList} auf alle Prozessobjekte zu und kann somit auch auf alle lokalen Warteschlangen zugreifen und diese verwalten. +Eine Instanz von \textit{VSMessage} stellt eine Nachricht dar, die von einem Prozess verschickt wird. Da \textit{VSMessage} von \textit{VSPrefs} erbt, knnen zwischen zwei Prozessen beliebige Datentypen (s. Tabelle \ref{tb:VariablenDatentypen}.) ber eine Nachricht verschickt werden. Anschlieend wird fr jeden Empfngerprozess ein neues Ereignisobjekt der Klasse \textit{VSMessageReceiveEvent} angelegt, welches eine Referenz der verschickten Nachricht besitzt (s. Abb. \ref{fig:Wrapping}.). Danach wird ein \textit{VSTask}-Objekt instantiiert, in dem die Referenz auf das Ereignisobjekt und das dazugehrige Prozessobjekt sowie die Ereigniseintrittszeit als Attribute gespeichert werden. Das \textit{VSTask}-Objekt wird dann dem Task-Manager bergeben, der das dazugehrige Ereignis ausfhrt, wenn die Ereigniseintrittszeit eingetroffen ist. Via Java-Polymorphie wird hier das \textit{VSMessageReceiveEvent}-Objekt in ein \textit{VSAbstractEvent} umgewandelt und so in \textit{VSTask} abgelegt. + \begin{figure}[h] \centering \includegraphics[width=10.0cm]{images/core} @@ -236,7 +238,9 @@ Jede Simulation besitzt genau eine Instanz von \textit{VSTaskManager}. Eine Inst \label{fig:PackageCore} \end{figure} -Eine Instanz von \textit{VSMessage} stellt eine Nachricht dar, die von einem Prozess verschickt wird. Da \textit{VSMessage} von \textit{VSPrefs} erbt, knnen zwischen zwei Prozessen beliebige Datentypen (s. Tabelle \ref{tb:VariablenDatentypen}.) ber eine Nachricht verschickt werden. Anschlieend wird fr jeden Empfngerprozess ein neues Ereignisobjekt der Klasse \textit{VSMessageReceiveEvent} angelegt, welches eine Referenz der verschickten Nachricht besitzt (s. Abb. \ref{fig:Wrapping}.). Danach wird ein \textit{VSTask}-Objekt instantiiert, in dem die Referenz auf das Ereignisobjekt und das dazugehrige Prozessobjekt sowie die Ereigniseintrittszeit als Attribute gespeichert werden. Das \textit{VSTask}-Objekt wird dann dem Task-Manager bergeben, der das dazugehrige Ereignis ausfhrt, wenn die Ereigniseintrittszeit eingetroffen ist. Via Java-Polymorphie wird hier das \textit{VSMessageReceiveEvent}-Objekt in ein \textit{VSAbstractEvent} umgewandelt und so in \textit{VSTask} abgelegt. +Erwhnenswert ist auch die Klasse \textit{VSMessageStub}, welche ein \textit{VSMessage} kapselt. Ihr Zweck ist das Verstecken einiger Methoden vor dem Protokoll-API, welches fr die Erstellung eigener Protokolle dient. Der Protokoll-Entwickler soll mglichst nichts falsch machen knnen und deswegen soll dem Protokoll-API ein eingeschrnkter Funktionsumfang zur Verfgung gestellt werden. Da sich \textit{VSMessageStub} im selben Paket wie \textit{VSMessage} befindet, kann \textit{VSMessageStub} auf paket-private Methoden 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 Methoden er zugreifen sollte, und auf welche nicht. + +Der Task-Manager speichert anschlieend die Nachrichtenempfangsereignisse in seiner globalen Warteschlange. Die Nachricht kommt bei einem Empfngerprozess an, sobald das Ereignis fr den Empfang eintritt. Fr die korrekte Implementierung der Lamport- und Vektor-Zeitstempel wird jeder Nachricht automatisch eine Referenz auf die Lamport- sowie auf die Vektor-Zeitstempel des sendenden Prozesses als Attribut beigefgt. Fr die berprfung des Protokolls wird in jeder Nachricht auch der Klassenname des jeweiligen Protokolls abgespeichert. \begin{figure}[h] \centering @@ -245,10 +249,6 @@ Eine Instanz von \textit{VSMessage} stellt eine Nachricht dar, die von einem Pro \label{fig:Wrapping} \end{figure} -Erwhnenswert ist auch die Klasse \textit{VSMessageStub}, welche ein \textit{VSMessage} kapselt. Ihr Zweck ist das Verstecken einiger Methoden vor dem Protokoll-API, welches fr die Erstellung eigener Protokolle dient. Der Protokoll-Entwickler soll mglichst nichts falsch machen knnen und deswegen soll dem Protokoll-API ein eingeschrnkter Funktionsumfang zur Verfgung gestellt werden. Da sich \textit{VSMessageStub} im selben Paket wie \textit{VSMessage} befindet, kann \textit{VSMessageStub} auf paket-private Methoden 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 Methoden er zugreifen sollte, und auf welche nicht. - -Der Task-Manager speichert anschlieend die Nachrichtenempfangsereignisse in seiner globalen Warteschlange. Die Nachricht kommt bei einem Empfngerprozess an, sobald das Ereignis fr den Empfang eintritt. Fr die korrekte Implementierung der Lamport- und Vektor-Zeitstempel wird jeder Nachricht automatisch eine Referenz auf die Lamport- sowie auf die Vektor-Zeitstempel des sendenden Prozesses als Attribut beigefgt. Fr die berprfung des Protokolls wird in jeder Nachricht auch der Klassenname des jeweiligen Protokolls abgespeichert. - Eine Instanz von \textit{VSInternalProcess} reprsentiert einen simulierten Prozess. Ein \textit{VSInternalProcess} stellt alle vom Simulator intern verwendeten Methoden zur Verfgung, whrend ein \textit{VSAbstractProcess} lediglich Methoden hat, die der Protokollentwickler fr die Erstellung eigener Protokolle verwenden darf. Da \textit{VSAbstractProcess} abstrakt ist und hiervon keine Instanz gebildet werden darf, muss fr einen neuen Prozesses stets ein \textit{VSInternalProcess}-Objekt erstellt werden. Via Polymorphie wird dieses Objekt nach \textit{VSAbstractProcess} umgewandelt und so dem Protokoll-API zur Verfgung gestellt. Beispielsweise darf mit \textit{getTasks()} nur vom Simulator intern auf die Prioritts-Warteschlangen zugegriffen werden, whrend man im Protokoll-API selbiges vermeiden sollte und dies auch gar nicht direkt mglich ist. Hier wre auch ein Stub-Objekt \textit{VSProcessStub} denkbar gewesen. Da aber fast jede Millisekunde auf die Methoden von \textit{VSInternalProcess} zugegriffen wird, wurde hier aus Performance-Grnden der Weg ber eine Vererbungsstufe preferiert. Alle einstellbaren Prozessvariablen werden von der Klasse \textit{VSPrefs} geerbt. Damit bei Neuberechnungen die Variablen nicht dauernd ber eine \textit{HashMap} von \textit{VSPrefs} zugegriffen werden muss, speichert \textit{VSInternalProcess} aus Performance-Grnden einige Variablen als lokale Kopie ab. Zum Beispiel wird fr die lokale Prozesszeit nicht auf das \textit{HashMap}-Objekt von \textit{VSPrefs}, sondern auf das Klassenattribut \textit{private long localTime} zugegriffen. Vor und nach dem Editieren ber den Prozesseditor werden die \textit{VSPrefs}, bzw. die lokalen Kopien, auf den neuesten Stand gebracht. Selbiges gilt fr weitere Variablen, wie z.B. der Uhrabweichung eines Prozesses. @@ -277,6 +277,8 @@ In diesem Beispiel wurden zwei Ereignisse (Absturz- und Wiederbelebung eines geg In diesem Abschnitt wird auf die Implementierung der Protokolle und das Protokoll-API eingegangen. Im Protokoll-API wird in der Regel nicht direkt auf den Task-Manager und auf die explizite Instantiierung von Ereignisobjekten zurckgegriffen, da dies vom API automatisch durchgef\"{u}hrt wird. +In Abbildung \ref{fig:PackageProtocols}. sind die Pakete \textit{protocols} und \textit{protocols.implementations} dargestellt, welche fr die Protokollimplementierungen zustndig sind. \textit{VSAbstractProtocol} stellt lediglich gemeinsame Methoden und Attribute zur Verfgung, die von allen Protokollen verwendet werden knnen. Jedes Protokoll hat im Paket \textit{protocols.implementations} seine eigene Klasse, die von \textit{VSAbstractProtocol} erbt. Im Prinzip besitzt jedes Prozessobjekt von jedem Protokoll seine eigene Instanz. Bei \textit{10} Protokollen und \textit{3} beteiligten Prozessen werden also \textit{30} Protokollobjekte verwendet. Jedes Protokollobjekt verwaltet sowohl die Server- als auch die Clientseite eines Protokolls auf einmal. Dabei merkt sich \textit{VSAbstractProtocol} anhand einer Flagge, ob der aktuelle Kontext server- oder clientbezogen ist, und fhrt dementsprechend beim Eintreffen von Ereignissen die Server- bzw. Clientmethoden des Protokolls auf. \textit{VSAbstractProtocol} berprft auch, ob ein Client oder ein Server berhaupt aktiviert ist. + \begin{figure}[h] \centering \includegraphics[width=12cm]{images/protocols} @@ -284,8 +286,6 @@ In diesem Abschnitt wird auf die Implementierung der Protokolle und das Protokol \label{fig:PackageProtocols} \end{figure} -In Abbildung \ref{fig:PackageProtocols}. sind die Pakete \textit{protocols} und \textit{protocols.implementations} dargestellt, welche fr die Protokollimplementierungen zustndig sind. \textit{VSAbstractProtocol} stellt lediglich gemeinsame Methoden und Attribute zur Verfgung, die von allen Protokollen verwendet werden knnen. Jedes Protokoll hat im Paket \textit{protocols.implementations} seine eigene Klasse, die von \textit{VSAbstractProtocol} erbt. Im Prinzip besitzt jedes Prozessobjekt von jedem Protokoll seine eigene Instanz. Bei \textit{10} Protokollen und \textit{3} beteiligten Prozessen werden also \textit{30} Protokollobjekte verwendet. Jedes Protokollobjekt verwaltet sowohl die Server- als auch die Clientseite eines Protokolls auf einmal. Dabei merkt sich \textit{VSAbstractProtocol} anhand einer Flagge, ob der aktuelle Kontext server- oder clientbezogen ist, und fhrt dementsprechend beim Eintreffen von Ereignissen die Server- bzw. Clientmethoden des Protokolls auf. \textit{VSAbstractProtocol} berprft auch, ob ein Client oder ein Server berhaupt aktiviert ist. - \begin{figure}[h] \centering \includegraphics[width=10cm]{images/ss-protokollvariablen} @@ -534,9 +534,9 @@ Wenn eine Simulatorversion versucht eine abgespeicherte Simulation eines nicht i \section{GUI sowie Simulationsvisualisierung} -Das Paket \textit{simulator} (s. Abb. \ref{fig:PackageProtocols}.) implementiert die graphische Benutzeroberflche des Simulators. Ausnahmen stellen die Editorklassen in \textit{prefs.editors} sowie die Klasse \textit{utils.VSFrame} dar. +Das Paket \textit{simulator} (s. Abb. \ref{fig:PackageProtocols}.) enthlt die Implementierung der graphischen Benutzeroberflche des Simulators. Einzigste Ausnahmen sind die Editorklassen in \textit{prefs.editors} sowie die Klasse \textit{utils.VSFrame} dar. -Beim Starten des Simulators wird auf \textit{main}-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instantiiert ein \textit{VSDefaultPrefs}-Objekt, worin alle Standardeinstellungen des Simulators abgelegt sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (s. Abb. \ref{fig:NeuesFenster}.) implementiert. Das Simulatorfenster erstellt fr jede neue Simulation jeweils ein Objekt der Klasse \textit{VSSimulator}, wobei jede Simulation im Simulationsfenster einen eigenen Tab besitzt (s. Abb. \ref{fig:NeuErstellteSimulation}., unten links). Jede Simulation besitzt dabei eine eigene Simulationsnummer. Jedes \textit{VSSimulator}-Objekt greift auf die Klasse \textit{VSSimulatorVisualization} zurck, welche die Simulationsvisualisierung (s. Abb. \ref{fig:Visualisierung}.) implementiert. +Beim Starten des Simulators wird die \textit{main}-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instantiiert ein \textit{VSDefaultPrefs}-Objekt, in welchem alle Standardeinstellungen des Simulators definiert sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (s. Abb. \ref{fig:NeuesFenster}.) implementiert. Das Simulatorfenster erstellt fr jede neue Simulation jeweils ein Objekt der Klasse \textit{VSSimulator}, wobei jede Simulation im Simulationsfenster einen eigenen Tab besitzt (s. Abb. \ref{fig:NeuErstellteSimulation}., unten links). Jede Simulation besitzt dabei eine eigene Simulationsnummer. Jedes \textit{VSSimulator}-Objekt greift auf die Klasse \textit{VSSimulatorVisualization} zurck, welche die Visualisierung der Simulation realisiert (s. Abb. \ref{fig:Visualisierung}.) . \begin{figure}[h] \centering @@ -545,27 +545,27 @@ Beim Starten des Simulators wird auf \textit{main}-Methode, welche sich in \text \label{fig:PackageProtocols} \end{figure} -\textit{VSSimulatorVisualization} greift auf Java's Grafikbibliothek Java2D (siehe \cite{Java2d}, \cite{Java2DAPI}, \cite{Games}) zurck und ist aus Performance-Grnden mit dem Simulationsverlauf stark verzahnt. Klassenattribute, die von Simulationseinstellungen und den Fenstergr\"{o}en abhngigig sind, werden nur wenn es ntig ist neu berechnet. +\textit{VSSimulatorVisualization} greift auf Java's Grafikbibliothek Java2D (siehe \cite{Java2d}, \cite{Java2DAPI}, \cite{Games}) zu und ist zur Optimierung der Performance mit dem Simulationsverlauf stark verzahnt. Klassenattribute, die von Simulationseinstellungen und den Fenstergr\"{o}en abhngigig sind, werden so nur dann neu neu berechnet wenn dies erforderlich ist. -Die Klasse \textit{VSMenuItemStates} wird fr die Synchronisierung des Simulationsstatusses verwendet. Abhngig davon kann der Benutzer bestimmte Aktionen durchfhren oder nicht. Zum Beispiel kann eine Simulation nur pausiert werden, wenn sie aktuell abgespielt wird. Alle hier mglichen Aktionen sind bereits aus Kapitel 2.1. bekannt. +Die Klasse \textit{VSMenuItemStates} wird fr die Synchronisierung der graphischen Elemente des GUI's mit dem Status der Simulation verwendet. Abhngig vom Simulationsstatus kann der Benutzer bestimmte Aktionen entweder durchfhren oder nicht. Zum Beispiel kann eine Simulation nur pausiert werden, wrend sie abgespielt wird. Alle hier mglichen Aktionen sind bereits aus Kapitel 2.1. bekannt. -Die Klasse \textit{VSCreateTask} wird vom Ereigniseditor verwendet. Der Ereigniseditor (s. Abb. \ref{fig:SidebarMitEreignissen}.) wird in der Klasse \textit{VSSimulator} implementiert. Hinter jeder Ereignisauswahl verbirgt sich ein \textit{VSCreateTask}-Objekt, welches angibt wie das ein Ereignis anzulegen ist. +Die Klasse \textit{VSCreateTask} wird vom Ereigniseditor verwendet. Der Ereigniseditor (s. Abb. \ref{fig:SidebarMitEreignissen}.) wird in der Klasse \textit{VSSimulator} implementiert. Hinter jeder Ereignisauswahl verbirgt sich ein \textit{VSCreateTask}-Objekt, welches vorgibt wie das ein Ereignis anzulegen ist. -Die Klasse \textit{VSLogging} kapselt f\"{u}r das Loggen von Nachrichten ein \textit{JTextArea}-Objekt ein. In dieser Klasse werden alle Logfunktionen implementiert. Die \textit{JTextArea} wird f\"{u}r die Darstellung dem Simulationsobjekt \textit{VSSimulator} \"{u}bergeben. Fr den Logfilter wird auf das Java-Standardpaket \textit{java.util.regex} (s. \cite{Regexp}) zugegriffen, womit anhand von regulren Ausdrcken in Java-Syntax die Logs gefiltert werden knnen (s. Kap. 2.2.2. im Abschnitt Logfilter). +Die Klasse \textit{VSLogging} kapselt f\"{u}r das Loggen von Nachrichten die Attribute eines \textit{JTextArea}-Objektes. In dieser Klasse werden alle Logfunktionen implementiert. Die \textit{JTextArea} wird f\"{u}r die Darstellung dem Simulationsobjekt \textit{VSSimulator} \"{u}bergeben. Fr den Logfilter wird auf das Java-Standardpaket \textit{java.util.regex} (s. \cite{Regexp}) zugegriffen. Dadurch knnen anhand von regulren Ausdrcken in Java-Syntax die Logs gefiltert werden (s. Kap. 2.2.2.). \subsubsection{Threads und Zeitsynchronisierung} -Der Simulator soll auf jede Millisekunde genau simulieren k\"{o}nnen und jede simulierte Sekunde soll dabei relativ zur echten Zeit fortschreiten. Die Simulationsabspielgeschwindigkeit lsst sich bei den Simulationseinstellungen unter ``Abspielgeschwindigkeit der Simulation'' (Float: \textit{sim.clock.speed}) einstellen (s. Kap. 2.4.2.). Hierf\"{u}r muss folgendes bercksichtigt werden: +Der Simulator soll auf die Millisekunde genau simulieren k\"{o}nnen und dabei soll jede simulierte Sekunde relativ zur echten Zeit fortschreiten. Die Simulationsabspielgeschwindigkeit lsst sich bei den Simulationseinstellungen unter ``Abspielgeschwindigkeit der Simulation'' (Float: \textit{sim.clock.speed}) einstellen (s. Kap. 2.4.2.). Hierf\"{u}r muss folgendes bercksichtigt werden: \begin{itemize} - \item Das Zeichnen der Visualisierung bentigt pro Aktualisierung einige Millisekunden. Hier werden stndig mathematische Berechnungen (z.B. die Berechnung einer Nachrichtenlinie, die automatische Skalierung des Diagramms, u.s.w.) durchgef\"{u}hrt. - \item Das Neuberechnen der Simulation bentigt pro Aktualisierung einige Millisekunden. Hier wird insbesondere der Task-Manager beansprucht, welcher berprft, ob Ereignisse auszufhren sind. - \item Jeder simulierte Prozess sollte mit der selben Geschwindigkeit fortschreiten, und dies auf jedem Betriebssystem und auf jeder Architektur. Da Java-Threads nicht komplett plattformunabhngig sind (Threads sind im Betriebssystem implementiert), k\"{o}nnte das Verhalten auf verschiedenen Betriebssystemen oder Architekturen variieren. Auerdem bernimmt das Betriebssystem die Entscheidung, wann welcher Thread arbeiten darf. Auer man synchronisiert Threads manuell so, dass sie den eigenen Ansprchen entsprechen. Letzteres bedeutet aber auch mehr Programmieraufwand. - \item Die Simulationszeit ist stets in Millisekunden angegeben und sie wird intern in einer \textit{long}-Variable abgespeichert. Somit kann eine Simulationszeit immer nur den Wert einer ganze Zahl betragen. Berechnungsrundungsfehler wegen \textit{sim.clock.speed} (s. Kap. 2.4.2.) mssen bercksichtigt werden. - \item Der Simulator soll nicht stndig die komplette CPU des Anwender-Computers voll auslasten. + \item Das Zeichnen der Visualisierung bentigt pro Aktualisierung einige Millisekunden. Hier werden stndig mathematische Berechnungen wie z.B. die Berechnung einer Nachrichtenlinie oder die automatische Skalierung des Diagramms durchgef\"{u}hrt. + \item Das Neuberechnen der Simulation bentigt pro Aktualisierung einige Millisekunden. Hier arbeitet insbesondere der Task-Manager, welcher berprft, ob Ereignisse auszufhren sind. + \item Jeder simulierte Prozess sollte mit der selben Geschwindigkeit fortschreiten, und dies auf jedem Betriebssystem und auf jeder Architektur. Da Threads auf Betriebssystemebene implementiert sind sind Java-Threads nicht komplett plattformunabhngig. Dadurch kann das Verhalten auf je nach Betriebssystem und Architekturen variieren. Insbesondere bernimmt das Betriebssystem die Entscheidung, wann welcher Thread arbeiten darf. + \item Die Simulationszeit wird stets in Millisekunden angegeben und sie wird intern in einer \textit{long}-Variable abgespeichert. Somit kann eine Simulationszeit immer nur den Wert einer ganze Zahl betragen. Berechnungsrundungsfehler durch \textit{sim.clock.speed} (s. Kap. 2.4.2.) mssen bercksichtigt werden. + \item Der Simulator soll die komplette CPU des Anwender-Computers nicht konstant auslasten. \end{itemize} -Es wurde eine Lsung gewhlt, bei der lediglich ein einziger Thread fr die Visualisierung und die Berechnung der Simulation zustndig ist. Der Algorithmus verluft in leicht vereinfachter Form wie folgt ab: +Es wurde eine Lsung gewhlt, bei der lediglich ein einziger Thread fr die Visualisierung und die Berechnung der Simulation zustndig ist. Der Algorithmus verluft in vereinfachter Form wie folgt ab: \begin{enumerate} \item Die aktuelle simulierte globale Zeit sei $t$ und die globale Zeit wo die Simulation endet sei $e$. @@ -581,13 +581,13 @@ for (i = t; i < t + v + p && i < e; i++) \item Bei Punkt 2 mit neuer Startzeit $t := t + v + p$ weitermachen. \end{enumerate} -Zus\"{a}tzlich muss noch die Simulationsvariable \textit{sim.clock.speed} ber\"{u}cksichtigt werden. Sie wurde wegen der bersicht im obigen Algorithmus nicht ber\"{u}cksichtigt. Intern hat der Simulator jeweils die echte Zeit und die Simulationszeit abgespeichert. Es werden stndig die verstrichenen echten Zeiten gemessen und anschlieend anhand von \textit{sim.clock.speed} die neuen tatschlichen Simulationszeiten berechnet. Die Rundungsfehler werden pro Durchgang in eine \textit{double}-Variable (Fliekommazahl doppelter Genauigkeit) abgespeichert. Wenn der Betrag der Rundungsfehler $>= 1$ ist, dann wird davon der ganze Werteanteil in der Simulationszeit bercksichtigt. F\"{u}r jede lokale Prozesszeit sowie der dazugeh\"{o}rigen lokalen Uhrabweichung wird \"{a}hnlich verfahren. +Zus\"{a}tzlich muss noch die Simulationsvariable \textit{sim.clock.speed} ber\"{u}cksichtigt werden. Sie wurde zur verbesserten bersicht im obigen Algorithmus nicht extra angegeben. Intern speichert der Simulator jeweils die echte Zeit und die Simulationszeit. Die verstrichenen echten Zeiten werden dabei stndig gemessen und anschlieend mit \textit{sim.clock.speed} die neuen tatschlichen Simulationszeiten berechnet. Die Rundungsfehler werden pro Durchgang in einer \textit{double}-Variable (Fliekommazahl doppelter Genauigkeit) abgespeichert. Wenn der Betrag der Rundungsfehler $>= 1$ ist, dann wird davon der gesamte Werteanteil in der Simulationszeit bercksichtigt. F\"{u}r jede lokale Prozesszeit sowie der dazugeh\"{o}rigen lokalen Uhrabweichung wird \"{a}hnlich verfahren. -Jede Simulation besitzt somit seinen eigenen Simulationsthread. Des Weiteren gibt es noch den Java Swing-Thread (s. \cite{Swing}), der fr die GUI und somit auch f\"{u}r die Anwenderinteraktion zustndig ist. Der Anwender kann zu jedem Zeitpunkt in die Simulation eingreifen, weshalb alle Anwendereingriffe synchronisiert werden. +Jede Simulation besitzt somit seinen eigenen Simulationsthread. Des Weiteren gibt es noch den Java Swing-Thread (s. \cite{Swing}), der fr das GUI und f\"{u}r die Anwenderinteraktion zustndig ist. Der Anwender kann zu jedem Zeitpunkt in die Simulation eingreifen, weswegen die Behandlund derAnwendereingriffe synchronisiert wurde. \section{Serialisierung und Deserialisierung von Simulationen} -Der Anwender kann eine erstellte Simulation im Datei-Men speichern oder eine bereits abgespeicherte Simulation laden. Hierbei wird von der aus Java angebotenen Mglichkeit Objekte zu Serialisieren Gebrauch gemacht. Im Paket \textit{serialize} (s. Abb. \ref{fig:PackageSerialize}.) befinden sich Helfer, die bei der Serialisierung einer Simulation unterst\"{u}tzend sind. +Der Anwender kann eine erstellte Simulation im Datei-Men speichern oder eine bereits abgespeicherte Simulation laden. Hierbei wird von der aus Java angebotenen Mglichkeit Objekte zu Serialisieren Gebrauch gemacht. Im Paket \textit{serialize} (s. Abb. \ref{fig:PackageSerialize}.) befinden sich Hilfsklassen, die die Serialisierung einer Simulation unterst\"{u}tzen. Da nicht alle Daten f\"{u}r die Speicherung einer Simulation relevant sind, wird nur eine Auswahl von Klassenattributen serialisiert. Zum Beispiel werden alle Simulationseinstellungen serialisiert, nicht jedoch GUI-Objekte. Alle serialisierbaren Klassen implementieren das Interface \textit{VSSerializable} mit folgenden zwei Methoden: @@ -596,7 +596,7 @@ Da nicht alle Daten f\"{u}r die Speicherung einer Simulation relevant sind, wird \item \textit{public void deserialize(VSSerialize serialize, ObjectInputStream ois)}: Diese Methode wird bei jedem Deserialisierungsvorgang aufgerufen (Laden einer Simulation). \end{itemize} -Die Methoden \textit{serialize} und \textit{deserialize} erhalten neben einem Dateistream auch ein \textit{VSSerialize}-Objekt als \"{U}bergabeparameter. Fr jeden Serialisierungsvorgang wird zuerst ein Objekt der Klasse \textit{VSSerialize} erstellt. Eine zu serialisierende Simulation besteht aus vielen voneinander abhngigen Objekten. Jedes Objekt kann dabei Referenzen auf andere Objekte besitzen. Wrde jedes Objekt komplett serialisiert werden, so wrden Objekte, auf denen mehrere Referenzen existierten, in mehrfacher Ausfhrung behandelt werden. Bei Kreisverweisen (Objekt A hat eine Referenz auf Objekt B und Objekt B hat eine Referenz auf Objekt A als Attribut gespeichert) wrde die Serialisierung sogar in einer Endlosschleife enden. \textit{VSSerialize} hilft hierbei dies zu vermeiden und merkt sich Informationen von allen bereits serialisierten Objekten, so dass jedes Objekt genau einmal serialisiert wird. Bei der Deserialisierung hilft eine Instanz von \textit{VSSerialize} dabei, alle Objekte wieder mit den richtigen Referenzen auszustatten. +Die Methoden \textit{serialize} und \textit{deserialize} erhalten neben einem Dateistream auch ein \textit{VSSerialize}-Objekt als \"{U}bergabeparameter. Fr jeden Serialisierungsvorgang wird zuerst ein Objekt der Klasse \textit{VSSerialize} erstellt. Eine zu serialisierende Simulation besteht aus einer Vielzahl von einander abhngigen Objekten. Jedes Objekt kann dabei Referenzen auf andere Objekte besitzen. Wrde jedes Objekt komplett serialisiert werden, so wrden Objekte, auf denen mehrere Referenzen existierten, in mehrfacher Ausfhrung behandelt werden. Bei Kreisverweisen (Objekt A referenziert Objekt B welches ebenfalls eine Referenz auf Objetkt A besitzt) wrde die Serialisierung sogar in einer Endlosschleife enden. \textit{VSSerialize} hilft hierbei dies zu vermeiden und merkt sich Informationen von allen bereits serialisierten Objekten, so dass jedes Objekt genau einmal serialisiert wird. Bei der Deserialisierung hilft eine die Klasse \textit{VSSerialize} dabei, alle Objekte wieder mit den richtigen Referenzen auszustatten. \begin{figure}[h] \centering @@ -607,7 +607,7 @@ Die Methoden \textit{serialize} und \textit{deserialize} erhalten neben einem Da Alle Klassen, die \textit{VSSerializePrefs} erweitern, knnen komfortabel smtliche Einstellungen serialisieren. Beispielsweise speichert der Simulator alle seine globalen Simulationseinstellungen bei einer Serialisierung automatisch ab. Bei den Prozessen und den Ereignissen (und somit auch Protokollen) gilt selbiges analog. -Abgespeicherte Simulationen sollen auch mit zuknftigen Versionen des Simulators kompatibel bleiben. Deshalb werden alle Objekte aller Klassen, die \textit{VSSerializable} implementieren, nicht komplett serialisiert. Bei der Serialisierung werden nur relevante Klassenattribute, die der Simulationsprogrammierung, und nicht beispielsweise GUI-Komponenten angehren, serialisiert. Eine Erweiterung des GUIs muss somit nicht bei den Serialisierungen ber\"{u}cksichtigt werden. +Abgespeicherte Simulationen sollen auch mit zuknftigen Versionen des Simulators kompatibel bleiben. Deshalb werden alle Objekte aller Klassen, die \textit{VSSerializable} implementieren, nicht komplett serialisiert. Bei der Serialisierung werden nur relevante Klassenattribute, die der Simulationsprogrammierung, und nicht z.B. der GUI-Komponenten angehren, serialisiert. Eine Erweiterung des GUIs muss somit nicht bei den Serialisierungen ber\"{u}cksichtigt werden. \subsubsection{Beispielimplementierung einer \textit{serialize}-Methode} @@ -627,13 +627,12 @@ Der folgende Quelltext-Ausschnitt zeigt eine Beispielimplementierung von \textit } \end{code} -Vor und nach der eigentlichen Objektserialisierung wird jeweils eine boolesche Flagge mit dem Standardwert \textit{false} serialisiert. Sobald in einer sp\"{a}teren Simulator-Versionen weitere zu serialisierenden Klassenattribute hinzukommen, dann kann bei der Deserialisierung diese Flagge abgefragt und separat behandelt werden. Somit bleiben ltere bereits abgespeicherte Simulationen stets zur neusten Version des Simulators kompatibel. Wenn eine Flagge auf \textit{true} gesetzt wird, dann kann unter den neuen Attributserialisierungen eine weitere Flagge gesetzt werden, wodurch beliebig viele Erweiterungen in die Serialisierung sukzessiv einbaubar sind. +Vor und nach der eigentlichen Objektserialisierung wird jeweils eine boolesche Flagge mit dem Standardwert \textit{false} serialisiert. Sobald in einer sp\"{a}teren Simulator-Versionen weitere zu serialisierenden Klassenattribute hinzukommen, dann kann bei der Deserialisierung diese Flagge abgefragt und separat behandelt werden. Somit bleiben ltere bereits abgespeicherte Simulationen stets zu neueren Version des Simulators kompatibel. Wenn eine Flagge auf \textit{true} gesetzt wird, dann kann unter den neuen Attributserialisierungen eine weitere Flagge gesetzt werden, wodurch beliebig viele Erweiterungen in die Serialisierung sukzessiv einbaubar sind. -Das zu serialisierende Objekt besitzt hier lediglich zwei zu serialisierende Attribute. Mit \textit{serialize.setObject} speichert \textit{serialize} eine Referenz auf das aktuelle Objekt ab, worauf folgende Objektserialisierungen zurckgreifen knnen. Danach wird ein \textit{process} und \textit{someOtherSerializableObject} serialisiert. Die Deserialisierung folgt genau in der umgekehrten Reihenfolge, wobei ein Objekt von \textit{VSSerialize} hierbei hilft die Referenzen auf andere Objekte korrekt zu setzen. +Das zu serialisierende Objekt besitzt hier lediglich zwei zu serialisierende Attribute. Mit \textit{serialize.setObject} speichert \textit{serialize} eine Referenz auf das aktuelle Objekt ab, worauf folgende Objektserialisierungen zurckgreifen knnen. Danach wird ein \textit{process} und \textit{someOtherSerializableObject} serialisiert. Die Deserialisierung erfolgt genau in umgekehrter Reihenfolge, wobei ein Objekt von \textit{VSSerialize} hilft die Referenzen auf andere Objekte korrekt zu setzen. In Abbildung \ref{fig:SequenceSerialize} ist die komplette Sequenz f\"{u}r die Serialisierung (das Abspeichern) einer Simulation angegeben. Zuerst wird \textit{serialize} auf die globalen Simulationseinstellungen (\textit{VSPrefs}) und dem Simulatorobjekt (\textit{VSSimulator}) ausgefhrt. Das Simulator-Objekt fhrt \textit{serialize} wiederum auf das \textit{VSSimulatorVisualization}-Objekt aus. Dort wird jeder Prozess inklusive alle Protokollobjekte serialisiert. Anschlieend folgt der Task-Manager mit allen programmierten Ereignissen. - \section{Helferklassen und Klassen fr Ausnahmebehandlungen} Es wurden noch nicht die Klassen der Pakete \textit{utils} (s. Abb. \ref{fig:PackageUtils}.) sowie \textit{exceptions} (s. Abb. \ref{fig:PackageExceptions}.) vorgestellt. \textit{utils} fasst lediglich einige Helferklassen zusammen, die vom restlichen Quelltext verwendet werden. @@ -646,14 +645,14 @@ Es wurden noch nicht die Klassen der Pakete \textit{utils} (s. Abb. \ref{fig:Pac \end{figure} \begin{itemize} - \item \textit{VSFrame}: Alle Objekte, die ein eigenes Swing-Fenster besitzen, erben von der Klasse \textit{VSFrame}. Sie stellt sicher, dass neue Fenster an der richtigen Position der Bildflche platziert werden und dass Unterfenster (Fenster, die aus einem anderen Fenster heraus geffnet wurden) automatisch mit geschlossen werden, sobald eines ihrer ``Erzeugerfenster'' geschlossen wird. + \item \textit{VSFrame}: Alle Objekte, die ein eigenes Swing-Fenster besitzen, erben von der Klasse \textit{VSFrame}. Sie stellt sicher, dass neue Fenster an der richtigen Position der Bildflche platziert werden und dass Unterfenster (Fenster, die aus einem anderen Fenster heraus geffnet wurden) automatisch mit geschlossen werden, sobald ihr jeweiliges ``Erzeugerfenster'' geschlossen wird. \item \textit{VSAboutFrame}: Dieses Fenster implementiert die ``About-Anzeige'' die im Simulator ber das Datei-Men aufgerufen werden kann. \item \textit{VSInfoArea}: Ist fr die Textanzeige in \textit{VSAboutFrame} zustndig. - \item \textit{VSClassLoader}: Diese Klasse wird fr die automatische Instantiierung von Ereignisobjekten bentigt, wenn dem Simulator lediglich die Klassennamen (aus \textit{events.VSRegisteredEvents}) bekannt sind. - \item \textit{VSHelper}: In dieser Klasse befinden sich statische Helfermethoden, die in keine andere Klasse passen. + \item \textit{VSClassLoader}: Diese Klasse wird fr die automatische Instanzierung von Ereignisobjekten bentigt, wenn dem Simulator lediglich die Klassennamen (aus \textit{events.VSRegisteredEvents}) bekannt sind. + \item \textit{VSHelper}: In dieser Klasse befinden sich statische Helfermethoden, die in keine andere Klasse gehren. \item \textit{VSPriorityQueue}: Diese Klasse wird fr das Verwalten von \textit{core.VSTask}-Objekte im Task-Manager bentigt. \textit{VSPriorityQueue} passt die Prioritts-Warteschlange aus der Java-Standardbibliothek den Anforderungen des Simulators an. \item \textit{VSRandom}: Wird fr Zufallsereignisse bentigt. Jedes Prozessobjekt besitzt einen solchen eigenen Pseudozufallsgenerator. Diese Klasse setzt gleichzeitig einen eigenen Seed basierend auf der lokalen Systemzeit und anderer Berechnungen fest. - \item \textit{VSTupel}: Diese Klasse ist eine Implementierung eines sehr einfach aufgebauten 3-Tupel Datentyps. Alle 3 Elemente knnen von einem anderen Typ sein, was mit Hilfe der Java-Generics verwirklicht wurde. \textit{VSTupel} wird von den Editorklassen fr die Generierung von GUI-Elementen bentigt. + \item \textit{VSTupel}: Diese Klasse ist eine Implementierung eines einfach aufgebauten 3-Tupel Datentyps. Alle 3 Elemente knnen von einem anderen Typ sein, was mit Hilfe der Java-Generics verwirklicht wurde. \textit{VSTupel} wird von den Editorklassen fr die Generierung von GUI-Elementen bentigt. \end{itemize} \begin{figure}[h] @@ -663,7 +662,7 @@ Es wurden noch nicht die Klassen der Pakete \textit{utils} (s. Abb. \ref{fig:Pac \label{fig:PackageExceptions} \end{figure} -Im Paket \textit{exceptions} befinden sich lediglich einige Klassen, die fr Ausnahmebehandlungen verwendet werden. \textit{VSNotCopyableException} wird whrend eines Kopierversuch eines nicht-kopierbaren Ereignisses geworfen. \textit{VSNegatieNumberException} wird geworfen, wenn negative Zahlen dort auftreten, wo sie es nicht sollten. Wenn ein Editorobjekt die Benutzereingabe einer Integer-Vektor-Variable nicht parsen kann, so greifen es auf \textit{VSParseIntegerVectorException} zurck. +Im Paket \textit{exceptions} befinden sich Klassen, die fr Ausnahmebehandlungen verwendet werden. \textit{VSNotCopyableException} wird whrend eines Kopierversuch eines nicht-kopierbaren Ereignisses geworfen. \textit{VSNegatieNumberException} wird geworfen, wenn negative Zahlen dort auftreten, wo sie es nicht sollten. Wenn ein Editorobjekt die Benutzereingabe einer Integer-Vektor-Variable nicht parsen kann, so greift es auf \textit{VSParseIntegerVectorException} zurck. \begin{figure} \centering @@ -676,37 +675,37 @@ Im Paket \textit{exceptions} befinden sich lediglich einige Klassen, die f \section{Programmierrichtlinien} -Die Programmierrichtlinien entsprechen in den meisten Fllen denen aus \cite{OOS} (siehe auch \cite{Richtlinien}). +Die Programmierrichtlinien entsprechen idr. denen aus \cite{OOS} (vgl. auch \cite{Richtlinien}). Die \textit{main}-Methode befindet sich in der Klasse \textit{simulator.VSMain}. \begin{itemize} \item Es wird kein Gebrauch vom Java-Standardpaket gemacht. Alle Klassen befinden sich somit in explizit angegebenen Paketen (z.B. \textit{events.implementations}). - \item Alle Klassen- und Interfacenamen beginnen mit groen Buchstaben, whrend alle Variablen-, Methoden- und Attributnamen mit kleinen Buchstaben beginnen. Namen finaler Variablen und Attribute sind komplett in Grobuchstaben gehalten. + \item Alle Namen von Klassen und Interfaces beginnen mit groen Buchstaben, whrend alle Variablen-, Methoden- und Attributnamen mit kleinen Buchstaben beginnen. Namen finaler Variablen und Attribute bzw. Konstanten sind komplett in Grobuchstaben gehalten. \item Alle Quelltext-Dateien besitzen einen Header, der Informationen der verwendeten Lizenz angibt. - \item Alle Quelltext-Dateien werden vollstndig mit Javadoc dokumentiert. + \item Alle Quelltext-Dateien sind vollstndig mit Javadoc dokumentiert. \item Der komplette Quelltext inklusive Dokumentation wird in englischer Sprache verfasst. - \item Eine Quelltext-Datei hat eine maximale Zeilenlnge von 80 Zeichen, was der Standardbreite eines UNIX-Terminals entspricht. Eine Ausnahme stellt die Klasse \textit{prefs.VSDefaultPrefs} dar, denn hier befinden sich auch lngere Texte die in Strings abgespeichert werden und wo manuelle Zeilenumbrche wenig Sinn ergeben. + \item Eine Quelltext-Datei hat eine maximale Zeilenlnge von 80 Zeichen, was der Standardbreite eines UNIX-Terminals entspricht. Eine Ausnahme stellt die Klasse \textit{prefs.VSDefaultPrefs} dar, denn hier befinden sich auch lngere Texte die in Strings abgespeichert werden mssen. \item Es werden zuerst Klassen aus der Java-Standardbibliothek importiert, bevor Klassen aus dem VS-Simulator selbst importiert werden. \item Fr die Einrckung des Quelltextes wird das Tool \textit{astyle} mit den Aufrufparametern \textit{--style=java --mode=java} verwendet. Hierbei wird eine Einrckungslnge von 4 Zeichen verwendet. - \item Namen aller Klassen und Interfaces tragen als Prfix stets \textit{VS}, was fr Verteilte Systeme steht. + \item Namen aller Klassen und Interfaces tragen als Prfix stets \textit{VS}. Die Abkrzung VS steht hierbei fr Verteilte Systeme. \item Namen abstrakter Klassen tragen als Prfix stets \textit{VSAbstract}. \item Namen aller Protokollklassen tragen als Postfix \textit{Protocol} (z.B. \textit{VSPingPongProtocol}). \item Namen aller Ereignisklassen die keine Protokolle implementieren, tragen als Postfix \textit{Event} (z.B. \textit{VSProcessCrashEvent}). \item Namen aller dejenigen Klassen die ein Fenster implementieren, tragen als Postfix \textit{Frame} (z.B. \textit{VSSimulatorFrame}). - \item berall wo es Sinn ergibt werden Java-Generic-Datentypen verwendet (z.B. \textit{java.util.Vector} anstelle von \textit{java.util.Vector}). + \item berall wo es erforderlich ist werden Java-Generic-Datentypen verwendet (z.B. \textit{java.util.Vector} anstelle von \textit{java.util.Vector}). \end{itemize} \section{Entwicklungsumgebung} -In diesem Teilkapitel soll ein kleiner Einblick in die Umgebung, in der der Simulator entwickelt wurde, gewhrt werden. Fr diese Diplomarbeit wurde ausschlielich Open Source Software verwendet. Die einzige Ausnahme stellt Microsoft Windows XP dar, worauf der Simulator zustzlich getestet wurde. Der Simulator wurde jedoch hauptschlich unter dem Betriebssystem FreeBSD 7.0, was ein Open Source Unix-Derivat ist, programmiert. +In diesem Teilkapitel soll ein kleiner Einblick in die Umgebung, in der der Simulator entwickelt wurde, gewhrt werden. Fr diese Diplomarbeit wurde ausschlielich Open Source Software verwendet. Die einzige Ausnahme stellt das Betriebssystem Microsoft Windows XP dar, auf welchem der Simulator zustzlich getestet wurde. Der Simulator wurde jedoch hauptschlich unter dem Betriebssystem FreeBSD 7.0, einem Open Source Unix-Derivat, programmiert. -Wie bereits bekannt ist, wurde Sun's Java, was mittlerweile auch Open Source Software ist, in der Version 6 (1.6) als die Implementierungssprache gewhlt und fr die Quelltextdokumentation kam Javadoc, fr die automatische Quelltexteinrckung astyle und als Java-Referenz kam \cite{Javadoc} zum Einsatz. Als Built-Tool wurde hier auf Apache Ant (s. \cite{AntManual} und \cite{AntIntro}) zur\"{u}ckgegriffen. +Wie bereits bekannt ist, wurde die Programmiersprache Java von Sun Microsystems in der Version 6 (1.6) als Implementierungssprache fr den Simulator gewhlt. Fr die Quelltextdokumentation wurde Javadoc, fr die automatische Quelltexteinrckung astyle und als Java-Referenz kam \cite{Javadoc} zum Einsatz. Als Built-Tool wurde hier auf Apache Ant (s. \cite{AntManual} und \cite{AntIntro}) zur\"{u}ckgegriffen. -Als Versionierungssystem wurde SVN (Subversion) verwendet. Fr den Zugriff auf das SVN-Repository mittels HTTPS (Hypertext Transfer Protocol Secure) wurde der Apache-Webserver mit WebDAV-Plugin verwendet. Zudem kam WebSVN als Webschnittstelle des SVN-Repository zum Einsatz. Mozilla Firefox diente fr das Betrachten der Javadocs und der WebSVN-Oberflche. +Als Versionierungssystem wurde SVN (Subversion) verwendet. Fr den Zugriff auf das SVN-Repository mittels HTTPS (Hypertext Transfer Protocol Secure) wurde der Apache-Webserver mit WebDAV-Plugin verwendet. Zudem kam WebSVN als Webschnittstelle des SVN-Repository zum Einsatz. Mozilla Firefox diente dabei dem Betrachten der Javadocs und dem Bedienen der WebSVN-Oberflche. -Fr das Schreiben von Java-Quelltext wurde GVim (Graphical Vi IMproved) sowie Eclipse verwendet. Eclipse untersttzt bessere Code-Refactoring-Methoden, whrend GVim mit seiner Flexibilitt und schnelleren Editiermglichkeiten und mit Vim-Script, der eigenen Script-Engine, glnzt. Es wurden auerdem das JAutoDoc- (fr die Erstellung von Javadoc-Kommentare) und das Subversion-Eclipse-Plugin verwendet. Je nach Zweck wurde zwischen diesen beiden Umgebungen gewechselt. Fr das Verfassen des LaTeX-Dokumentes wurde GVim verwendet. +Fr das Schreiben des Java-Quelltextes wurde Graphical Vi IMproved (GVim) sowie die Entwickungsumgebung Eclipse verwendet. Eclipse bietete bessere Code-Refactoring-Methoden, whrend GVim mit seiner Flexibilitt und schnelleren Editiermglichkeiten in Verbindung mit seiner Script Engine Vim-Script besonders effektiv ist. Es wurden auerdem das JAutoDoc zur Erstellung von Javadoc-Kommentaren und fr die Konnektivitt mit dem SVN Server das Subversion-Eclipse-Plugin verwendet. Je nach Anforderung wurde zwischen diesen beiden Umgebungen gewechselt. Fr das Verfassen des LaTeX-Dokumentes wurde ebenfalls GVim verwendet. -Fr die Erstellung dieses PDF-Dokumentes wurde LaTeX in Verbindung mit dem Built-Tool GNU Make und Rubber verwendet. Eine Rechtschreibberprfung wurde mit aspell sowie OpenOffice.org durchgefhrt. xPDF diente als PDF-Anzeigeprogramm. +Fr die Erstellung dieses PDF-Dokumentes wurde LaTeX in Verbindung mit dem Built-Tool GNU Make und Rubber verwendet. Eine Rechtschreibberprfung wurde mit aspell sowie OpenOffice.org durchgefhrt. xPDF diente dabei als PDF-Anzeigeprogramm. Smtliche UML-Diagramme wurden mit ArgoUML angefertigt und die Screenshots mit The GIMP (GNU Image Manipulation Program) sowie ImageMagick nachbearbeitet. Mit dem zip-Programm wurden alle VS-Simulator Distributionen verpackt. diff --git a/LaTeX/diplomarbeit.pdf b/LaTeX/diplomarbeit.pdf index 41687b9..52996ce 100644 --- a/LaTeX/diplomarbeit.pdf +++ b/LaTeX/diplomarbeit.pdf @@ -1482,8 +1482,8 @@ endobj 404 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080814002410Z00'00') -/ModDate (D:20080814002410Z00'00') +/CreationDate (D:20080814014212Z00'00') +/ModDate (D:20080814014212Z00'00') >> endobj 405 0 obj @@ -1576,8 +1576,8 @@ endobj 414 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080814002409Z00'00') -/ModDate (D:20080814002409Z00'00') +/CreationDate (D:20080814014211Z00'00') +/ModDate (D:20080814014211Z00'00') >> endobj 415 0 obj @@ -6413,8 +6413,8 @@ endobj 748 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080814002409Z00'00') -/ModDate (D:20080814002409Z00'00') +/CreationDate (D:20080814014211Z00'00') +/ModDate (D:20080814014211Z00'00') >> endobj 749 0 obj @@ -6600,8 +6600,8 @@ endobj 773 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080814002408Z00'00') -/ModDate (D:20080814002408Z00'00') +/CreationDate (D:20080814014210Z00'00') +/ModDate (D:20080814014210Z00'00') >> endobj 774 0 obj @@ -6719,8 +6719,8 @@ endobj 787 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080814002410Z00'00') -/ModDate (D:20080814002410Z00'00') +/CreationDate (D:20080814014212Z00'00') +/ModDate (D:20080814014212Z00'00') >> endobj 788 0 obj @@ -6871,7 +6871,7 @@ endobj /Font << /F63 220 0 R /F88 719 0 R /F28 173 0 R >> /ProcSet [ /PDF /Text ] >> endobj -811 0 obj << +810 0 obj << /Length 2539 /Filter /FlateDecode >> @@ -6885,13 +6885,13 @@ mC ƥ7fKCJi+)ŠD"3r kxG9{-|-o sȫ?U;, ,е%RW.hZktl*9U#&K3-LK 6tp@MY8*CژqV)4$8yyR%@fI{}8*|ՎOcR'񱮰:$XHbChv,X^rQA3C[\>U?n .mTo/_j@{TV[jxVR`=MAdH K-gB;0EM3P8 Y(agcؕ=!G+̓'q}K2'|WN;>آm'W0*drǧf4c^(`<$ϋV9KҖ'.iW<$ɃVŲYU:c۽[C,7 *LTGƶR0ܣZ Ԇ:&8-HTQ("ph5jhi~NUr @rQ~ilsJXl?DܦIIF9TJ >Pocց2jg[xX#j;5/#R [(~3[i`c?7$vn|$_2i 39сqϑL5P]j%TpzX`D[)qjvّw'Yv,B7H$rxv_95\aGӣPNlVL={΁Pjiٕa.l!X౿' sz.XE2%铿?sՌendstream endobj -810 0 obj << +809 0 obj << /Type /Page -/Contents 811 0 R -/Resources 809 0 R +/Contents 810 0 R +/Resources 808 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 817 0 R -/Annots [ 813 0 R 814 0 R 815 0 R 816 0 R ] +/Parent 816 0 R +/Annots [ 812 0 R 813 0 R 814 0 R 815 0 R ] >> endobj 807 0 obj << /Type /XObject @@ -6899,123 +6899,126 @@ endobj /FormType 1 /PTEX.FileName (/usr/home/buetow/svn/vs/trunk/LaTeX/images/core-time.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 818 0 R +/PTEX.InfoDict 817 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 283.00000000 176.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 819 0 R ->>/Font << /R8 820 0 R >> +/R7 818 0 R +>>/Font << /R8 819 0 R >> >> -/Length 821 0 R +/Length 820 0 R /Filter /FlateDecode >> stream xO0+zTWڵM p!a"smlڱb\Yp:5SKI'!xY=Om챧r:%+CNts[;&ەmS6i418 y``NRgL,,F@_ 45FGe-! qm k,?Lp!SȾ͂>rED$*"]Rq<ܕURkyjge[:\(v<@RUzuܸ 7endstream endobj -818 0 obj +817 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080814002410Z00'00') -/ModDate (D:20080814002410Z00'00') +/CreationDate (D:20080814014212Z00'00') +/ModDate (D:20080814014212Z00'00') >> endobj -819 0 obj +818 0 obj << /Type /ExtGState /OPM 1 >> endobj -820 0 obj +819 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -821 0 obj +820 0 obj 417 endobj -813 0 obj << +812 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [213.5029 720.8502 227.9585 731.4325] /Subtype /Link /A << /S /GoTo /D (figure.4.4) >> >> endobj -814 0 obj << +813 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.1158 490.6786 140.5714 501.2609] /Subtype /Link /A << /S /GoTo /D (figure.4.5) >> >> endobj -815 0 obj << +814 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [413.7311 244.9899 440.1388 253.761] /Subtype /Link /A << /S /GoTo /D (cite.Algorithms) >> >> endobj -816 0 obj << +815 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [448.6037 244.9899 476.5177 253.761] /Subtype /Link /A << /S /GoTo /D (cite.AlgorithmsC) >> >> endobj -812 0 obj << -/D [810 0 R /XYZ 74.4095 793.4011 null] +811 0 obj << +/D [809 0 R /XYZ 74.4095 793.4011 null] >> endobj 122 0 obj << -/D [810 0 R /XYZ 74.4095 771.7323 null] +/D [809 0 R /XYZ 74.4095 771.7323 null] >> endobj 335 0 obj << -/D [810 0 R /XYZ 288.6243 539.3332 null] +/D [809 0 R /XYZ 288.6243 539.3332 null] >> endobj -809 0 obj << +808 0 obj << /Font << /F63 220 0 R /F26 170 0 R /F28 173 0 R >> /XObject << /Im35 807 0 R >> /ProcSet [ /PDF /Text ] >> endobj -827 0 obj << -/Length 2100 +826 0 obj << +/Length 2186 /Filter /FlateDecode >> stream -xڥXo6_GY~Sbmz{rjd9 f8-Kʮ3o3iyafPb5q+""1/Gf9+ճԊIIkz.4/ [tdf=OWwGFr[+/Qk˴nY>wӅn -X4sƙu֨_Vꗫ/'ɜ ] })[G6Ke7F'Jɣcewl;coseUyѽmGYL:9gPr[ayV%|f C :n*S0)4vltY.8x]0;$\,i'O{W5~PFeMە;~si]3qAǙZ ~orL$-drE RwG2gꨞ6*sóUs߽AAӦz8Do~hy[NL:U₫-$pt#{ s'=s;!@6 ^Wem>* WGbXjzM0\J8UWb3m4N)f_sҙE8ADz ɑJXCL\S;jxED(蜔b`#əz*/ -_A Dp>4*2BEi'(Z7`'^ϪczD|ܻjTnGQu 4q0Iۯ]HWTPDw&iS56oqX +GCZG!e>xl۪{_6I Qp pAa3 FhfGFaa$I;FtmـcbpPI-+}GVŬEUh^]UQԳȪ+<>-ϑli1:4ת|?:fSZ=AqcŹNJ\M/vQK׵$g˺Mx. -YC'' m3)"ʦ!Btp(3 #s!dᜲ ~k"S.wCW*mM/T6 )c@ y.JڎKpYZ+`]v!~ØSM([MQH -uBx:$ϋQ`Aa/`tCkIͲ[˧ 0&C4+_G*Q;Ofla(TVV* -Ü2O e.)RפAIR\2KdLz)_[#]`;i;P2I],sIu$EǪw*h$ .Ϧ HV8J whPMR&O6\N2.RS{C~cpl]#5 4L-mKz+ @ ,Vĝ4}5rit@>0lϯGHծi[n"O >$2NH1\Hw] M%, -*Xr- _ ;Xq/"=s` Hc8W% )@f6[Knek.^cF շҲܨ\84p6F)`1WV, @Eqe`>b]`J#j,y!b(q"wK:[/W2I#͖+ytvkJؔ<|uس54e2S!e:X$xW5vRFEM~Ki]pfb-5g۶yi ,Τ-hLeiCj6KãkUsz +[8ޖ@ CiS=-%^^+k)8+[Tۼk߸-aǥpcl&x`2rMafq(aeAQ ɉJ1nXQ\XPC "~T VTN]1]¤,z/ vX!S>4TbGׅ4e3 +sO Z7GG*-ʄs_B3x'+~:>d+iORD{9\%WW @TK a*qcm#a`MKag1dǐ 2c. pf5<4ڨ?oHq`Nr7Co{X2ٞӘ n0W$?T%iQJ$HC8#=B: h+n/2|\AK!xjK, qr`ST4E%q,lРGs _3ΐ6[KInboᚫoq-G*2fQD:u#Ɠ23֝.ef|MCd ,Q9X?u.! %xѴM^ +n[y0_4rHk޷' IO!Vף.}Y0 p5 GED'S8hHT}ˠ2Z"{AzW]xX Yy`iѭF2'[YWSqzP#w&jQ5mҰ ;DRŠ\4{|O+;G +:E ϵגw;p~endstream endobj -826 0 obj << +825 0 obj << /Type /Page -/Contents 827 0 R -/Resources 825 0 R +/Contents 826 0 R +/Resources 824 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 817 0 R -/Annots [ 829 0 R 830 0 R ] +/Parent 816 0 R +/Annots [ 828 0 R 829 0 R ] >> endobj -808 0 obj << +823 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/home/buetow/svn/vs/trunk/LaTeX/images/core.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 831 0 R +/PTEX.InfoDict 830 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 419.00000000 354.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 832 0 R ->>/Font << /R8 833 0 R /R9 834 0 R >> +/R7 831 0 R +>>/Font << /R8 832 0 R /R9 833 0 R >> >> -/Length 835 0 R +/Length 834 0 R /Filter /FlateDecode >> stream @@ -7024,88 +7027,85 @@ x ' Sob26˯D$Ň!|J ip %|/Oqho vCn]ż}˧揕!zLG\ dA}\-ՠ4QRc׏W_G9Ü?CO'ȟC18y]ş˦6wEE.,Ou脁D0OR+iEIpNɘC?<B1eT`9LL\EY8a }_O:6:яujOE%>L58ii;GԊ|wsΚ3Rƌl Qa?`xE_\靌ؙh1Q}™T1.;Sfr3^*|zњ wRX\!qZ)# vqb))g2WWЩ$Xj4!j4wj_,1;P,.zpKw-5vA{]qTEZPyػBȩ e-nar.ʊsިg@OzYT˿]Uňz9n A &i,M@0ֱз,CmXwc(Pendstream endobj -831 0 obj +830 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080814002409Z00'00') -/ModDate (D:20080814002409Z00'00') +/CreationDate (D:20080814014211Z00'00') +/ModDate (D:20080814014211Z00'00') >> endobj -832 0 obj +831 0 obj << /Type /ExtGState /OPM 1 >> endobj -833 0 obj +832 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -834 0 obj +833 0 obj << /BaseFont /Helvetica-Oblique /Type /Font /Subtype /Type1 >> endobj -835 0 obj +834 0 obj 1031 endobj -829 0 obj << +828 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [419.5946 451.0827 434.0502 461.6649] +/Rect [419.5946 738.8587 434.0502 749.441] /Subtype /Link /A << /S /GoTo /D (table.2.2) >> >> endobj -830 0 obj << +829 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [464.8944 415.2282 479.3499 425.8105] +/Rect [464.8944 703.0042 479.3499 713.5865] /Subtype /Link /A << /S /GoTo /D (figure.4.6) >> >> endobj -828 0 obj << -/D [826 0 R /XYZ 74.4095 793.4011 null] +827 0 obj << +/D [825 0 R /XYZ 74.4095 793.4011 null] >> endobj 336 0 obj << -/D [826 0 R /XYZ 298.272 522.2791 null] +/D [825 0 R /XYZ 298.272 352.2293 null] >> endobj -825 0 obj << +824 0 obj << /Font << /F63 220 0 R /F28 173 0 R >> -/XObject << /Im36 808 0 R >> +/XObject << /Im36 823 0 R >> /ProcSet [ /PDF /Text ] >> endobj 838 0 obj << -/Length 2328 +/Length 2247 /Filter /FlateDecode >> stream -xڥYm۶~B[{|q'wufR$(TozX"%^l8]>WD1ųhdaW|U7t/JXRűZ?LD2 ~*aPx.l(d\IfaȲHٙk~aa+yUlsgLbfX1}(cJ/֋E])au?Av@PoJ w{ʛrhq-xֵnMIlLMc7iS`I/niUnu`{LY4988b ;kI08;W /m$6a2dMR-CQׇڊÆMN[m~7> *Sg3nvcǡP= sim:?4S{^k'Fa ܰ5fn6:\@+4@+*7v{NЯl#^mUl]<Oee0I*θtҷM?hy۱6 zBԏu V(ht0/ @&7hYgбJ>P?:㱡f Qf4[6LIi qZUNE]Uf&P#!Ismf8Dx>?hѽBȓ 6cGB65?G9͢;4WT^m{H8ZBpUˢ*mzv8TN5; yBH<;# ԭc{`1g})ǀwejbWG$Ǝu>2o -ek-ig<)TooTؼp WNq'4 -úQ)Ciȱx2Ru9,C&Xp30:ut;_{cԩqv!VC, A]mWT[O=E30m[ZH')P)7{?L45I5.] e[ȘzpfM{XG -2M -h5DRaUgC^q8Ⓦc8`Ũ+1Z@0m ga|\D gQ$O .D -p8# x}3(LǮIcUv5*SBкlZlK&yEX=C_b͞rg\Cgo6 :!^>%"-W ~%iݎ IN$n6[XPR*XN<,Z`Hbd"+9nO0Hc*}Ps Wq {m >룏FN;2b){}XBrph'(ɗAeϩ?3i1G% old!}]`t8gĸjuêJׅ%ʒ]~;F h8L~?})j2ΎÈpTO|x6ܝ)?occN%,\|9Kԇ5m۷M>%q>9{닏K %(@rدjak6e9+lBm$U"2M;wp7^ -5$4}#'gtlK (@/Ã:Qn5*SuJya)=p =zz dF[G<[ CwY҅ r_JR5θ(a{a 47cn^|?Lg^P/z5^W?9J3 + Ht:L4MӦδH)yοvEJT܍]`8qfbg,$ h^Y{oax9~uwZRif3$ߚ}jI:Wl9+uWf.pu{_ RC)=qƒ$Dž].RiaGs\@vnIK:EpڮYaˮv2O?'Ezњ9tv[֖0 74~F Q22x4KqJ- qXDsRI [ovxmanγB:_ٲew8kMDQ4bXf9Y: b<8E ]_r\4r6䌖ZOCZ^Gomn? z*aRp B~{Fo +8:;B{r;qV,gj׶BCҧ&ΏbG_{*/sy6)3D(gJ}nP aWɌօ3A@$s㮞H@zSwym*p5lB2أ5Rmot3ך-( P # ?L)4LIQ q!p~8PQ1>N\M9fBj2rE1;~ qHT8QC2cb02öK<7`*p:"LE< e +˛o@*Zjȉ-}iZ}EբɌAmnJ2a_D@iۏ<MA3POrnrbiVW* TYٵ޺"b옿/𨐋%LMEe*@-u~hpi45wJm 5Ъ,hiG5֖y4p|!@IM/5݊kj+W|Z؏{iZo%1*]wX-b8cyt 48a)P褷xRA :UkVDrıPpN-QSxx,- BpN$21 + +i= zCa# Bc[Eu)anrZ9jMct%o7OEr45O^_ ֗i>X5-IЃ}y(%P<-!]R)'Dvo1kr.N8li;ͨB%y8xz2t.R p0M)avB10"w +ڝwǘ3fOvW]9s i0k:虓9⟧٣۔CA%Qp^ GkSݗ[;izqvA),J%*`UnۻKlܭ/4>g#%D,2(Q Y*' W.h8SAyҷ:DAmPKMP'(؀WW7ҝ+\х{C;+!XZvk¤bzfp_Dvm?v^ۊdܿ7 i=?N '^2.Rſ9aendstream endobj 837 0 obj << /Type /Page /Contents 838 0 R /Resources 836 0 R /MediaBox [0 0 595.2757 841.8898] -/Parent 817 0 R +/Parent 816 0 R >> endobj -824 0 obj << +835 0 obj << /Type /XObject /Subtype /Form /FormType 1 @@ -7131,8 +7131,8 @@ endobj 840 0 obj << /Producer (GPL Ghostscript 8.61) -/CreationDate (D:20080814002410Z00'00') -/ModDate (D:20080814002410Z00'00') +/CreationDate (D:20080814014212Z00'00') +/ModDate (D:20080814014212Z00'00') >> endobj 841 0 obj @@ -7155,14 +7155,14 @@ endobj /D [837 0 R /XYZ 74.4095 793.4011 null] >> endobj 337 0 obj << -/D [837 0 R /XYZ 206.8833 575.8724 null] +/D [837 0 R /XYZ 206.8833 498.7269 null] >> endobj 836 0 obj << /Font << /F63 220 0 R /F28 173 0 R >> -/XObject << /Im37 824 0 R >> +/XObject << /Im37 835 0 R >> /ProcSet [ /PDF /Text ] >> endobj -847 0 obj << +846 0 obj << /Length 2211 /Filter /FlateDecode >> @@ -7181,62 +7181,53 @@ T* eg,\Sz.3CTƢ3;ۇ=t?19ec +HygmGt8qM5x)!E֨qqc' XEDF 1D||7[ ;> endobj -850 0 obj << +849 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [128.9946 243.1787 143.4501 253.761] /Subtype /Link /A << /S /GoTo /D (figure.4.9) >> >> endobj -848 0 obj << -/D [846 0 R /XYZ 74.4095 793.4011 null] +847 0 obj << +/D [845 0 R /XYZ 74.4095 793.4011 null] >> endobj -849 0 obj << -/D [846 0 R /XYZ 74.4095 750.7482 null] +848 0 obj << +/D [845 0 R /XYZ 74.4095 750.7482 null] >> endobj 126 0 obj << -/D [846 0 R /XYZ 74.4095 375.5382 null] +/D [845 0 R /XYZ 74.4095 375.5382 null] >> endobj -845 0 obj << +844 0 obj << /Font << /F63 220 0 R /F26 170 0 R /F28 173 0 R /F88 719 0 R >> /ProcSet [ /PDF /Text ] >> endobj 854 0 obj << -/Length 1938 +/Length 1945 /Filter /FlateDecode >> stream -xڭXAs6W(<$EJTlҝәty׃36Yr-ɯ_ eɖw |q\1 =ˋB̞W|ٿ".b}tOY:325{zI2Sqir:[27b<*u~:9O?_=fd>ʘY>[HC~˔ Ud#3Z-g8% -5~q~ms^Xhf1TFOz沔)KFZJqfר׫a\sVݜxFi4EφF}Zrr[\|K=9 $Ze}5M`0٤'(rL#BO2bK!2fPMI+]wtYۚ]}Q"W4~j+!0)<>o,diݖFweB% -w{ֵk(]9K~~gw!nu#܄ee8n_/]4B5K.L BJP| 6aVW&4BP%s( \;&G92H/$ KZ5VeGQdoҾr]irsUW.q -3ʛr,k[3-'2(02IZj\JP@h e0lQnb(\*[MB?]ֳˮqޕG[%z5? -;+{ayC0[(uVt\ ->^b