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

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

5.5 Nebenläufige Server <strong>mit</strong> mehreren Prozessen 281<br />

nur NUM_THREADS Client-Verbindungen (hier: acht Verbindungen) nebenläufig<br />

bearbeiten kann. Für die nachfolgenden Client-Anfragen erhöht sich die Wartezeit<br />

stufenweise. Dennoch ist das Verhalten des Prethreading-Servers aus<br />

der Sicht der Clients noch erheblich flüssiger als das Antwortsverhalten des<br />

iterativen Servers aus Abschnitt 5.2.<br />

Besonderheiten <strong>und</strong> Einsatzgebiete<br />

Die Eigenschaften eines nebenläufigen Servers <strong>mit</strong> Prethreading decken sich<br />

weitgehend <strong>mit</strong> den Eigenschaften der normalen threadbasierten Variante. Der<br />

kontrollierte Ressourcenverbrauch, der ganz automatisch über die maximale<br />

Anzahl von <strong>Threads</strong> <strong>und</strong> da<strong>mit</strong> die maximale Anzahl gleichzeitiger Verbindungen<br />

eingeführt wird, macht die Prethreading-Variante dabei noch etwas<br />

robuster als ihren Vorgänger. Aufgr<strong>und</strong> der nebenläufigen Abarbeitung der<br />

eintreffenden Anfragen ist auch hier ein einziger böswilliger Client nicht dazu<br />

in der Lage, den Server zu blockieren. Verhalten sich aber gleich eine ganze<br />

Menge von Clients derart böswillig, so ist bei dieser Server-Variante durchaus<br />

ein Denial of Service möglich. Deshalb kann auch hier bei wichtigen Diensten<br />

ein Timeout <strong>mit</strong> select(), über die die Socket-Optionen SO_RCVTIMEO <strong>und</strong><br />

SO_SNDTIMEO oder <strong>mit</strong> Pthreads-Bord<strong>mit</strong>teln durchaus sinnvoll sein.<br />

Wie alle rein threadbasierten Server besitzen auch alle <strong>Threads</strong> des nebenläufigen<br />

Servers <strong>mit</strong> Prethreading die selben Credentials, teilen sich also insbesondere<br />

die Prozeß-ID sowie die verschiedenen User- <strong>und</strong> Group-IDs (UID, GID,<br />

EUID, EGID; vgl. dazu Abschnitt 2.5.1). Soll der Server für verschiedene<br />

Anfragen (oder in speziellen Abschnitten der Bearbeitungsphase) andere Privilegien<br />

besitzen, so muß hierfür auf eines der in den nächsten Abschnitten<br />

vorgestellten prozeßbasierten Verfahren zurückgegriffen werden.<br />

5.5 Nebenläufige Server <strong>mit</strong> mehreren Prozessen<br />

Neben POSIX-<strong>Threads</strong> bieten <strong>Unix</strong>-Prozesse eine zweite, schwergewichtigere<br />

Möglichkeit, nebenläufige Handlungen zu initiieren. Bei nebenläufigen Servern<br />

die auf Basis mehrerer Prozesse arbeiten, werden Clientverbindungen anstatt<br />

von eigenständigen <strong>Threads</strong> von separaten Prozessen bearbeitet.<br />

Abbildung 5.8 zeigt die prinzipielle Struktur eines prozeßbasierten, nebenläufigen<br />

Servers: Ausgehend von einem Serverprozeß, der, analog zum iterativen<br />

Server aus Beispiel 5.9, in einer Schleife neue TCP-Verbindungen <strong>mit</strong>tels<br />

accept() annimmt, wird bei diesem Servertyp für jede neue Netzwerkverbindung<br />

ein neuer Prozeß gestartet. Dieser Kindprozeß kümmert sich dann im<br />

weitern Verlauf um die Kommunikation <strong>mit</strong> dem Client. Nachdem der neue<br />

Prozeß <strong>mit</strong>tels fork() gestartet wurde, schließt der Serverprozeß umgehend

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!