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.

5.6 Nebenläufige Server <strong>mit</strong> Preforking 289<br />

in Abschnitt 5.2.4 beschrieben seine TCP-Verbindung zum Server, so nimmt<br />

letzterer nach wie vor neue Anfragen an. Der Server startet dazu einfach weitere<br />

Kindprozesse, die dann die Aufträge der Clients bearbeiten.<br />

Wie schon der threadbasierte Server aus Abschnitt 5.3 ist auch der hier vorgestellte<br />

Mehrprozeß-Server nicht in der Lage, seinen Ressourcenverbrauch<br />

zu kontrollieren. Der Server startet, der Anzahl seiner gleichzeitigen Clients<br />

entsprechend, prinzipiell beliebig viele Kindprozesse. Je mehr Clients der Server<br />

nebenläufig versorgt, desto mehr Betriebs<strong>mit</strong>tel sind auf der Server-Seite<br />

durch die beteiligten Kindprozesse geb<strong>und</strong>en. An den Laufzeitmessungen aus<br />

Tabelle 5.4 konnten wir ablesen, daß im Falle vieler Clients ein nicht unerbheblicher<br />

Aufwand auf das Scheduling der einzelnen Prozesse entfällt. Ein<br />

probates Mittel, die geb<strong>und</strong>enen Ressourcen zu li<strong>mit</strong>ieren, ist es wieder, die<br />

Anzahl der gestarteten Kindprozesse zu zählen <strong>und</strong> keine neuen Verbindungen<br />

mehr anzunehmen, sobald ein bestimmter Grenzwert überschritten ist. Eine<br />

weit verbreitete Alternative sind nebenläufige Server <strong>mit</strong> Preforking, die wir<br />

in Abschnitt 5.6 diskutieren.<br />

Im Unterschied zu den threadbasierten Server-Versionen aus den Abschnitten<br />

5.3 <strong>und</strong> 5.4 können die einzelnen Kindprozesse eines prozeßbasierten Servers<br />

durchaus <strong>mit</strong> unterschiedlichen Privilegien laufen. Beim Start erben die<br />

Kinder zwar jeweils die Credentials <strong>und</strong> da<strong>mit</strong> die Privilegien des Elternprozeß’,<br />

doch nachfolgende Änderungen an z. B. der effektiven User- oder Group-<br />

ID wirken sich dann nur noch auf den jeweiligen Kindprozeß aus. Insofern<br />

kann ein Accept-Handler bei Bedarf <strong>mit</strong>tels seteuid() oder seteuid() die<br />

effektive User- oder Group-ID wechseln, ohne dabei ungewollt die Privilegien<br />

der anderen Accept-Handler zu beeinflussen.<br />

5.6 Nebenläufige Server <strong>mit</strong> Preforking<br />

Der Mehraufwand, den der nebenläufige Server aus Abschnitt 5.5 für die<br />

ständige Erzeugung neuer Prozesse leisten muß, läßt sich auch hier wieder<br />

durch das vorzeitige Erzeugen dieser Prozesse vermindern. Analog zum<br />

Prethreading-Server aus Abschnitt 5.4.2 wird beim Preforking-Server eine gewisse<br />

Anzahl von Kindprozessen im Voraus generiert, die später in ihrer Funktion<br />

als Accept-Handler die eingehenden Netzwerkverbindungen eigenständig<br />

verarbeiten. Dieses Vorgehen wird in Abb. 5.10 illustriert.<br />

Ganz nebenbei wird dadurch die Maximalzahl der Kindprozesse bestimmt <strong>und</strong><br />

in der Folge auch der vom Server verursachte Ressourcenverbrauch li<strong>mit</strong>iert.<br />

Der Elternprozeß beteiligt sich selbst überhaupt nicht an der Behandlung der<br />

Verbindungen, sondern kümmert sich lediglich um den Serverstart, die Verwaltung<br />

der Kindprozesse, sowie schließlich um die Terminierung der beteiligten<br />

Serverprozesse.<br />

Auch beim Preforking-Server können die einzelnen Serverinstanzen alle gleichzeitig<br />

<strong>mit</strong>tels accept() am gleichen passiven Serversocket auf eingehende

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!