Diskrete Simulationen -- C++SIM
Einleitung
Das Referat wurde in 3 Teile aufgeteilt, wobei Teil 1 von mir stammt. Hier sind Teil 2 und Teil 3 zu finden.
C++SIM ist ein prozeßorientiertes Simulationspaket in C++, stark angelehnt an die Simulationsklasse von SIMULA mit den dazugehörigen Bibliotheken. Die hier beschriebenen Sachverhalte beziehen sich auf die Version 1.7.0 beta des Pakets.
Geschrieben wurde C++SIM von M.C. Little und D.L. McCue und kann von http://cxxsim.ncl.ac.uk/ bezogen werden.
Prinzipiell sollte das Paket auf jedem Rechner mit einem C++-Compiler und einer der folgenden Threads-Bibliotheken funktionieren:
- CPP_Task
- C_Thread
- LWP_Thread
- NT_Thread
- Posix_Thread
- Rex_Thread
- Solaris_Thread
- Quick_Thread
Installation
Auf UNIX-Systemen dürfte die Installation kein größeres Hindernis darstellen da für diese ein Shell-Script zur Verfügung steht das die nötige Konfiguration vornimmt. Für andere Systeme, z.B. NT, bleibt nur der Weg über die händische Bearbeitung der Konfigurationsdateien. Dies habe ich zwar nicht getestet, macht aber keinen komplizierten Eindruck.
Auf einem Linux-Rechner sieht der Konfigurationsvorgang z.B. so aus:
root@bravo: ./configure ---------------------------------------------------------------------- Configuring for a i586 machine running Linux version 2.0.33. Is this OK [YES] : Finding OS config file, please wait : s_linux_2_0.cf Make is verbose (NO/YES) [NO] : Root directory of source tree [/usr/src/packages/C++SIM] : Root of directory tree for installation [/usr/local/C++SIM] : Reading default answers from /usr/src/packages/C++SIM/Include/Config/Configure.h, please wait Linux C++ compiler [g++] : Checking for g++ ... done Determining C++ compiler version ... done (version is 2.90.23 ) Finding compiler config file, please wait : c_gcc_2_7.cf Finding standard C++ include directory, please wait ...done C++ include directory [/usr/include/g++] : Specific flags governing compilation and include file locations: -DDEBUG Enable Arjuna debugging messages -DNO_RESOURCE Disable Resource base class -DNO_INLINES Disable inlining -DUSE_PURIFY Enable purify checking (if available) C++SIM CppFlags [] : Additional compilation flags for optimisation and/or debugging [-O2 -m486] : C++SIM specific loader flags [] : Additional libraries [-lm] : Thread type to use: CPP_Task C++ task library C_Thread C threads library LWP_Thread Sun's lightweight process library NT_Thread NT threads Posix_Thread Posix threads library Rex_Thread Rex threads library Solaris_Thread Sun's Solaris threads library Quick_Thread David Keppel's Quick Threads package (see Contrib) Thread type [Posix_Thread] : What version (6, 8, SOLARIS, LINUX)? [LINUX] : Thread library [-lpthread] : Scheduler queue type to use: ProcessList Linear linked-list ProcessHeap As described in the paper Calendar (See Contrib) HashedList A hashed scheme similar to the ProcessHeap Queue type [ProcessList] : Creating Examples/MakefileBoot Creating Tests/MakefileBoot
Danach muß die Bibliothek nur noch kompiliert werden:
root@bravo: make -f MakefileBoot root@bravo: make Makefiles root@bravo: make depend root@bravo: make all
Und letztendlich wird sie installiert:
root@bravo: make install
Klassenüberblick

Im wesentlichen besteht C++SIM aus den folgenden Teilen:
- ClassLib
- Common
- Event
- SimSet
- Stat
ClassLib
ClassLib enthält alle Klassen, die für den grundlegenden Simulationsbetrieb notwendig sind. Dies sind die Klassen Thread, Scheduler, Process und diverse Klassen zur Erzeugung von Zufallszahlen. Erzeugt werden können gleich-, normal-, erlang-, exponential- und hyperexponentialverteile Zufallszahlen. Zuguterletzt gibt es noch eine Klasse zur Erzeugung von Boolean-Zufällen, basierend auf einer Gleichverteilung. Wie aus dem Klassendiagramm hervorgeht ist jeder Prozeß ein eigener Thread, was die Simulationsgröß entsprechend beschränkt.
Common
Enthält allgemeine Klassen wie Boolean und Resource. Letztere stellt eine einfache Implementierung einer Speicherverwaltung über Referenzzähler dar: Jeder Benutzer einer dynamischen Ressource registriert sich durch eine Methode ref() und meldet sich durch unref() wieder ab. Erreicht der Referenzzähler 0 so wird der Speicher wieder freigegeben. Weiters befinden sich in diesem Teil die notwendigen Klassen für das Debug-Interface.
Event
Umfaßt die Klassen Entity, Semaphore und TriggerQueue. Mit ihrer Hilfe kann eine asynchrone Ereignisbehandlung implementiert werden.
SimSet
SimSet enthät die aus SIMULA wohlbekannten Klassen Linkage, Link und Head. Zu beachten ist dabei, daß Process hier, im Unterschied zu SIMULA, nicht von Linkage abgeleitet wird. Durch Mehrfachvererbung in C++ stellt dies aber keine Einschränkung dar.
Stat
In dieser Version (1.7.0 beta) leider gar nicht Dokumentiert, also hilft nur das durchwühlen durch den Source. Zur Auswahl stehen Klassen für Mittelwerte, Varianz, mit und ohne Zeit, und Histogramme. Bei den Histogrammen hat man die Auswahl zwischen präzisen, normalen und einfachen. Die präzisen Histogramme zeichnen alles auf, die normalen fassen Bereiche zusammen wenn eine Maximalanzahl überschritten wird und die einfachen arbeiten nur mit festgelegten Bereichen. Die Klasse Quantile arbeitet wie PrecisionHistogram, liefert jedoch zusätzlich das Quantil, also "denjenigen Wert, der von einem gegebenen Anteil x der Meßwerte in der Regel nicht überschritten wird".