2010-04-28 7 views
10

¿Es un servidor esencialmente un proceso en segundo plano que ejecuta un bucle infinito escuchando en un puerto? Por ejemplo:¿Es un servidor un bucle infinito ejecutándose como un proceso en segundo plano?

while(1){ 
    command = read(127.0.0.1:xxxx); 
    if(command){ 
     execute(command); 
    } 
} 

Cuando digo servidor, obviamente no me refiero a un servidor físico (computadora). Me refiero a un servidor MySQL, o Apache, etc.

Divulgación completa - No he tenido tiempo de hojear ningún código fuente. ¡Los ejemplos reales de código serían geniales!

+1

No muy lejos enfrente él la verdad ..Pero la lectura es normalmente una lectura de bloqueo para el sistema, que solo regresa cuando tiene algo que devolver. Sin datos recibidos == sin ejecución. – eaanon01

+0

@ eaanon01 - if (comando) es básicamente mi manera de decir "si se reciben datos". – Tony

+1

..why etiquetado C? –

Respuesta

6

Eso es más o menos lo que generalmente hace el software de servidor.

Normalmente se vuelve más complicado porque el bucle infinito "solo" acepta la conexión y cada conexión puede manejar múltiples "comandos" (o como se llamen en el protocolo usado), pero la idea básica es más o menos así.

+0

¿Básicamente estás diciendo que mi pseudo-código + subprocesamiento es bastante correcto? – Tony

+0

@Tony: sí. Por supuesto, el pseudocódigo implica que todavía hay muchos detalles para hacerlo bien, pero esa es la idea. –

+0

No del todo. Lo que queda es _how_. –

2

En cuestión de hablar, sí. Un servidor es simplemente algo que "gira para siempre" y sirve. Sin embargo, normalmente encontrará que los "daemons" hacen cosas como abrir STDOUT y STDERR en manejadores de archivos o/dev/null junto con forks dobles entre otras cosas. Su código es un "servidor" muy simplista en cierto sentido.

4

Existen tres tipos de 'servidores': bifurcación, roscado y rosca simple (sin bloqueo). En general, todos giran en la forma en que se muestran, la diferencia es lo que sucede cuando hay algo que atender.

Un servicio de horquilla es solo eso. Para cada solicitud, se invoca fork() creando un nuevo proceso hijo que maneja la solicitud, luego sale (o permanece activo, para manejar solicitudes posteriores, dependiendo del diseño).

Un servicio de subprocesamiento es como un servicio de bifurcación, pero en lugar de un proceso completamente nuevo, se crea un nuevo subproceso para atender la solicitud. Al igual que los tenedores, a veces los hilos se quedan para manejar solicitudes posteriores. La diferencia en el rendimiento y la huella es simplemente la diferencia entre los hilos y las horquillas. Dependiendo del uso de memoria que es no dando servicio a un cliente (y propenso a cambiar), generalmente es mejor no clonar todo el espacio de direcciones. La única complejidad añadida aquí es la sincronización.

Un servidor de proceso único (también conocido como un único hilo) se bifurcará solo una vez para demonizar. No generará nuevos hilos, no generará procesos secundarios. Continuará sondeando() el socket para averiguar cuándo el descriptor de archivo está listo para recibir datos o si hay datos disponibles para procesar. Los datos para cada conexión se mantienen en su propia estructura, identificados por varios estados (escritura, espera de ACK, lectura, cierre, etc.). Este puede ser un diseño extremadamente eficiente, si se hace correctamente. En lugar de bloquear varios hijos o subprocesos mientras espera para trabajar, tiene un proceso único y solicitudes de servicio de bucle de eventos cuando estén listos.

Hay instancias donde los servicios de subproceso único generan múltiples subprocesos; sin embargo, los subprocesos adicionales no funcionan para atender las solicitudes entrantes, uno podría (por ejemplo) configurar un socket local en un subproceso que permita a un administrador obtener un estado de todas las conexiones.

Un poco de google para el servidor http no bloqueante dará algunos interesantes servidores web hechos a mano escritos como desafíos de código de golf.

En resumen, la diferencia es lo que sucede una vez que se entra en el bucle sin fin, no sólo el bucle sin fin :)

+1

gran explicación. – Tony

Cuestiones relacionadas