Pregunta

Para el trabajo, necesito escribir un demonio tcp para responder a nuestro software de cliente y me preguntaba si alguien tenía algún consejo sobre la mejor manera de hacerlo.

¿Debo bifurcar para cada nueva conexión como normalmente usaría hilos?

¿Fue útil?

Solución

Depende de su aplicación. Los subprocesos y la bifurcación pueden ser enfoques perfectamente válidos, así como la tercera opción de un modelo basado en eventos de un solo subproceso. Si puede explicar un poco más sobre exactamente lo que está escribiendo, sería útil dar consejos.

Para lo que vale, aquí hay algunas pautas generales:

  • Si no tiene un estado compartido, use bifurcación.
  • Si ha compartido el estado, use hilos o un sistema controlado por eventos.
  • Si necesita un alto rendimiento en un gran número de conexiones, evite la bifurcación, ya que tiene una sobrecarga mayor (particularmente el uso de memoria). En su lugar, use hilos, un bucle de eventos o varios hilos de bucles de eventos (generalmente uno por CPU).

Generalmente la bifurcación será la más fácil de implementar, ya que esencialmente puede ignorar todas las demás conexiones una vez que bifurca; subprocesos el siguiente más difícil debido a los requisitos de sincronización adicionales; el bucle de eventos es más difícil debido a la necesidad de convertir su procesamiento en una máquina de estado; y múltiples subprocesos que ejecutan bucles de eventos, el más difícil de todos (debido a la combinación de otros factores).

Otros consejos

Sugeriría bifurcar las conexiones a través de hilos cualquier día. El problema con los hilos es el espacio de memoria compartida y lo fácil que es manipular la memoria de otro hilo. Con los procesos bifurcados, cualquier comunicación entre los procesos debe ser hecha intencionalmente por usted.

Solo busqué y encontré esta respuesta SO: ¿Cuál es el propósito de tenedor? . Obviamente sabes la respuesta a eso, pero la respuesta # 1 en ese hilo tiene buenos puntos sobre las ventajas de fork ().

Además de la buena respuesta de @ hobodave, otro beneficio de "bifurcación por conexión" es que podría implementar su servidor de manera muy simple, usando inetd o tcpserver o similar: luego puede usar la entrada estándar y la salida estándar para comunicarse con el socket, y no no tiene que hacer ninguna gestión de socket de escucha (escucha de conexiones, etc.), etc.

Otra opción, por supuesto, es bifurcar previamente varias copias del demonio y hacer que cada uno permanezca vivo y continúe respondiendo solicitudes. Todo depende de su aplicación, la carga esperada y los requisitos de rendimiento, entre otras cosas.

La forma más fácil y sencilla es escribir un demonio basado en inetd; su software puede ignorar el hecho de que se ejecuta a través de una conexión TCP y simplemente manejar la entrada / salida a través de stdin / stdout. Eso funciona bien en la gran mayoría de los casos.

Si no planea recibir muchas conexiones nuevas por segundo, considere ejecutar desde inetd. De lo contrario ...

Descargue la fuente OpenSSH. Pusieron mucho trabajo en la separación de privilegios a la perfección, es portátil y ha sido analizado por seguridad más que por cualquier otra cosa.

Adaptarlo a sus necesidades, probablemente pueda tirar la mayor parte. Cumplir con el acuerdo de licencia, por supuesto. Siga los parches futuros con un buen SCC.

No se preocupe por el rendimiento de los procesos de bifurcación frente a los hilos hasta que tenga una buena evidencia de que es un problema real. Apache pasó años y años administrando los sitios más activos con solo el modelo simple de proceso por cliente.

Si eres realmente ambicioso, podrías usar algún tipo de modelo de E / S asíncrono sin bloqueo. Me gusta Boost.Asio, pero soy pesado en C ++.

Asegúrese de que su código maneja las señales correctamente. HUP para recargar la configuración. PLAZO para cerrar con gracia.

No intentes escribir tu propio archivo de registro. Use solo syslog, o simplemente escriba en stderr que se pueda redirigir a syslog. Es un verdadero dolor tratar de configurar logrotate en servidores integrados en casa que registran de manera ligeramente diferente.

Si desea evitar enhebrar / bifurcar todos juntos, recomendaría usar todas las E / S sin bloqueo junto con liberante . Libevent es bastante conocido como una solución de alto rendimiento para la programación basada en eventos.

Busque ACE (C ++ / Java) . Tiene una serie de reactores TCP roscados, de eventos y de bifurcación que satisfacen sus requisitos de comunicaciones. También puede consultar Boost ASIO que hace algo similar

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