Perpustakaan Jaringan Tiny C ++
| Bagian ⅰ | Bagian ⅱ | Bagian ⅲ | Bagian ⅳ | Bagian V. | Bagian ⅵ | Bagian ⅶ |
|---|
| Pendahuluan Proyek | Fitur Proyek | Lingkungan pengembangan | Model konkurensi | Membangun proyek | Kasus Menjalankan | Penjelasan Modul |
Pendahuluan Proyek
Proyek ini adalah perpustakaan jaringan multi-utas berdasarkan model reaktor yang diimplementasikan oleh MUDUO. Menggunakan C ++ 11 untuk menulis untuk menghilangkan ketergantungan Muduo pada Boost, server HTTP kecil diimplementasikan secara internal, yang dapat mendukung permintaan mendapatkan dan akses ke sumber daya statis, dan disertai dengan log asinkron untuk memantau situasi server.
Proyek ini telah mengimplementasikan modul saluran, modul poler, modul loop peristiwa, modul http, modul timer, modul log asinkron, modul kumpulan memori, dan modul kumpulan koneksi basis data.
Fitur Proyek
- Lapisan yang mendasarinya menggunakan model multiplexing I/O dari mode EPOLL + LT dan mengimplementasikan model reaktor master-slave dalam kombinasi dengan I/O yang tidak blocking.
- Mengadopsi model utas "satu loop per utas" dan merangkum kumpulan utas ke atas untuk menghindari overhead kinerja yang disebabkan oleh pembuatan dan penghancuran utas.
- EventFD digunakan sebagai deskriptor pemberitahuan acara untuk memfasilitasi pengiriman acara yang efisien ke utas lain untuk melakukan tugas -tugas asinkron.
- Log asinkron diimplementasikan berdasarkan buffer ganda yang diimplementasikan sendiri, dan utas backend bertanggung jawab untuk menulis informasi log front-end ke disk secara teratur untuk menghindari pemblokiran layanan jaringan ketika data jatuh dari disk.
- Struktur manajemen timer diimplementasikan berdasarkan pohon merah dan hitam, dan timerfd Linux digunakan secara internal untuk memberi tahu tugas kedaluwarsa, dan tugas -tugas waktunya dikelola secara efisien.
- Ikuti teknik RAII untuk mengelola memori menggunakan pointer pintar untuk mengurangi risiko kebocoran memori.
- Gunakan mesin negara yang terbatas untuk menguraikan paket permintaan HTTP.
- Mengacu pada Nginx, modul kumpulan memori diimplementasikan untuk mengelola ruang memori kecil dengan lebih baik dan mengurangi fragmentasi memori.
- Kumpulan koneksi basis data dapat secara dinamis mengelola jumlah koneksi, menghasilkan atau menghancurkan koneksi tepat waktu, dan memastikan kinerja kumpulan koneksi.
Lingkungan pengembangan
- Sistem Operasi:
Ubuntu 18.04.6 LTS - Kompiler:
g++ 7.5.0 - Editor:
vscode - Kontrol Versi:
git - Konstruksi Proyek:
cmake 3.10.2
Model konkurensi
Proyek ini mengadopsi model reaktor master-slave.
Setelah memanggil fungsi start tcpserver, kumpulan utas akan dibuat secara internal. Setiap utas menjalankan loop acara secara independen, yaitu subreaktor. MainReactor Polls Subreaktor dari kumpulan utas dan mengirimkannya ke koneksi baru. Ada banyak keuntungan untuk menggunakan model reaktor master-slave:
- Respons cepat dan tidak harus diblokir oleh peristiwa sinkronisasi tunggal, meskipun reaktor itu sendiri masih sinkron;
- Ini dapat menghindari masalah multi-threading dan sinkronisasi yang kompleks sampai tingkat terbesar, dan menghindari switching multi-threading/proses;
- Ini memiliki skalabilitas yang baik, yang dapat memfasilitasi penggunaan penuh sumber daya CPU dengan meningkatkan jumlah instance reaktor;
- Penggantian ulang itu baik, dan model reaktor itu sendiri tidak ada hubungannya dengan logika pemrosesan peristiwa spesifik dan memiliki reusability yang tinggi;
Membangun proyek
Instal CMake
sudo apt-get update
sudo apt-get install cmake
Unduh proyek
Jalankan Proyek Pembuatan Skrip
cd ./tiny-network && bash build.sh
Kasus Menjalankan
Di sini kami mengambil server Echo sederhana sebagai kasus, dan port mendengarkan default EchoServer adalah 8080 .
cd ./example
./EchoServer
Status Implementasi:
Modul http memiliki casing server HTTP kecil yang juga dapat dieksekusi. Defaultnya Mendengarkan 8080 :
cd ./src/http && ./HttpServer
Penjelasan Modul
Beberapa modul di sini akan mengkonfigurasi kode sumber MUDUO untuk dijelaskan, dan beberapa menggunakan kode sumber dari proyek ini, tetapi ide implementasinya konsisten.
Modul saluran
Modul Poller
Modul EventLoop
Modul buffer
Modul Timer
Modul http
Modul log asinkron
Modul kumpulan memori
Modul Pool Koneksi Database
Rencana Optimalisasi
- Berencana untuk mengimplementasikan stempel waktu yang mendasarinya menggunakan STD :: Chrono
- Kelola struktur pengatur waktu menggunakan antrian prioritas
- Cakupan lebih banyak tes unit
bersyukur
- "Pemrograman Server Kinerja Tinggi Linux"
- "Pemrograman Server Multithreaded Linux: Menggunakan Perpustakaan Jaringan Muduo C ++"
- https://github.com/chenshuo/muduo