Home
 

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:

  1. CPP_Task
  2. C_Thread
  3. LWP_Thread
  4. NT_Thread
  5. Posix_Thread
  6. Rex_Thread
  7. Solaris_Thread
  8. 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

Klassendiagramm

(größer)

Im wesentlichen besteht C++SIM aus den folgenden Teilen:

  1. ClassLib
  2. Common
  3. Event
  4. SimSet
  5. 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".