2012-12-19 20 views

risposta

7

Perché non si tratta di velocità. Le operazioni write e read sono solo durante la copiatura della memoria in incognito. Tutto ciò che fanno è copiare i dati da e verso il kernel, rispettivamente. Cioè in realtà non inviano o ricevono nulla.

La funzione di blocco e non blocco chiede: preferisci queste operazioni bloccare fino al completamento o per restituire -1 e EAGAIN nel caso in cui non possano essere eseguite immediatamente? Ad esempio, si legge da un socket ma non c'è nulla nel buffer di ricezione. Preferisci che lo recv resti sospeso fino a quando qualcosa non arriva o per restituire -1 EAGAIN?

+0

Grazie per l'illuminazione. –

+0

È piuttosto un travestimento con IOCP, in cui gli array di puntatori del buffer utente vengono comunicati nel kernel con le chiamate WSASend/WSARecv. C'è ancora del movimento dei dati, ma suppongo che i buffer hardware della NIC possano essere trasferiti direttamente nei buffer dello spazio utente, eliminando un livello di copia miserabile. –

6

Nella mia esperienza le operazioni di winsock non bloccanti sono leggermente più lente ma molto più scalabili. Il fatto è che è necessario effettuare due chiamate di sistema e un po 'di dispacciamento a livello di applicazione quando si esegue l'I/O non bloccante (con IOCP) e una chiamata di sistema se si utilizza l'I/O di blocco. Se si dispone di molte connessioni simultanee, l'I/O non bloccante è molto più veloce a causa di un'architettura più scalabile se implementata correttamente.

Se è necessario trasferire i dati da punto a punto con larghezza di banda massima, utilizzare l'I/O di blocco. Se è necessario gestire molte connessioni client simultanee, utilizzare I/O non bloccante. Non aspettarti troppo da nessuno di loro.

In generale si tratta più dell'architettura del server "event-driven vs threaded", quindi "blocking vs nonblocking". Non esiste un'architettura server universale che possa essere utilizzata in qualsiasi situazione. Dipende dall'applicazione.