Il server in ascolto sulla porta 80 non DEVE gestire più processi. I demoni TCP semplici degli anni più vecchi potevano gestire solo una connessione alla volta. È possibile emulare questo comportamento avendo un programma come l' netcat
ascolto su una porta specifica e provare a connettere due macchine ad esso. Uno entrerà, l'altro rimbalzerà senza una connessione. Questi demoni sono per lo più inutili, quindi non li vedi più.
Per qualcosa come un web server, è in ascolto direttamente sulla porta. La cosa da tenere a mente è che si trova in cima alla libreria dei socket del sistema operativo. Quando viene stabilita una nuova connessione, la libreria socket passa il nuovo socket al software del server web. A quel punto, il software del server web ha alcune opzioni.
Una possibilità è che passi l'oggetto socket a un nuovo thread nello stesso processo. Ogni volta che la comunicazione avviene su questo socket, questo thread lo gestirà. Il processo genitore media quali thread sono attivi in un dato momento, il che potrebbe essere molto.
Un'altra possibilità è che gira su un nuovo processo e passa l'oggetto socket al processo. A quanto ho capito, ora tocca al sistema socket del sistema operativo mediare la comunicazione tra questi processi figlio e i loro obiettivi. Il processo genitore ha ancora un certo controllo sui processi, come l'uccisione di quelli sospesi e altre comunicazioni tra processi.
Quale di questi approcci è più efficiente dipende dal sistema operativo. IIRC, Apache può essere eseguito in entrambe le modalità.
In sostanza, la libreria socket fornisce un livello di elaborazione parallela al web server. Può gestire più connessioni simultanee trasferendo attivamente i dati, il tutto accettando nuove connessioni.
Per un browser in grado di convertire più tentativi di connessione a un server web per migliorare i tempi di caricamento, si applica anche il parallelismo sul lato browser, questa è una cosa buona e meravigliosa. Il browser tiene traccia dello stato della pagina durante il caricamento e i molteplici tentativi di connessione che fa girare fanno parte del processo.
recv()
in ogni processo.