Крошечная сетевая библиотека C ++
| Часть ⅰ | Часть ⅱ | Часть ⅲ | Часть ⅳ | Часть V. | Часть ⅵ | Часть ⅶ |
|---|
| Введение проекта | Функции проекта | Среда развития | Модель параллелизма | Построить проект | Бегущие дела | Объяснение модуля |
Введение проекта
Этот проект представляет собой многопоточную сетевую библиотеку, основанную на модели реактора, реализованной Muduo. Используя C ++ 11 для записи для удаления зависимости Мудюо от повышения, небольшой HTTP -сервер реализуется внутри, который может поддерживать запросы GET и доступ к статическим ресурсам, и сопровождается асинхронными журналами для мониторинга ситуации с сервером.
Проект реализовал модуль канала, модуль Poller, модуль цикла событий, модуль HTTP, модуль таймера, асинхронный журнал модуль, модуль пула памяти и модуль базы данных базы данных.
Функции проекта
- В основном слое используется модель мультиплексирования ввода/вывода режима Epoll + LT и реализует модель реактора главного солевого в сочетании с неблокирующим ввод-выводом.
- Принять модель потока «One Lop на поток» и инкапсулировать пул резьбы вверх, чтобы избежать накладных расходов на производительность, вызванные созданием и разрушением потока.
- EventFD используется в качестве дескриптора уведомления о событии для облегчения эффективной отправки событий в другие потоки для выполнения асинхронных задач.
- Асинхронные журналы реализованы на основе самовместимых двойных буферов, а бэкэндский поток отвечает за регулярное написание информации журнала на фронтальном диске, чтобы избежать блокирования сетевых сервисов, когда данные падают с диска.
- Структура управления таймером реализована на основе красного и черного дерева, а TimerFD Linux используется внутри, для уведомления задач срока годности, а задачи временного времени выполняются эффективно.
- Следуйте методам RAII, чтобы управлять памятью, используя умные указатели, чтобы снизить риск утечки памяти.
- Используйте конечные государственные машины, чтобы разобрать пакеты HTTP -запроса.
- Ссылаясь на Nginx, модуль пула памяти реализован для лучшего управления небольшим пространством памяти и уменьшения фрагментации памяти.
- Пул соединений базы данных может динамически управлять количеством соединений, своевременно генерировать или уничтожать соединения и обеспечить производительность пула соединений.
Среда развития
- Операционная система:
Ubuntu 18.04.6 LTS - Компилятор:
g++ 7.5.0 - Редактор:
vscode - Управление версией:
git - Строительство проекта:
cmake 3.10.2
Модель параллелизма
Проект принимает модель Master-Slave.
После вызова начальной функции TCPSERVER, пул потоков будет создан внутри. Каждый поток запускает цикл событий независимо, а именно подсоритель. MainReactor опрошены подзонт из пула потоков и отправляет его на новое соединение. Есть много преимуществ для использования модели реактора с мастером-рабов:
- Быстрый ответ и не должен быть заблокирован одним событием синхронизации, хотя сам реактор все еще синхронно;
- Он может в наибольшей степени избегать сложных проблем с многопоточниками и синхронизацией и избегать многопоточного переключения процесса;
- Он имеет хорошую масштабируемость, которая может облегчить полное использование ресурсов ЦП за счет увеличения количества экземпляров реактора;
- Способность повторного использования хороша, и сама модель реактора не имеет ничего общего с конкретной логикой обработки событий и обладает высокой повторной способностью;
Построить проект
Установите Cmake
sudo apt-get update
sudo apt-get install cmake
Загрузите проект
Выполнить проект сборки скрипта
cd ./tiny-network && bash build.sh
Бегущие дела
Здесь мы принимаем простой сервер Echo в качестве случая, а порт прослушивания EchoServer по умолчанию - 8080 .
cd ./example
./EchoServer
Статус реализации:
Модуль http имеет небольшой корпус HTTP -сервера, который также может быть выполнен. Его по умолчанию прослушивание 8080 :
cd ./src/http && ./HttpServer
Объяснение модуля
Некоторые модули здесь будут настраивать исходный код Muduo для объяснения, а некоторые используют исходный код этого проекта, но идеи реализации согласованы.
Канал модуль
Полетный модуль
Модуль EventLoop
Буферный модуль
Модуль таймера
Http module
Асинхронный журнал модуль
Модуль пула памяти
Модуль пула подключения к базе данных
План оптимизации
- Планируйте реализацию базовой метки времени, используя std :: chrono
- Управление структурой таймера с использованием приоритетной очереди
- Покрытие больше модульных тестов
благодарный
- "Программирование сервера Linux High Performance"
- "Программирование сервера Linux MultiThreaded: с помощью сетевой библиотеки Muduo C ++"
- https://github.com/chenshuo/muduo