Prof. Franz Schweiggert Abteilung Angewandte Informationsverarbeitung 30. Mai 2006
Christian Ehrhardt Blatt 6


Uni Logo



Systemnahe Software (SS 2006)


Abgabetermin 13.Juni 2006

Signale zum zweiten (20 Punkte)

Die Signalverarbeitung muß ab sofort grundsätzlich mit Hilfe von sigaction(2) und nicht mit signal(3C) gemacht werden.

Parallelisierung Reloaded (16 Punkte)

In diesem Blatt soll ähnlich wie in Blatt 3 eine wiederholt zu erledigende mathematische Aufgabe auf eine fest vorgegebene Anzahl von Prozessen (z.B. 4) aufgeteilt werden. Dieses Mal sollen 64-Bit Zahlen (Typ long long) daraufhin untersucht werden, ob es sich um Primzahlen handelt oder nicht. Handelt es sich nicht um eine Primzahl soll eine Zerlegung in zwei Faktoren angegeben werden, ansonsten die Tatsache, daß es sich um eine Primzahl handelt. Die Eigentliche Zerlegung in Faktoren übernehmen die erzeugten Kindprozesse, der Vater kümmert sich nur um die Synchronisation. Er muß in Kooperation mit den Kindprozessen sicherstellen, daß jeder Eintrag in der Eingabedatei genau einmal verarbeitet wird. Dies soll wie folgt ablaufen: Für die einzelnen Signale empfehle ich folgende Definitionen:
#define DOREAD (SIGRTMIN) // Aufforderung an ein Kind zum Lesen
#define READDONE (SIGRTMIN+1) // Kind hat erfolgreich gelesen
#define BUSY (SIGRTMIN+2) // Kind ist noch beschäftigt
#define DONE (SIGRTMIN+3) // Kind hat eine Faktorisierung beendet
#define THEEND (SIGRTMIN+4) // Dateiende erreicht

Mehr Sicherheit (4 Punkte)

Das oben beschriebene Verfahren zur Synchronisation mit Hilfe von Signalen kommt völlig aus dem Tritt, wenn einer der beteiligten Prozesse versehentlich oder böswillig von einem unbeteiligten Prozeß eines der zur Synchronisation verwendeten Signale geschickt bekommt. Es soll daher jetzt sichergestellt werden, daß die Signale DOREAD, READDONE, BUSY, DONE und THEEND nur dann verarbeitet werden, wenn sie von einem der legitimen Absender stammen. Das heißt, die Kinder akzeptieren nur Signale vom gemeinsamen Vater, der Vater nur Signale von einem seiner Kinder.
Dazu muß bei sigaction(2) das Feld sa_sigaction statt sa_handler für die Signalverarbeitung verwendet werden. Außerdem muß SA_SIGINFO in sa_flags angegeben werden. Dann bekommt der Signalhandler neben der Signalnummer zwei zusätzliche Parameter, von denen uns nur der erste (ein Zeiger auf eine Struktur vom Typ siginfo_t) interessiert. Dieser Struktur lassen sich weitere Informationen über den Ursprung bzw. den Grund des Signals entnehmen. Uns interessieren hierbei im Kontext dieser Aufgabe nur nutzergenerierte Signale und bei diesen nur die Prozeß-ID des Absenders. Nähere Informationen zu dieser Datenstruktur müssen der Manualseite siginfo(3HEAD) (bzw. sigaction(2) unter Linux) entnommen werden.

Viel Erfolg!



Christian Ehrhardt 2006-05-30