2012-12-19 6 views

Antwort

7

Weil es nicht um Geschwindigkeit geht. Die Operationen write und read sind nur Speicher kopieren in Verkleidung. Alles, was sie tun, ist das Kopieren von Daten zum bzw. vom Kernel. I.e. sie tatsächlich nichts senden oder empfangen.

Die blockierende vs nonblocking Funktion fragt: Bevorzugen Sie diese Operationen zu blockieren, bis abgeschlossen oder -1 und EAGAIN zurückzugeben, wenn sie nicht sofort ausgeführt werden können? Zum Beispiel, Sie lesen von einem Socket, aber es gibt nichts im Empfangspuffer. Haben Sie lieber recv hängen, bis etwas kommt oder -1 EAGAIN zurückgeben?

+0

Danke für die Aufklärung. –

+0

Es ist eine Tarnung mit IOCP, bei der Benutzer-Pufferzeigerarrays mit den WSASend/WSARecv-Aufrufen in den Kernel kommuniziert werden. Es gibt noch einige Datenbewegungen, aber ich nehme an, dass die NIC-Hardware-Puffer direkt in die Benutzerraum-Puffer DMA'd werden können - schneidet eine Stufe des miserablen Kopierens aus. –

6

Meiner Erfahrung nach sind nicht blockierende Winsock-Vorgänge etwas langsamer, aber viel besser skalierbar. Tatsache ist, dass Sie zwei Systemaufrufe und ein gewisses Dispatching auf Anwendungsebene ausführen müssen, wenn Sie nicht blockierende E/A (mit IOCP) und einen Systemaufruf ausführen, wenn Sie blockierende E/A verwenden. Wenn Sie viele gleichzeitige Verbindungen haben, ist blockierungsfreie E/A viel schneller, da die Architektur besser skalierbar ist.

Wenn Sie Daten von Punkt zu Punkt mit maximaler Bandbreite übertragen müssen, verwenden Sie blockierende E/A. Wenn Sie viele gleichzeitige Clientverbindungen verarbeiten müssen, verwenden Sie nicht blockierende E/A. Erwarte nicht zu viel von ihnen.

Im Allgemeinen ist dies mehr über "Event-Driven vs Threaded" Server-Architektur dann "Blocking vs Nonblocking". Es gibt keine universelle Serverarchitektur, die in jeder Situation verwendet werden kann. Es hängt von der Anwendung ab.