مكتبة شبكة Tiny C ++
| الجزء ⅰ | الجزء ⅱ | الجزء ⅲ | الجزء ⅳ | الجزء الخامس | الجزء ⅵ | الجزء ⅶ |
|---|
| مقدمة المشروع | ميزات المشروع | بيئة التنمية | نموذج التزامن | بناء مشروع | الحالات الجري | تفسير الوحدة النمطية |
مقدمة المشروع
هذا المشروع عبارة عن مكتبة شبكة متعددة الخيوط تعتمد على نموذج المفاعل الذي تنفذه Muduo. باستخدام C ++ 11 للكتابة لإزالة اعتماد Muduo على Boost ، يتم تنفيذ خادم HTTP صغير داخليًا ، والذي يمكن أن يدعم طلبات الحصول على الموارد الثابتة ، ويرافقها سجلات غير متزامنة لمراقبة حالة الخادم.
قام المشروع بتطبيق وحدة القناة ، ووحدة Poller ، ووحدة حلقة الأحداث ، ووحدة HTTP ، ووحدة الموقت ، ووحدة السجل غير المتزامن ، ووحدة تجمع الذاكرة ، ووحدة تجمعات توصيل قاعدة البيانات.
ميزات المشروع
- تستخدم الطبقة الأساسية نموذج الإرسال I/O من وضع EPOLL + LT وتنفذ نموذج مفاعل Master-Slave مع الإدخال/الإخراج غير المحظور.
- اعتماد نموذج مؤشر ترابط "حلقة واحدة لكل مؤشر ترابط" وقم بتغليف تجمع مؤشرات الترابط لأعلى لتجنب النفقات العامة للأداء الناجم عن إنشاء مؤشر الترابط وتدميره.
- يتم استخدام EventFD كواصف لإخطار الحدث لتسهيل الإرسال الفعال للأحداث إلى مؤشرات الترابط الأخرى لأداء المهام غير المتزامنة.
- يتم تنفيذ السجلات غير المتزامنة استنادًا إلى المخازن المؤقتة المزدوجة ذاتية التنظيم ، وخيط الواجهة الخلفية مسؤول عن كتابة معلومات السجل الأمامي إلى القرص بانتظام لتجنب حظر خدمات الشبكة عندما تنخفض البيانات عن القرص.
- يتم تنفيذ هيكل إدارة المؤقت بناءً على الشجرة الحمراء والأسود ، ويتم استخدام TITERFD من Linux داخليًا لإخطار مهام انتهاء الصلاحية ، ويتم إدارة المهام الموقوتة بكفاءة.
- اتبع تقنيات RAII لإدارة الذاكرة باستخدام مؤشرات ذكية لتقليل خطر تسرب الذاكرة.
- استخدم آلات الحالة المحدودة لتحليل حزم طلب HTTP.
- بالإشارة إلى NGINX ، يتم تنفيذ وحدة تجمع الذاكرة لإدارة مساحة الذاكرة الصغيرة بشكل أفضل وتقليل تفتيت الذاكرة.
- يمكن لمجموعة اتصال قاعدة البيانات إدارة ديناميكي عدد الاتصالات وإنشاء أو تدمير الاتصالات في الوقت المناسب ، وضمان أداء تجمع الاتصال.
بيئة التنمية
- نظام التشغيل:
Ubuntu 18.04.6 LTS - المترجم:
g++ 7.5.0 - محرر:
vscode - التحكم في الإصدار:
git - بناء المشروع:
cmake 3.10.2
نموذج التزامن
يتبنى المشروع نموذج مفاعل الرقيق.
بعد استدعاء وظيفة START لـ TCPServer ، سيتم إنشاء تجمع مؤشرات الترابط داخليًا. يدير كل مؤشر ترابط حلقة حدث بشكل مستقل ، وهي Subreactor. استطلاعات MainReactor. التفاعل الفرعي من تجمع الخيوط ويقوم بإرساله إلى اتصال جديد. هناك العديد من المزايا لاستخدام نموذج مفاعل Master-Slave:
- الاستجابة السريعة ولا يجب حظرها بواسطة حدث تزامن واحد ، على الرغم من أن المفاعل نفسه لا يزال متزامنًا ؛
- يمكن أن تتجنب مشاكل المعقدة متعددة الخيوط والمزامنة إلى أقصى حد ، وتجنب تبديل متعدد الخيوط/العملية ؛
- لديها قابلية التوسع الجيدة ، والتي يمكن أن تسهل الاستخدام الكامل لموارد وحدة المعالجة المركزية عن طريق زيادة عدد مثيلات المفاعل ؛
- قابلية إعادة الاستخدام جيدة ، ونموذج المفاعل نفسه لا علاقة له بمنطق معالجة الأحداث المحدد ولديه إعادة استخدام عالية ؛
بناء مشروع
تثبيت Cmake
sudo apt-get update
sudo apt-get install cmake
قم بتنزيل المشروع
تنفيذ مشروع بناء البرنامج النصي
cd ./tiny-network && bash build.sh
الحالات الجري
هنا نأخذ خادم صدى بسيط كحالة ، ومنفذ الاستماع الافتراضي لـ EchoServer هو 8080 .
cd ./example
./EchoServer
حالة التنفيذ:
تحتوي وحدة http على علبة خادم HTTP صغيرة يمكن تنفيذها أيضًا. الاستماع الافتراضي 8080 :
cd ./src/http && ./HttpServer
تفسير الوحدة النمطية
ستقوم بعض الوحدات هنا بتكوين رمز مصدر Muduo لشرحه ، ويستخدم البعض الكود المصدري لهذا المشروع ، لكن أفكار التنفيذ متسقة.
وحدة القناة
وحدة Poller
وحدة EventLoop
وحدة المخزن المؤقت
وحدة مؤقت
وحدة HTTP
وحدة سجل غير متزامنة
وحدة تجمع الذاكرة
وحدة تجمع اتصال قاعدة البيانات
خطة التحسين
- خطط لتنفيذ الطابع الزمني الأساسي باستخدام STD :: Chrono
- إدارة بنية المؤقت باستخدام قائمة انتظار الأولوية
- تغطية المزيد من اختبارات الوحدة
شاكر
- "برمجة خادم Linux عالية الأداء"
- "برمجة خادم Linux Multithedbered: باستخدام مكتبة شبكة Muduo C ++"
- https://github.com/chenshuo/muduo