Tiny C ++ - Netzwerkbibliothek
| Teil ⅰ | Teil ⅱ | Teil ⅲ | Teil ⅳ | Teil v | Teil ⅵ | Teil ⅶ |
|---|
| Projekteinführung | Projektfunktionen | Entwicklungsumfeld | Parallelitätsmodell | Ein Projekt erstellen | Lauffälle | Modul Erklärung |
Projekteinführung
Dieses Projekt ist eine Multi-Thread-Netzwerkbibliothek, die auf dem von Muduo implementierten Reaktormodell basiert. Mit C ++ 11 zum Schreiben, um die Abhängigkeit von Muduo von Boost zu entfernen, wird ein kleiner HTTP -Server intern implementiert, was GET -Anforderungen und Zugriff auf statische Ressourcen unterstützen kann und von asynchronen Protokollen zur Überwachung der Serversituation begleitet wird.
Das Projekt hat das Kanalmodul, das Pollermodul, das Ereignisschleifmodul, das HTTP -Modul, das Timer -Modul, das asynchrone Protokollmodul, das Speicherpoolmodul und das Datenbankverbindungspoolmodul implementiert.
Projektfunktionen
- Die zugrunde liegende Schicht verwendet das E/O-Multiplexing-Modell des EPOLL + LT-Modus und implementiert das Master-Slave-Reaktormodell in Kombination mit nicht blockierter I/A.
- Übernehmen Sie das Thread -Modell "One Loop pro Thread" und verkapulieren Sie den Fadenpool nach oben, um den durch die Erstellung und Zerstörung von Fäden verursachten Leistungsaufwand zu vermeiden.
- EventFD wird als Ereignisbenachrichtigungsdeskriptor verwendet, um den effizienten Versand von Ereignissen in andere Threads zu erleichtern, um asynchrone Aufgaben auszuführen.
- Asynchrone Protokolle werden basierend auf selbst implementierten Doppelpuffern implementiert, und der Backend-Thread ist dafür verantwortlich, dass sie regelmäßig Front-End-Protokollinformationen auf die Festplatte schreiben, um zu vermeiden, dass die Netzwerkdienste bei der Datenspanne blockieren.
- Die Timer -Verwaltungsstruktur wird basierend auf dem roten und schwarzen Baum implementiert, und die Timerfd von Linux wird intern verwendet, um Ablaufaufgaben zu benachrichtigen, und zeitgesteuerte Aufgaben werden effizient verwaltet.
- Befolgen Sie die Raii -Techniken, um den Speicher mithilfe von Smart -Zeigern zu verwalten, um das Risiko eines Speicherlecks zu verringern.
- Verwenden Sie Finite -State -Maschinen, um HTTP -Anforderungspakete zu analysieren.
- In Bezug auf Nginx wird das Speicherpool -Modul implementiert, um den kleinen Speicherplatz besser zu verwalten und die Speicherfragmentierung zu reduzieren.
- Der Datenbankverbindungspool kann die Anzahl der Verbindungen dynamisch verwalten, Verbindungen rechtzeitig erzeugen oder zerstören und die Leistung des Verbindungspools sicherstellen.
Entwicklungsumfeld
- Betriebssystem:
Ubuntu 18.04.6 LTS - Compiler:
g++ 7.5.0 - Editor:
vscode - Versionskontrolle:
git - Projektkonstruktion:
cmake 3.10.2
Parallelitätsmodell
Das Projekt übernimmt das Master-Slave-Reaktormodell.
Nach dem Aufrufen der Startfunktion von TCpServer wird ein Thread -Pool intern erstellt. Jeder Thread führt unabhängig voneinander eine Ereignisschleife aus, nämlich Subreaktor. MainReactor befreit den Subreaktor aus dem Thread -Pool und sendet ihn in eine neue Verbindung. Die Verwendung des Master-Slave-Reaktormodells hat viele Vorteile:
- Schnelle Reaktion und muss nicht durch ein einzelnes Synchronisationsereignis blockiert werden, obwohl Reaktor selbst immer noch synchron ist;
- Es kann komplexe Multi-Threading- und Synchronisationsprobleme im größten Teil vermeiden und Multi-Threading/-prozess-Umschaltungen vermeiden.
- Es hat eine gute Skalierbarkeit, die den vollständigen Einsatz von CPU -Ressourcen erleichtern kann, indem die Anzahl der Reaktorinstanzen erhöht werden.
- Die Wiederverwendbarkeit ist gut und das Reaktormodell selbst hat nichts mit der spezifischen Ereignisverarbeitungslogik zu tun und hat eine hohe Wiederverwendbarkeit.
Ein Projekt erstellen
CMake installieren
sudo apt-get update
sudo apt-get install cmake
Laden Sie das Projekt herunter
Skript -Build -Projekt ausführen
cd ./tiny-network && bash build.sh
Lauffälle
Hier nehmen wir einen einfachen Echo -Server als Fall, und der Standardhörport von EchoServer beträgt 8080 .
cd ./example
./EchoServer
Implementierungsstatus:
Das http -Modul verfügt über einen kleinen HTTP -Serverfall, der ebenfalls ausgeführt werden kann. Sein Standardhörer 8080 :
cd ./src/http && ./HttpServer
Modul Erklärung
Einige Module hier konfigurieren den MUDUO -Quellcode, um zu erklären, und einige verwenden den Quellcode dieses Projekts, aber die Implementierungsideen sind konsistent.
Kanalmodul
Poller -Modul
EventLoop -Modul
Puffermodul
Timermodul
HTTP -Modul
Asynchrones Protokollmodul
Speicherpool -Modul
Datenbankverbindungspoolmodul
Optimierungsplan
- Planen Sie, den zugrunde liegenden Zeitstempel mit STD :: Chrono zu implementieren
- Verwalten Sie die Timer -Struktur mithilfe der Prioritätswarteschlange
- Abdeckung Weitere Unit -Tests
dankbar
- "Linux High Performance Server -Programmierung"
- "Linux Multithread -Serverprogrammierung: Verwenden von Muduo C ++ - Netzwerkbibliothek"
- https://github.com/chenshuo/muduo