thread subproceso definicion multithreading sockets tcp udp

multithreading - subproceso - thread join c#



¿Cómo se minimiza la cantidad de subprocesos utilizados en una aplicación de servidor tcp? (4)

Estoy buscando cualquier estrategia que las personas utilicen al implementar aplicaciones de servidor que atiendan solicitudes TCP (o UDP) de clientes: patrones de diseño, técnicas de implementación, mejores prácticas, etc.

Supongamos, a los fines de esta pregunta, que las solicitudes tienen una vida relativamente larga (varios minutos) y que el tráfico es sensible al tiempo, por lo que no hay retrasos aceptables en la respuesta a los mensajes. Además, estamos atendiendo solicitudes de clientes y haciendo nuestras propias conexiones a otros servidores.

Mi plataforma es .NET, pero como la tecnología subyacente es la misma independientemente de la plataforma, me interesan las respuestas para cualquier idioma.


Gday,

Comenzaría mirando la metáfora que quiere usar para su marco de trabajo.

Tal vez "seguidor líder", donde un hilo está escuchando las solicitudes entrantes y cuando llega una nueva solicitud, el trabajo y el siguiente hilo del grupo comienzan a escuchar las solicitudes entrantes.

O el grupo de subprocesos donde el mismo subproceso siempre está a la escucha de solicitudes entrantes y luego pasa las solicitudes al siguiente subproceso disponible en el grupo de subprocesos.

Es posible que desee visitar la sección Reactor de Ace Components para obtener algunas ideas.

HTH.

aplausos, Rob


Un enfoque más sofisticado sería usar puertos de finalización IO. (Windows) Con los puertos de finalización de IO se deja que el sistema operativo administre el sondeo, lo que le permite utilizar potencialmente un nivel muy alto de optimización con compatibilidad con el controlador NIC. Básicamente, tiene una cola de operaciones de red que está gestionada por el sistema operativo, y proporciona una función de devolución de llamada que se llama cuando finaliza la operación. Algo así como DMA (disco duro) pero para red.

Len Holgate escribió una serie ecléctica sobre puertos de terminación de E / S hace unos años en Codeproject: http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

Y encontré un artículo sobre puertos de terminación IO para .net (aunque no lo he leído) http://www.codeproject.com/KB/cs/managediocp.aspx

También diría que es fácil usar puertos de finalización en comparación con intentar y escribir una alternativa escalable. El problema es que solo están disponibles en NT (2000, XP, Vista)


Si usabas C ++ y Win32 directamente, te sugiero que leas acerca de los puertos de E / S superpuestos y de E / S. Tengo un framework de C ++, IOCP, cliente / servidor gratuito con código fuente completo, mira aquí para más detalles.

Dado que está utilizando .Net, debe considerar utilizar los métodos de socket asíncrono para que no necesite tener un hilo por cada conexión; Hay varios enlaces de esta entrada de blog que pueden ser puntos de partida útiles: http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month .html (algunos de los mejores enlaces están en los comentarios a la publicación original!)


El enfoque moderno es hacer uso del sistema operativo para multiplexar muchos sockets de red para usted, liberando su aplicación para que solo procese conexiones activas con el tráfico.

Cada vez que abre un socket, lo asocia con un selector. Utiliza un único hilo para sondear ese selector. Cuando lleguen datos, el selector indicará el socket que está activo, usted transferirá esa operación a un hilo secundario y continuará el sondeo.

De esta forma solo necesita un hilo para cada operación simultánea. Los zócalos que están abiertos pero inactivos no atarán un hilo.