05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

296 5 Netzwerkprogrammierung in der Praxis<br />

148 print_srv_stats(); /* CPU-Statistik ausgeben */<br />

149<br />

150 unlink( PIDFILE ); /* PID-Datei entfernen */<br />

151 exit( EXIT_SUCCESS ); /* Dummy, ... wird nie erreicht */<br />

152 }<br />

132–139<br />

141–146<br />

148–152<br />

Der Elternprozeß schließt, nachdem er die geforderte Anzahl von Serverinstanzen<br />

gestartet hat, den passiven Serversocket sd. Der Socket wird nicht<br />

weiter benötigt, da sich nun ausschließlich die Kindprozesse um die Annahme<br />

neuer Netzwerkverbindungen kümmern. Der Elternprozeß warten fortan nur<br />

noch auf das Eintreffen eines SIGTERM-Signals, das den Server beenden soll.<br />

Dazu greift der Dæmon in einer Schleife auf die pause()-Funktion zurück, die<br />

den Prozeß solange unterbricht, bis ein Signal eintrifft. Im Falle des SIGTERM-<br />

Signals verläßt das Hauptprogramm die Warteschleife<br />

Vor dem Programmende terminiert der Dæmon zunächst seine ganzen Kindprozesse.<br />

Er schickt dazu jeder von ihm gestarteten Serverinstanz per kill()<br />

ein SIGTERM-Signal. Die Prozeß-IDs der Kinder wurden hierfür beim Start<br />

im Feld child hinterlegt. Solange noch Kindprozesse aktiv sind, wartet der<br />

Server dann in einer Schleife per wait() auf das Ende der Serverinstanzen.<br />

Abschließend gibt der Dæmon noch die er<strong>mit</strong>telten CPU-Statistiken aus,<br />

löscht die PID-Datei <strong>und</strong> beendet sich schließlich selbst.<br />

5.6.4 Eigenschaften <strong>und</strong> Einsatzgebiete<br />

Zum Abschluß vergleichen wir auch den Preforking-Server noch in unserer<br />

Testumgebung <strong>mit</strong> den anderen Server-Varianten. Auf 30 sequentielle <strong>und</strong><br />

30 nebenläufige Anfragen hin muß der Server wieder Primzahlen bis zu einer<br />

Größe von maximal 250 000 berechnen <strong>und</strong> abschließend 500 kB an Daten zum<br />

Client transferieren.<br />

Laufzeitmessungen<br />

Sowohl für die sequentiellen als auch für die nebenläufigen Anfragen ist der<br />

Preforking-Server nur geringfügig langsamer als der vergleichbare threadbasierte<br />

Server aus Abschnitt 5.4. Wie Tabelle 5.5 zeigt, zahlt sich die Ressourcenbeschränkung<br />

vor allem bei vielen gleichzeitigen Client-Verbindungen<br />

sichtbar aus. Der für den Preforking-Server erforderliche Rechenaufwand<br />

bleibt hier gerade mal um vier Clockticks hinter dem Prethreading-Server<br />

zurück <strong>und</strong> liegt so<strong>mit</strong> um nur 8% über dem CPU-Bedarf des inkrementellen<br />

Servers (im Vergleich zu den 27% Mehraufwand des normalen prozeßbasierten<br />

Servers aus Abschnitt 5.5).

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!