Warum verwendet Apache MPM prefork.c einen Mutex zum Schutz von accept ()?

8

Ich setzte mich hin und las Apache MPM prefork.c und dieser Code verwendet eine Variable namens accept_mutex , um zu verhindern, dass mehrere Threads accept() aufrufen. Das ist seltsam, denn soweit ich weiß ist accept() Thread-sicher .

>

Ist accept () Thread sicher? Ist das ein Plattformkompatibilitätsproblem? Wenn ja, welche Plattform implementiert ein nicht Thread-sicheres accept() ?

    
rook 24.02.2013, 04:33
quelle

2 Antworten

6

Dies wird in der Apache-Leistungsoptimierung unter " accept() " erläutert. Serialisierung - mehrere Sockets ". Kurz gesagt, eine eingehende Verbindung wird alle Apache-Prozesse, die auf eingehende Verbindungen in select() oder poll() warten, unter mindestens einigen Betriebssystemen aufwecken, führt jedoch dazu, dass der accept() fehlschlägt alle außer einem von ihnen. Dies ist ineffizient, daher wird ein Mutex verwendet, um sicherzustellen, dass nur ein Prozess eine eingehende Verbindung gleichzeitig akzeptiert.

    
duskwuff 24.02.2013, 04:50
quelle
2

Lesen Sie die Kommentare in der Quelle, mit der Sie verlinkt sind. Es scheint, dass der Mutex nicht wirklich die Operation accept schützt, sondern die Liste der abhörenden Sockets, die abgefragt werden müssen (beachten Sie, dass der Mutex nicht verwendet wird, wenn es nur einen abhörenden Socket gibt, zumindest nicht auf nicht gebrochenen Systemen) accept funktioniert ordnungsgemäß). Wenn sich dies zur Laufzeit ändern könnte, ist der Code wahrscheinlich korrekt. Aber ich habe das Gefühl, dass sie nur etwas Unsinniges tun. Das ist Apache, also sollten Sie keinen hochwertigen oder gar vernünftigen Code erwarten ...

    
R.. 24.02.2013 04:42
quelle