Warum verbindet sich nicht blockierender Socket so langsam?

9

Wenn ich 100 non-block Socket-Verbindung in 1 Thread mache, ist es sehr langsam (die Anzahl der Verbindungen erhöht sich um eins), aber wenn ich eine blockierende Socket-Verbindung in 100 parallelen Threads mache (eine Verbindung pro Thread), es ist sehr schnell (sofort erledigt)

%Vor%     
jon 18.07.2011, 08:44
quelle

1 Antwort

5

Tolle Frage :-). Hier ist, warum ich denke, dass das passiert. Der Standard sagt das:

  

Wenn die Verbindung nicht hergestellt werden kann sofort und O_NONBLOCK ist   set für den Dateideskriptor für den Socket, sollte connect () fehlschlagen und   Setze errno auf [EINPROGRESS]

Die Frage ist natürlich was "sofort" bedeutet . Ich glaube, dass "sofort" tatsächlich eine kleine Zeit ist, in der die SYN , SYN-ACK , ACK passieren können. Wenn es überhaupt nicht warten würde, hätte es eine 0-Chance, tatsächlich zu bestehen.

Also im Grunde:

  • Der Client sendet eine SYN
  • Wartet (Blöcke) für einen kurzen Zeitraum ("sofort") für SYN-ACK .
  • Vervollständigt die Verbindung

Dabei wird anstelle von EADDRINUSE erfolgreich zurückgegeben.

Nun, wenn Threads verwendet werden, tut dies jeder Thread so, dass niemand wartet. Sie alle nur connect(2) und Kontextwechsel ermöglicht es jedem, es fast gleichzeitig zu tun.

    
cnicutar 18.07.2011, 09:05
quelle

Tags und Links