2012-12-19 16 views

Odpowiedz

7

Ponieważ nie chodzi o szybkość. Operacje write i read są po prostu kopiowanie pamięci w zamaskowaniu. Wszystko, co robią, to kopiowanie danych odpowiednio do i z jądra. To znaczy. w rzeczywistości nie wysyłają ani nie otrzymują niczego.

Funkcja blokowania a nieblokująca pyta: czy wolisz zablokować te operacje, aż do ukończenia, czy też zwrócić -1 i EAGAIN na wypadek, gdyby nie można było ich natychmiast wykonać? Na przykład czytasz z gniazda, ale nie ma nic w buforze odbiorczym. Czy wolisz mieć wiszące recv, dopóki coś nie pojawi się lub nie zwróci -1 EAGAIN?

+0

Dzięki za oświecenie. –

+0

To dość przebranie z IOCP, gdzie tablice wskaźnika bufora użytkownika są przekazywane do jądra za pomocą wywołań WSASec/WSARecv. Nadal istnieje ruch danych, ale przypuszczam, że bufory sprzętowe NIC mogą być bezpośrednio DMA-em do buforów przestrzeni użytkownika - wycina jeden poziom marnego kopiowania. –

6

Z mojego doświadczenia wynika, że ​​nieblokujące operacje winsock są nieco wolniejsze, ale znacznie bardziej skalowalne. Faktem jest, że trzeba wykonać dwa wywołania systemowe oraz pewne wywoływanie na poziomie aplikacji podczas wykonywania niezablokowanych operacji we/wy (z IOCP) i jednego wywołania systemowego, jeśli używane jest blokowanie operacji we/wy. Jeśli masz wiele równoczesnych połączeń, niezablokowane operacje we/wy są znacznie szybsze ze względu na bardziej skalowalną architekturę, jeśli są dobrze zaimplementowane.

Jeśli chcesz przesłać dane od punktu do punktu z maksymalną przepustowością - użyj blokowania we/wy. Jeśli chcesz obsłużyć wiele jednoczesnych połączeń klienckich, użyj niezablokowanych operacji we/wy. Nie oczekuj zbyt wiele od żadnego z nich.

Ogólnie rzecz biorąc, chodzi bardziej o architekturę serwerów "sterowaną zdarzeniami a gwintowanymi" niż "blokowanie kontra nieblokowanie". Nie ma uniwersalnej architektury serwera, którą można wykorzystać w każdej sytuacji. To zależy od zastosowania.