Esistono tre tipi di "server": biforcazione, threading e thread singolo (non bloccante). Tutti in genere fanno il giro come si mostra, la differenza è ciò che accade quando c'è qualcosa da servire.
Un servizio di forking è proprio questo. Fork() viene invocato per ogni richiesta creando un nuovo processo figlio che gestisce la richiesta, quindi esce (o rimane attivo, per gestire richieste successive, a seconda della progettazione).
Un servizio di threading è come un servizio di forking, ma invece di un processo completamente nuovo, viene creata una nuova stringa per servire la richiesta. Come i fork, a volte i thread rimangono in attesa per gestire le richieste successive. La differenza di prestazioni e ingombro è semplicemente la differenza tra fili e forche. A seconda dell'uso della memoria che è non che serve un client (e incline a cambiare), di solito è meglio non clonare l'intero spazio degli indirizzi. L'unica complessità aggiunta qui è la sincronizzazione.
Un singolo server (noto anche come thread singolo) esegue il fork solo una volta per il demone. Non genererà nuovi thread, non genererà i processi figli. Continuerà a eseguire il polling() del socket per scoprire quando il descrittore di file è pronto a ricevere dati o se i dati disponibili per essere elaborati. I dati per ciascuna connessione sono mantenuti nella propria struttura, identificati da vari stati (scrittura, attesa di ACK, lettura, chiusura, ecc.). Questo può essere un design estremamente efficiente, se fatto correttamente. Invece di bloccare più thread figlio o thread mentre si attende di lavorare, si dispone di un singolo processo e di richieste di manutenzione del ciclo eventi non appena sono pronti.
Esistono casi in cui i servizi a thread singolo generano più thread, tuttavia i thread aggiuntivi non funzionano per soddisfare le richieste in arrivo, si potrebbe (ad esempio) impostare un socket locale in un thread che consente a un amministratore di ottenere uno stato di tutte le connessioni.
Un po 'di google per server HTTP non bloccanti produrrà alcuni interessanti server Web laminati a mano scritti come sfide del codice golf.
In breve, la differenza è ciò che accade una volta che si entra nel ciclo infinito, non solo il ciclo infinito :)
Non lontano Fromt lui la verità ..Ma la lettura è normalmente una lettura bloccante per il sistema, che ritorna solo quando ha qualcosa da restituire. Nessun dato ricevuto == nessuna esecuzione. – eaanon01
@ eaanon01 - if (comando) è fondamentalmente il mio modo di dire "se i dati sono ricevuti". – Tony
.. perché ha taggato C? –