Tiny C ++ Network Library
| Parte ⅰ | Parte ⅱ | Parte ⅲ | Parte ⅳ | Parte V. | Parte ⅵ | Parte ⅶ |
|---|
| Introdução ao projeto | Recursos do projeto | Ambiente de Desenvolvimento | Modelo de simultaneidade | Construir um projeto | Casos de execução | Explicação do módulo |
Introdução ao projeto
Este projeto é uma biblioteca de rede com vários threads com base no modelo de reator implementado pelo Muduo. Usando o C ++ 11 para gravar para remover a dependência do Muduo no Boost, um pequeno servidor HTTP é implementado internamente, o que pode suportar solicitações e acesso a recursos estáticos e é acompanhado por logs assíncronos para monitorar a situação do servidor.
O projeto implementou o módulo de canal, o módulo de pesquisadores, o módulo de loop de eventos, o módulo HTTP, o módulo do timer, o módulo de log assíncrono, o módulo de pool de memória e o módulo de pool de conexão do banco de dados.
Recursos do projeto
- A camada subjacente usa o modelo de multiplexação de E/S do modo Epoll + LT e implementa o modelo de reator mestre-escravo em combinação com E/S não bloqueadora.
- Adote o modelo "One Loop por Thread" e encapsule o pool de threads para evitar a sobrecarga de desempenho causada pela criação e destruição do encadeamento.
- O EventFD é usado como o descritor de notificação de eventos para facilitar o envio eficiente de eventos para outros threads para executar tarefas assíncronas.
- Os logs assíncronos são implementados com base em buffers duplos auto-implementados, e o thread de back-end é responsável por escrever informações de log front-end no disco regularmente para evitar bloquear os serviços de rede quando os dados caem do disco.
- A estrutura de gerenciamento do timer é implementada com base na árvore vermelha e preta, e o timerfd do Linux é usado internamente para notificar tarefas de validade, e as tarefas cronometradas são gerenciadas com eficiência.
- Siga as técnicas RAII para gerenciar a memória usando ponteiros inteligentes para reduzir o risco de vazamento de memória.
- Use máquinas de estado finitas para analisar pacotes de solicitação HTTP.
- Referindo -se ao NGINX, o módulo de pool de memória é implementado para gerenciar melhor o pequeno espaço de memória e reduzir a fragmentação da memória.
- O pool de conexão do banco de dados pode gerenciar dinamicamente o número de conexões, gerar ou destruir conexões em tempo hábil e garantir o desempenho do pool de conexões.
Ambiente de Desenvolvimento
- Sistema Operacional:
Ubuntu 18.04.6 LTS - Compilador:
g++ 7.5.0 - Editor:
vscode - Controle de versão:
git - Construção do projeto:
cmake 3.10.2
Modelo de simultaneidade
O projeto adota o modelo de reator mestre.
Depois de chamar a função de início do TCPServer, um pool de threads será criado internamente. Cada thread executa um loop de evento de forma independente, a saber, sub -reator. O MainReactor pesquisou o sub -reator do pool de threads e o despacha para uma nova conexão. Existem muitas vantagens em usar o modelo de reator mestre-escravo:
- Resposta rápida e não precisa ser bloqueado por um único evento de sincronização, embora o próprio reator ainda seja síncrono;
- Pode evitar problemas complexos de multi-threading e sincronização na maior extensão e evitar troca de threading/processos de múltiplas threading;
- Possui boa escalabilidade, que pode facilitar o uso total dos recursos da CPU, aumentando o número de instâncias do reator;
- A reutilização é boa e o próprio modelo do reator não tem nada a ver com a lógica específica de processamento de eventos e tem alta reutilização;
Construir um projeto
Instale o cmake
sudo apt-get update
sudo apt-get install cmake
Baixe o projeto
Executar projeto de construção de scripts
cd ./tiny-network && bash build.sh
Casos de execução
Aqui, tomamos um servidor de eco simples como um caso, e a porta de escuta padrão do EchoServer é 8080 .
cd ./example
./EchoServer
Status da implementação:
O módulo http possui um pequeno caso de servidor HTTP que também pode ser executado. Sua audição padrão 8080 :
cd ./src/http && ./HttpServer
Explicação do módulo
Alguns módulos aqui configurarão o código -fonte do Muduo para explicar, e outros usam o código -fonte deste projeto, mas as idéias de implementação são consistentes.
Módulo de canal
Módulo do Poller
Módulo Eventloop
Módulo buffer
Módulo do timer
Módulo HTTP
Módulo de log assíncrono
Módulo de pool de memória
Módulo de pool de conexão de banco de dados
Plano de otimização
- Planeje implementar o registro de data e hora subjacente usando o STD :: Chrono
- Gerenciar a estrutura do timer usando a fila de prioridade
- Cobertura mais testes de unidade
grato
- "Programação do servidor de alto desempenho Linux"
- "Programação de servidores multithreaded Linux: usando a biblioteca de rede Muduo C ++"
- https://github.com/chenshuo/muduo