Praktikum Client-Server-Projekt : Textretrievalsystem Übungsziel: Prozesserzeugung und Interprozesskommunikation unter UNIX / Linux Softwareerstellung im Team In dem Projekt soll eine Client - Server Architektur realisiert werden. Der Server ist ein eigenständiger Prozeß, der Aufträge von mehreren Client-Prozessen entgegen nimmt, diese ausführt und dem Client sein Ergebnis zurückmeldet. Im vorliegenden Fall soll der Server für Textdateien im ASCII-Format einen Wortindex verwalten, so daß ein Client den Server abfragen kann in welcher Datei ein bestimmtes Wort vorkommt. Ein Wort kann dabei in mehreren Textdateien vorkommen. Der Server durchsucht seinen Index, in dem das gesuchte Wort ( Schlüssel ) und die Dateien, in dem das Wort zu finden ist, abgelegt ist. Der Index wird über eine Schlüsseltransformation ( Hashing ) berechnet ( siehe dazu /1/, /2/ oder vergleichbare Literatur). Ein dritter Prozess Monitor überwacht die Kommunikation zwischen Client und Server bei der Auftragsausführung. Befehle Client Kommandointerpreter Klient shared memory Aufträge Auftragswarteschlang Server Rückmeldewarteschlang Hashtabelle Meldungen Ausgabeprozesse Textdateien Darstellung auf Bildschirm Monitor Logfile Server, Monitor und Klienten werden als unabhängige Prozesse gestartet und laufen in eigenen Konsolen, d.h. in unterschiedlichen Terminalfenstern. Seite 1 von 6
Funktionalität Server Es soll gewährleistet werden, dass immer nur ein Server existiert. Der Server kann immer nur nach einem Wort suchen. Der Server verwaltet eine Liste aller aktiven Klienten d.h. jeder Klient muss sich beim Start beim Server anmelden und beim Terminieren wieder abmelden. Die Hashtabelle ist statisch, d.h. es können maximal 991 unterschiedliche Worte indiziert werden. Die Hashfunktionen werden zu Verfügung gestellt ( siehe letzte Seite ). Der Server soll durch eine zeitliche Verzögerung der Auftragsannahme und Rückmeldung eine Netzwerkverbindung zwischen Klient und Server simulieren. Dazu soll der Server drei unterschiedliche Netzgeschwindigkeiten simulieren ohne Netz, d.h. Server und Klient laufen auf einem Rechner, schnelles Netz d.h. geringe zeitliche Verzögerung und langsames Netz. Die Simulation soll online zur Laufzeit des Servers eingestellt werden können. Die Umstellung der Zeitverzögerung soll über ein Server-Thread realisiert werden. Funktionalität Client Es können sich mehrere Klienten mit Server und Monitor verbinden. Der Client ist ein kleiner Kommandointerpreter der folgende Kommandos kennt: I <dateiname> S wort S wort1 wort2.. wortn FLAG : K -pid : Indiziere die Textdatei "dateiname". Eine Pfadangabe in dateiname soll möglich sein. : Nenne mir alle Textdateien in denen das Wort "wort" vorkommt. 1 < n <=5 ( d.h. maximal 5 Suchworte ) Suche nach mehreren Worten in Textdateien. Der letzte Parameter FLAG gibt an, ob die angegebenen Suchworte UNDverknüpft bzw. ODER-verknüpft werden sollen. Bei UND-Verknüpfung sucht man nach Textdateien, in denen alle angegebenen Worte vorkommen müssen. Bei ODER-Verknüpfung sucht man je Wort alle Dateien in denen mindestens dieses Wort vorkommt. : Anzahl von aktiven Client-Prozesse anzeigen. Option pid, PID aller aktiven Client-Prozesse anzeigen Q Beenden des aktuellen Client ( sich selbst beenden ) E Beenden des Servers, des Monitors und aller laufenden Client-Prozesse mit Aufräumen des Systems Im Falle von Suchaufträgen, die mit ODER verknüpft werden, sollen alle Dateien angezeigt werden, in denen ein Suchwort vorkommt. In der Ausgabe soll das Suchwort und alle Dateien, in denen es vorkommt angezeigt werden ( siehe Beispiel unten ). Beispiel: S sonne scheint ODER Ergebnis: sonne kommt vor in dateia.txt,dateib.txt,datc.txt scheint kommt vor in dateia.txt, datc.txt Seite 2 von 6
Im Falle von Suchworten mit UND-Verknüpfung sollen die Dateien angezeigt werden, in denen alle Worte vorkommen. Beispiel: S sonne scheint UND Ergebnis: sonne scheint kommt vor in dateia.txt,datc.txt Ein universeller Kommandointerpreter, der an die geforderten Kommandos angepasst werden kann wird zu Verfügung gestellt und soll benutzt werden ( siehe letzte Seite ). Nach der Erkennung eines korrekten Kommandos erzeugt der Client einen Auftrag, der durch eine eindeutige Nummer gekennzeichnet wird. Dieser Auftrag kann 1.. n Serveraufträge bewirken. Da der Server immer nur nach einem Wort suchen kann tritt dieser Fall im Befehl S auf, wenn nach mehreren Worten zu suchen ist. In diesem Fall muss im Auftrag für jedes Suchwort ein entsprechender Serverauftrag erzeugt werden. Die Serveraufträge zu einem Auftrag werden vom Kommandointerpreter selbst oder von einem Unterprozess an den Server weitergeleitet. Ein Auftrag mit allen seinen Parametern, den erzeugten Serveraufträgen und allen erhaltenen Ergebnissen wird in einer shared memory abgelegt. Es soll nur eine shared memory existieren, auf die alle Klienten zugriff haben. Für die shared memory ist eine Speicherverwaltung für Aufträge zu realisieren. Für jeden Auftrag erzeugt der Kommandointerpreter einen Ausgabe-Sohnprozess ( Systemfunktion fork() ), der auf die Rückmeldungen des Servers wartet und diese Rückmeldungen zu seinem Auftragsdaten in der shared memory ablegt. Sind alle Rückmeldungen zu seinem Auftrag vorhanden werden diese auswertet und danach eine formatierte Ausgabe am Bildschirm erzeugt. Danach kann der Auftrag aus der shared memory gelöscht werden und der Ausgabeprozess terminiert. Durch die Erzeugung von Sohnprozessen, die auf die Rückmeldungen des Servers warten und die Ausgabe auf der Konsole übernehmen ist es möglich, dass ein neues Kommando eingelesen und an den Server geschickt wird, abwohl das letzte Kommando noch nicht fertig bearbeitet ist ( Kommandoeingabe und Ausgabe laufen in parallelen Prozessen ). Dieser Fall kann vor allem dann auftreten, wenn Klient und Server auf zwei Rechnern laufen und ein langsames Netzwerk dazwischen liegt. Diese Situation soll im Server simuliert werden, in dem Zeitverzögerungen eingebaut werden. Funktionalität Monitor Um die laufenden Aufträge beobachten zu können wird ein Monitorprozess in einer eigenen Konsole gestartet, der die shared memory beobachtet und deren Inhalt auf der Konsole anzeigt. Zusätzlich erstellt der Monitor ein Logfile, in dem jeder fertig Auftrag, der aus der shared memory gelöscht wird protokolliert wird. Konsolenausgabe und Logfile sind nützlich für ihren späteren Systemtest. Die Klient-Server-Anwendung soll wahlweise mit oder ohne Monitor laufen können. Der Monitor soll jederzeit ohne Neustart von Server und Klienten aktivierbar sein. Seite 3 von 6
Interprozeßkommunikation: Kommandointerpreter / Ausgabeprozess/ Monitor: Datenaustausch über shared memory. Für die shared memory ist eine Speicherverwaltung für Aufträge zu realisieren. Die Synchronistion zwischen den Prozessen, die Zugriff auf die shared memory haben soll über binäre und allgemeine Semaphore realisiert werden. Das Synchronisationsprotokoll ist so zu wählen, dass alle Prozesse parallel arbeiten können. Kommandointerpreter / Server : asynchrone Nachrichten. Hierbei soll eine Nachrichten-FIFO ( UNIX MessageQueue ) für die Aufträge an den Server eingerichtet werden. Ausgabeprozess / Server : asynchrone Nachrichten. Hierbei soll eine Nachrichten-FIFO ( UNIX MessageQueue ) für die Rückmeldungen des Servers an den Ausgabeprozess eingerichtet werden Server / Client: Der Auftrag E soll bewirken, dass alle laufenden Prozesse terminieren und alle reservierten Betreibsmittel wieder freigegeben / gelöscht werden. Mit dem Server müssen daher auch alle Klienten, deren Sohnprozesse und der Monitor terminieren. Durch senden eines Signales mit der Systemfunktion kill() kann der Server dem Klienten mitteilen, dass er sich beenden soll. Der Klient muss dann vor dem beenden alle Sohnprozesse beenden, den Monitor zum beenden veranlassen sowie alle IPC-Objekte löschen. Zur Interprozeßkommunikation sind die IPC-Funktionen von UNIX System V und Signale zu verwenden. Projektdurchführung Bevor Sie Ihr Projekt realisieren ist ein Entwurf auszuarbeiten. Dieser Entwurf wird vor der Realisierung abgegeben. In ihrem Entwurf sollen die logischen Abläufe der Prozesse, die zeitliche Synchronisation zwischen den Prozessen und die Informationen, die die Prozesse untereinander austauschen dokumentiert sein. Der Entwurf muß also unter anderem das Synchronisationsprotokoll zwischen Client- Prozessen und Monitor beschreiben. Diese Beschreibung soll grafisch mit einem Petrinetz erfolgen. Zu realisieren sind folgende unabhängigen Prozesse: 1 Serverprozess mit zwei Threads, der "Textdatenbank" und Umstellung verzögerungszeit 1..m Klienten "Textretrieval", diese erzeugen je Auftrag einen Sohnprozess Ausgabe (UNIX Sohnprozesse ) 1 Monitorprozess Seite 4 von 6
Ihr Projekt setzt sich aus mehreren Softwaremodulen zusammen: Modul : Server Module: Hashing und Stack Modul(e) : Client und alle Module des Kommandointerpreters Modul: Auftragsausgabe Modul: Monitor Sollten die Module zu umfangreich werden, sind weitere Module zu erzeugen, die Teilaufgaben ( Funktionen ) erledigen. So können z.b. die Semaphoroperationen P, V und Init in ein eigenen Modul gelegt werden. Die Funktionen zum Empfangen/Senden von Aufträgen und Rücksenden/Empfangen Nachrichten zwischen Subklient und Server können ebenfalls in eigenen Modulen definiert werden. Zur Realisierung des Prozesses Client sollte der Kommandointerpreter aus Programmieren 3 ( 3. Übung ) verwendet werden. In diesem Fall besteht der Kommandointerpreter nicht aus einem, sondern mehreren Modulen Zur Realisierung des Hashing stehen die Module hash.c und stack.c schon zu Verfügung Wie man ein modulares Programm erstellt und verwaltet, können Sie dem Skript zu Programmieren 2, Kapitel Modulares Programmieren, entnehmen. Dieses Skript finden Sie unter der Homepage von Prof. Keller ( http://erde.fbe.fh-weingarten.de/keller ) unter dem Link Programmieren 2. SW-Module die sie für das Projekt zu Verfügug gestellt und benutzen sollen: 1. Kommandointerpreter In diesem Programm werden die Kommandos über eine Tabelle definiert. Sie müssen dieses Programm an die in der Aufgabe geforderten Kommandos anpassen. Die Erläuterungen zu dem Kommandointerpreter finden sie unter http://erde.fbe.fh-weingarten.de/keller. 2. Hasching Der Index zu einem Wort wird über eine Hashfunktion H(Schlüssel ) berechnet. Das Hashing-Modul verwendet folgende Hashfunktion: Schlüssel ist ein Wort. Das Wort enthält Zeichen c1... cn, 1<=n<=14. Im Index werden nur die ersten 14 Zeichen berücksichtigt. Index(c1,..,cn) =H(ci)= n 1 ci mod M mit M= 991 Diese Funktion ist nicht eindeutig, d.h. für zwei unterschiedliche Worte kann der gleiche Index auftreten. Man spricht von einer Kollision. Zur Kollisionsbehandlung ist die Methode des quadratischen Sondierens /1/,/2/ zu wählen. Die Kollision wird hierbei durch folgendes Vorgehen gelöst: Index 0 (Schlüssel) = H(Schlüssel) Index 1 (Schlüssel) = (H(Schlüssel +1 2 ) mod M Index 2 (Schlüssel) = (H(Schlüssel) -1 2 ) mod M Seite 5 von 6
Index 3 (Schlüssel) = (H(Schlüssel) + 2 2 ) mod M Index 4 (schlüssel) = (H(Schlüssel) -2 2 ) mod M.. Index 2i-1 (Schlüssel) = ( H(Schlüssel) + i 2 ) mod M Index 2i (Schlüssel) = ( H(Schlüssel) - i 2 ) mod M 1 <= i <= (M-1)/2 Ist der errechnete Index 0 schon vergeben wird Index 1 versucht. Ist dieser vergeben wird Index 2 versucht usw. Das Hashing müssen Sie nicht selbst realisieren. Es werden Ihnen einige Funktionen schon zu Verfügung gestellt, die Sie in Ihr Programm einbinden können. Mehr Informationen zu Thema Hashing erhalten sie im Skript zu Programmieren 2. Dieses Skript finden Sie unter der Homepage von Prof. Keller ( http://erde.fbe.fh-weingarten.de/keller ) unter dem Link Programmieren 2. Literaturverzeichnis /1/ Wirth, Niklaus: Algorithmen und Datenstrukturen /2/ Güting, R.H.: Datenstrukturen und Algorithmen, Teubner Stuttgart 1992 /3/ W. Richard Stevens: Programmierung von UNIX-Netzen, Grundlagen, Programmierung, Anwendung, Carl Hanser Verlag,, 1992, ISBN 3-446-16318-2 /4/ W. Richard Stevens: Programmierung in der Unix Umgebung, Addison Wesley, ISBN 3-89319-814-8 /5/ Bach, Maurice J.: UNIX - Wie funktioniert das Betriebssystem, Carl Hanser Verlag, 1991, ISBN 3-446-15693-3 /6/ RRZN Unix ( Benutzung ), kann beim Asta erworben werden /7/ RRZN Unix Systemverwaltung,kann beim Asta erworben werden /8/ Banahan & Rutter,: UNIX lernen, verstehen, anwenden, Carl Hanser Verlag, 1987, ISBN 3-446-13975-3 /9/ Gulbins, Jürgen : UNIX, 3. Auflage, Springer Verlag, 1988, ISBN3-540-13242-2 /10/ Rochkind, M.: UNIX Programmierung für Fortgeschrittene, Hanser Verlag, 1991 /11/ H. Herold: Linux - Unix Systemprogrammierung, Addison Wesley ISBN 3-8273-1512-3 /12/ Gampp,Keller Unterlagen zum praktikum, http://erde.fbe.fh-weingarten.de/keller Seite 6 von 6