Pregunta

Supongamos que tenemos una aplicación de mensajería instantánea, cliente-servidor, no P2P. El protocolo real no importa, lo que importa es la arquitectura del servidor. El dicho servidor puede ser codificado para funcionar en modo de un solo subproceso, no paralela usando sockets no bloqueantes, que por definición nos permiten realizar operaciones como de lectura-escritura de manera efectiva inmediatamente (o inmediatamente). Esta misma característica de las tomas no bloqueantes nos permite utilizar algún tipo de función de selección / sondeo en el núcleo del servidor y de los residuos junto a ninguna hora en la toma real de operaciones de lectura / escritura, sino más bien para pasar el tiempo procesar toda esta información . Debidamente codificada, esto puede ser muy rápido, por lo que yo entiendo. Pero existe el segundo enfoque, y que es multi-hilo agresiva, la creación de un nuevo hilo (obviamente usando algún tipo de grupo de subprocesos, porque esa misma operación puede ser (muy) reducir la velocidad en algunas plataformas y bajo algunas circunstancias), y dejar que esos hilos al trabajo en paralelo, mientras que los principales identificadores de subproceso de fondo aceptar () y esas cosas. He visto este enfoque se explica en varios lugares sobre la red, por lo que obviamente existe.

Ahora la pregunta es, si tenemos enchufes no bloqueantes, y las operaciones inmediatas de lectura / escritura, y un diseño sencillo y fácilmente codificado, por eso ni siquiera existe la segunda variante? ¿Qué problemas estamos tratando de superar con el segundo diseño, es decir, hilos? Que yo sepa los se utiliza generalmente para el trabajo en torno a algunas operaciones lentas y, posiblemente, de bloqueo, pero no hay tales operaciones parecen estar presentes allí!

¿Fue útil?

Solución

Estoy asumiendo que usted no está hablando de tener un hilo por cliente como un diseño de este tipo es por lo general por razones completamente diffreent, sino más bien un grupo de subprocesos cada mangos varios clientes simultáneos.

La razón de que arcitecture contra un único servidor roscado es simplemente tomar ventaja de múltiples procesadores. Que está haciendo más trabajo que simplemente E / S. Usted tiene que analizar los mensajes, hacer diversos trabajos, tal vez incluso ejecutar algunos algoritmos criptográficos más pesados. Todo esto lleva a la CPU. Si desea modificar la escala, aprovechando las múltiples procesadores le permitirá escalar aún más, y / o mantener la latencia aún más bajo por cliente.

Parte de la ganancia en un diseño de este tipo puede ser un poco compensado por el hecho de que pueda necesitar más el bloqueo en un entorno multiproceso, pero se hace bien, y ciertamente depening sobre lo que está haciendo, puede ser una gran victoria - a costa de una mayor complejidad.

Además, esto podría ayudar a superar las limitaciones del sistema operativo. Las rutas de E / S en el núcleo puede ser que consiga más distribuida entre los procesors. No todos los sistemas operativos podrían ser totalmente capaz de enhebrar el IO de un solo aplicaciones roscados. En los viejos días no eran'nt todas las grandes alternativas a la antigua * nix seleccione (), que por lo general tenía un límite filedesciptor de 1024, y las API similares severamente comenzado degradantes vez que usted le dijo que para controlar demasiados zócalo. La difusión de todos aquellos clientes en varios subprocesos o procesos ayudado a superar ese límite.

En cuanto a una relación 1: 1 entre hilos, hay varias razones para poner en práctica que la arquitectura:

  • Más fácil modelo de programación, lo que podría conducir a menos difícil de encontrar errores, y más rápido de implementar.

  • Soporte de bloqueo de API. Estos son por todo el lugar. Que tiene un mango de rosca muchos / todos los clientes y luego ir a hacer una llamada de bloqueo a una base de datos va a puesto de todo el mundo. Incluso la lectura de archivos pueden bloquear su aplicación, y que por lo general no pueden supervisar identificadores de archivo / descriptores regulares para eventos IO -. O cuando se puede, el modelo de programación es a menudo complicado excepcionalmente

El inconveniente aquí es que no se escala, al menos no con el idiomas / marco más ampliamente utilizado. Tener miles de subprocesos nativos perjudicará el rendimiento. Aunque algunos idiomas proporciona un enfoque mucho más ligero que aquí, como Erlang y en cierta medida en Ir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top