Pequeña biblioteca de red C ++
| Parte ⅰ | Parte ⅱ | Parte ⅲ | Parte ⅳ | Parte V | Parte ⅵ | Parte ⅶ |
|---|
| Introducción del proyecto | Características del proyecto | Entorno de desarrollo | Modelo de concurrencia | Construir un proyecto | Casos de ejecución | Explicación del módulo |
Introducción del proyecto
Este proyecto es una biblioteca de redes múltiples basada en el modelo de reactor implementado por MUDUO. Usando C ++ 11 para escribir para eliminar la dependencia de Muduo de BOOST, se implementa un pequeño servidor HTTP internamente, que puede admitir solicitudes y acceso a recursos estáticos, y se acompaña de registros asíncronos para monitorear la situación del servidor.
El proyecto ha implementado el módulo de canal, el módulo de pollador, el módulo de bucle de eventos, el módulo HTTP, el módulo de temporizador, el módulo de registro asíncrono, el módulo de grupo de memoria y el módulo de grupo de conexión de base de datos.
Características del proyecto
- La capa subyacente utiliza el modelo de multiplexación de E/S del modo Epoll + LT e implementa el modelo de reactor de esclavo maestro en combinación con E/S sin bloqueo.
- Adopte el modelo de hilo "un bucle por hilo" y encapsula el grupo de hilo hacia arriba para evitar la sobrecarga de rendimiento causada por la creación y destrucción de hilos.
- EventFD se usa como descriptor de notificación de eventos para facilitar el envío eficiente de eventos a otros hilos para realizar tareas asincrónicas.
- Los registros asíncronos se implementan en función de los búferes dobles autoimplementados, y el hilo de backend es responsable de escribir información de registro frontal en el disco regularmente para evitar bloquear los servicios de red cuando los datos caen del disco.
- La estructura de administración del temporizador se implementa en función del árbol rojo y negro, y el TimerFD de Linux se usa internamente para notificar a las tareas de vencimiento, y las tareas cronometradas se administran de manera eficiente.
- Siga las técnicas RAII para administrar la memoria utilizando punteros inteligentes para reducir el riesgo de fuga de memoria.
- Use máquinas de estado finitas para analizar paquetes de solicitud HTTP.
- Refiriéndose a NGINX, el módulo de grupo de memoria se implementa para administrar mejor el espacio de memoria pequeño y reducir la fragmentación de la memoria.
- El grupo de conexión de la base de datos puede administrar dinámicamente el número de conexiones, generar o destruir conexiones de manera oportuna y garantizar el rendimiento del grupo de conexión.
Entorno de desarrollo
- Sistema operativo:
Ubuntu 18.04.6 LTS - Compilador:
g++ 7.5.0 - Editor:
vscode - Control de la versión:
git - Construcción del proyecto:
cmake 3.10.2
Modelo de concurrencia
El proyecto adopta el modelo de reactor de esclavo maestro.
Después de llamar a la función de inicio de TCPServer, se creará un grupo de subprocesos internamente. Cada hilo ejecuta un bucle de evento de forma independiente, a saber, el subreactor. Mainreactor encuesta el subreactor del grupo de hilos y lo despacha a una nueva conexión. Hay muchas ventajas en el uso del modelo de reactor maestro-esclavo:
- Respuesta rápida y no tiene que ser bloqueado por un solo evento de sincronización, aunque el reactor en sí sigue siendo sincrónico;
- Puede evitar problemas complejos de subprocesos múltiples y sincronización en la mayor medida, y evitar el cambio de múltiples subprocesos/procesos;
- Tiene buena escalabilidad, lo que puede facilitar el uso completo de los recursos de la CPU al aumentar el número de instancias de reactores;
- La reutilización es buena, y el modelo de reactor en sí mismo no tiene nada que ver con la lógica específica de procesamiento de eventos y tiene una alta reutilización;
Construir un proyecto
Instalar cmake
sudo apt-get update
sudo apt-get install cmake
Descarga el proyecto
Ejecutar el proyecto de compilación de script
cd ./tiny-network && bash build.sh
Casos de ejecución
Aquí tomamos un servidor de eco simple como un caso, y el puerto de escucha predeterminado de EchoServer es 8080 .
cd ./example
./EchoServer
Estado de implementación:
El módulo http tiene un pequeño caso de servidor HTTP que también se puede ejecutar. Su escucha predeterminada 8080 :
cd ./src/http && ./HttpServer
Explicación del módulo
Algunos módulos aquí configurarán el código fuente de Muduo para explicar, y otros usan el código fuente de este proyecto, pero las ideas de implementación son consistentes.
Módulo de canal
Módulo de pollero
Módulo de eventloop
Módulo de búfer
Módulo de temporizador
Módulo HTTP
Módulo de registro asíncrono
Módulo de grupo de memoria
Módulo de grupo de conexión de base de datos
Plan de optimización
- Planifique implementar la marca de tiempo subyacente usando std :: crono
- Administrar la estructura del temporizador utilizando la cola prioritaria
- Cobertura más pruebas unitarias
agradecido
- "Programación del servidor de alto rendimiento de Linux"
- "Programación del servidor multithreadado de Linux: usando la biblioteca de red Muduo C ++"
- https://github.com/chenshuo/muduo