Dr. Matthias Grabert Abteilung Angewandte
Informationsverarbeitung 18. Mai 2002
Christian Ehrhardt Blatt 4
Systemnahe Software (SS 2002)
Abgabetermin 28.05.2002
Ein Neuron ist eine Gehirnzelle, die wir uns für dieses Blatt vereinfacht
wie folgt vorstellen: Die Zelle hat verschiedene Verbindungen (Synapsen) zu
anderen Neuronen. Jede dieser Verbindungen dient entweder dazu,
Signale von anderen Neuronen zu empfangen oder Signale an andere
Neuronen zu verschicken. Ansonsten besteht das Neuron nur noch
aus einem Zähler.
Wenn ein Neuron ein Signal erhält, so wird ein (vom Signal abhängiger)
Wert auf den internen Zähler addiert. Dieser Wert darf auch
negativ sein. Sobald der Zähler eine bestimmte Schwelle
überschreitet (für dieses Übungsblatt der Wert 100), werden Signale
an benachbarte Neuronen verschickt, und der Zähler wird zurück auf 0
gesetzt.
Jedes Neuron soll ein eigener Prozeß sein. Zur Kommunikation
werden wieder die Signale im Bereich SIGRTMIN bis SIGRTMAX verwendet.
Jedem dieser Signale wird ein Gewicht zugeordnet, das zum
Zähler hinzu addiert wird, wenn das Signal eintrifft.
Wenn der Wert des Zählers dabei den Wert 100 überschreitet,
wird an einige andere Prozesse eines dieser Signale verschickt und
der Zähler zurück auf 0 gesetzt. Damit wir von der Arbeit der
Neuronen auch etwas zu sehen bekommen, soll bei einem Überlauf
des Zählers eine kurze Meldung ausgegeben werden.
Welche Gewichte den einzelnen
Signalen zugeordnet sind und an welche Prozesse/Neuronen beim
Überlauf des Zählers Signale verschickt werden sollen steht
in einer Datei, die beim Start gelesen wird. Da diese Datei
möglicherweise noch nicht fertig ist, wenn der Prozeß für ein
Neuron gestartet wird, darf die Datei erst dann geöffnet und
gelesen werden, wenn der Prozeß einmal das Signal SIGUSR1 erhalten
hat.
Jedes Neuron bekommt zwei Kommandozeilen Argumente:
- Den Namen der Konfigurationsdatei.
- Eine Nummer zwischen 0 und 99, die innerhalb eines Netzwerks
von mehreren Neuronen eindeutig ist.
Jede Zeile der Konfigurationsdatei hat eine der drei folgenden
Formen (nr, nrout, pid, sig und weight sind Integerzahlen, ``MAP'', ``IN''
und ``OUT'' sollen genau so in der Eingabe vorkommen):
- MAP nr pid
- Eine solche Zeile besagt, daß das Neuron mit
der Nummer nr durch den Prozeß mit der Prozeß-ID pid simuliert
wird.
- nr IN sig weight
- Eine solche Zeile besagt, daß das Neuron
mit der Nummer nr das Gewicht weight für das Signal sig+SIGRTMIN
verwendet. Alle Neuronen, die nicht die Nummer nr haben, können
diese Zeile ignorieren.
- nr OUT nrout sig
- Eine solche Zeile besagt, daß das Neuron
mit der Nummer nr im Falle eines Zählerüberlaufs das Signal
sig+SIGRTMIN an das Neuron mit der Nummer nrout verschickt. Welche
Prozeß-ID diesem Neuron entspricht wird durch eine MAP-Zeile
angegeben. Auch hier können alle Neuronen, die nicht die Nummer
nr haben, diese Zeile ignorieren.
Da die MAP-Zeilen erst in die Datei geschrieben werden können, wenn
bereits alle Prozesse für die einzelnen Neuronen gestartet wurden
(vorher sind ja die PIDs nicht bekannt), wird jetzt auch klar, warum
die Neuronen auf das Signal SIGUSR1 warten müssen, bevor die Datei
gelesen werden kann.
Das Format der Konfigurationsdatei ist so gehalten, daß alle
Neuronen die gleiche Datei verwenden können.
Jetzt sollte es bereits möglich sein, von Hand ein kleines
Netzwerk aus einigen Neuronen aufzubauen. Ein Beispiel dazu gibt
es auf der Homepage der Vorlesung.
Da der Aufbau eines Netzwerks von Hand recht aufwendig ist soll noch
ein Programm geschrieben werden, das uns die Arbeit abnimmt.
Dieses Programm soll eine Konfigurationsdatei ohne MAP-Zeilen
lesen und die benötigten Neuronen starten. Anschließend sollen
die MAP-Zeilen an die Konfigurationsdatei angehängt werden.
Schließlich soll das Signal SIGUSR1 an alle Neuronen verschickt
werden. Der Kontrollprozeß soll dann auf das Signal SIGINT (kann durch
drücken von Ctrl-C erzeugt werden) warten und dann alle Neuronen
durch ein TERM-Signal beenden. Wenn alle Kinder terminiert sind, soll
sich auch der Kontrollprozeß beenden.
- SIGRTMIN und SIGRTMAX sind leider keine Konstanten sondern
Funktionsaufrufe. Unter Solaris ist SIGRTMIN 38 und SIGRTMAX 45.
SIGUSR1 entspricht dem Wert 16.
- Da dieses Mal keine weiteren Informationen über den Ursprung
eines Signals benötigt werden, kann auf das Flag SA_SIGINFO
verzichtet werden, dann muß allerdings sa_handler statt sa_sigaction
für den Signalhandler verwendet werden.
Christian Ehrhardt
2002-05-18