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.4 Nebenläufige Server <strong>mit</strong> Prethreading 277<br />

dürfen, haben wir der durch IEEE Std 1003.1-2001 geforderten <strong>Threads</strong>icherheit<br />

der Funktion zu verdanken. Es gibt allerdings auch ältere Implementierungen,<br />

die offensichtlich nicht völlig zu IEEE Std 1003.1-2001 konform sind<br />

<strong>und</strong> bei denen der nebenläufige Aufruf von accept() zu einem Fehler führen<br />

kann (meist EPROTO). In diesem Fall empfiehlt es sich, den accept()-Aufruf<br />

in einen Mutex zu packen <strong>und</strong> da<strong>mit</strong> vor der gleichzeitigen Verwendung in<br />

mehreren <strong>Threads</strong> zu schützen:<br />

pthread_mutex_lock( &accept_mutex );<br />

client = accept( sd, (struct sockaddr *)&sa, &slen );<br />

pthread_mutex_unlock( &accept_mutex );<br />

if( client < 0 )<br />

{<br />

...<br />

}<br />

Mit dieser Schutzvorrichtung kann dann in keinem Fall mehr etwas schieflaufen.<br />

Die Mutex-Variante des nebenläufigen Accept-Handlers verhindert auch<br />

noch einen weiteren unschönen Nebeneffekt, der auf manchen (meist älteren)<br />

<strong>Unix</strong>-Systemen bei nebenläufigen accept()-Aufrufen zum tragen kommt:<br />

Wurde das Drei-Wege-Handshake für eine neue TCP-Verbindung abgeschlossen<br />

<strong>und</strong> warten mehrere <strong>Threads</strong> <strong>mit</strong>tels accept() auf eingehende Verbindungen,<br />

so kann es sein, daß vom System alle wartenden <strong>Threads</strong> aufgeweckt<br />

werden. 11 Natürlich kommt letztendlich nur ein einziger Thread zum Zug <strong>und</strong><br />

die anderen <strong>Threads</strong> kehren folglich auch nicht aus ihrem accept()-Aufruf<br />

zurück, aber der CPU-Aufwand, der durch das (sinnlose) Aufwecken verursacht<br />

wird, wirkt sich negativ auf das Laufzeitverhalten des Dæmons aus.<br />

5.4.2 Das Hauptprogramm als Signalverarbeiter<br />

65–94<br />

Der erste Teil des Hauptprogramms aus Beispiel 5.16 ist identisch zu Beispiel<br />

5.14. Als erstes wird ein horchender Socket erstellt, danach die Signalmaske<br />

des Hauptthreads angepaßt, der Prozeß in einen Dæmon umgewandelt<br />

<strong>und</strong> zuletzt werden noch die CPU-Statistiken initialisiert.<br />

11 Dieses Phänomen wird in der Literatur oft als th<strong>und</strong>ering herd problem, also als<br />

das Aufschrecken einer Herde (von <strong>Threads</strong> oder Prozessen) bezeichnet.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!