El servidor que escucha en el puerto 80 no TIENE que manejar múltiples procesos. Los demonios TCP simples de los años mayores solo podían manejar una conexión a la vez. Puede emular este comportamiento haciendo que un programa como netcat
listen en un puerto específico e intente conectar dos máquinas a él. Uno entrará, el otro rebotará sin una conexión. Estos demonios son en su mayoría inútiles, por lo que nunca más los verás.
Para algo así como un servidor web, está escuchando directamente en el puerto. Lo que hay que tener en cuenta es que se encuentra en la parte superior de la biblioteca de sockets del sistema operativo. Cuando se establece una nueva conexión, la biblioteca de sockets pasa el nuevo socket al software del servidor web. En ese punto, el software del servidor web tiene algunas opciones.
Una posibilidad es que pase el objeto de socket a un nuevo hilo en el mismo proceso. Siempre que la comunicación ocurra a través de este socket, este hilo lo manejará. El proceso padre media qué hilos están activos en un momento dado, lo que podría ser mucho.
Otra posibilidad es que acelere un nuevo proceso y pase el objeto socket al proceso. Según tengo entendido, ahora depende del sistema de socket del sistema operativo mediar en la comunicación entre estos procesos secundarios y sus objetivos. El proceso padre todavía tiene cierto control sobre los procesos, como matar a los colgados y otras comunicaciones entre procesos.
Cuál de estos enfoques es más eficiente depende del sistema operativo. IIRC, Apache puede ejecutarse en cualquier modo.
En esencia, la biblioteca de sockets proporciona un nivel de procesamiento paralelo al servidor web. Puede manejar múltiples conexiones simultáneas transfiriendo datos activamente, todo mientras acepta nuevas conexiones.
Para un navegador que puede activar múltiples intentos de conexión a un servidor web para mejorar los tiempos de carga, el paralelismo se aplica también en el extremo del navegador, esto es algo bueno y maravilloso. El navegador realiza un seguimiento del estado de la página a medida que se carga, y los múltiples intentos de conexión que gira son parte del proceso.
recv()
en cada proceso.