المكتبة الأساسية عبر الأنظمة الأساسية https://github.com/hujianzhe/util، قم بتنزيلها ووضعها في دليل BootServer
مقدمة:
يطبق الكود فقط تمهيد بدء تشغيل عقدة الخدمة وجدولة المهام ووصف الوحدة الأساسية، ولا يحتوي على أي كود عمل، ويتم تنفيذه بلغة C الخالصة. ويتم تجميعه بشكل عام في مكتبة ديناميكية ويظل مقيدًا للغاية من حيث وظائف الاستخدام. يقوم بتنفيذ بعض تدفقات البروتوكول الشائعة ويدعم C++.20 ملحق coroutine غير المكدس ومعزول عن بعض أكواد مكتبة C الديناميكية الخالصة لمنع C++ من تلويث طبقة الإطار والتأثير على إنشاء المكتبة الديناميكية.
الكود الموجود في util مسؤول عن الأنظمة الأساسية المشتركة، باستثناء أنه لا يتطلب تثبيت أي مكتبات تابعة لجهات خارجية
مقدمة عملية التشغيل:
تستدعي عملية الأعمال المكتبة الديناميكية التي تم تجميعها بواسطة التعليمات البرمجية وتستدعي الواجهة المقابلة للاستخدام. للحصول على تفاصيل حول عملية الاستدعاء، راجع مثال عقدة الاختبار (main_template في دليل BootServer عبارة عن مجموعة من قوالب التعليمات البرمجية لبدء التشغيل المستندة إلى العملية).
تتعامل الخيوط المتعددة مع قراءة وكتابة إدخالات الشبكة (IO) داخل الوحدة النمطية. سيفتح مؤشر ترابط منفصل لقبول الوصول في البداية مؤشر ترابط عامل لمعالجة الرسائل الداخلية ورسائل الشبكة المستلمة وإرسالها إلى منطق رمز عملك. يستخدم خيط العامل كوروتين مكدس لجدولة المعالجة (انظر أدناه لمعرفة سبب عدم استخدام كوروتين مكدس)
تستخدم سلاسل العمليات coroutines المكدسة للجدولة بشكل افتراضي للحفاظ على أعلى مستوى من التوافق. يمكنك أيضًا استخدام coroutines المكدسة بسهولة (واحدة تم تنفيذها في مكتبة الاستخدام) للجدولة
مقدمة الوحدة ورمز العينة:
1. BootServer: جزء من الكود الرئيسي، التهيئة اللازمة وتشغيل عقد الخدمة
2. ServiceTemplate: قالب رمز عقدة الخدمة، يُستخدم لكتابة منطق عملك
3. SoTestClient، SoTestServer: عقد الاختبار وكتب بعض نماذج الأكواد
4. Cpp20-SoTestServer: عقدة اختبار، كتبت بعض نماذج التعليمات البرمجية، ومكّنت coroutine C++ 20 غير المكدس في main.cpp (باستخدام جدولة coroutine C++ 20 غير المكدسة في مكتبة الاستخدام)
تجميع:
تجميع Windows المباشر VS
استخدم make debug/make Release/make asan ضمن نظام التشغيل Linux/Mac OS X
بدء:
قم بتحرير ملف التكوين المطلوب لبدء تشغيل عقدة الخدمة (راجع قالب ملف التكوين المرفق لمعرفة التنسيق المحدد)، ومنح كل عقدة ملف تكوين ومعرفًا فريدًا واسم تعريف السجل وIP ورقم المنفذ.
يتم فتح Windows مباشرة في VS، ويتم تكوين المشروع باستخدام معلمات بدء التشغيل <ملف التكوين>
بعد تجميع Linux/Mac، sh run.sh <عملية الخدمة> <ملف التكوين>
بعض أسباب التصميم والأفكار: س: لماذا لا تستخدم الكوروتينات المكدسة ولكن تستخدم الكوروتينات المكدسة؟ ج: من السهل تنفيذ coroutine غير المكدس في C الخالص (للحصول على تعليمات برمجية مفصلة، يمكنك رؤية برنامج جدولة coroutine المكدس المطبق في C الخالص في مكتبة الاستخدام)، ولكن إعادة تدوير الموارد واستمراريتها (خاصة المتغيرات الموجودة على المكدس تخضع لإعادة coroutine -الدخول).(الوضع الأخير) صعب للغاية إذا كنت تريد استخدام Coroutine المكدس بسلاسة، فلا تزال بحاجة إلى الاعتماد على دعم المترجم، وقد تم تحقيق ذلك في C++ 20. يوجد أيضًا تطبيق جدولة Coroutine الكامل لـ C++ 20 في مكتبة الاستخدام.
س: لماذا يوفر الكوروتين المكدس هذه الوظيفة الموسعة في شكل ملف رأس؟
ج: 1. لأن coroutines المكدسة تتدخل في التعليمات البرمجية وستغير عددًا كبيرًا من نماذج التوقيع الوظيفي
2. يحتوي على كائنات C++، التي لم يتم التعرف عليها في لغة C، ولا يمكن تصدير المكتبة الديناميكية بنجاح.
3. في شكل ملف رأس، فإن تسليم إذن التنشيط لـ coroutines المكدسة إلى طبقة التطبيق هو الطريقة التي أفكر بها حاليًا للتعامل مع جزء مكتبة C الديناميكية الخالصة دون أي تلوث.
س: هل يمكن استبداله بجداول أخرى؟
ج: يمكن استبدال برنامج جدولة مؤشر ترابط العامل باعتباره الناقل قيد التشغيل للمجدول. يمكن أن يتوافق التفاعل بين مؤشر ترابط الشبكة ومؤشر ترابط العامل داخل الإطار مع سلوك الجدولة من خلال ربط الواجهة.
س: هل يمكن استبداله بمكتبات الشبكة الأخرى؟
ج: 1. لا يمكن استبدالها بمكتبات الشبكة الأخرى في الوقت الحالي، ولكن تم أخذ هذه المشكلة في الاعتبار في بداية التصميم، حيث يتم فصل جزء الشبكة وجزء جدولة المهام تمامًا في المستقبل، وسيتم فصل السلوكيات المقابلة المشابهة لسلسلة العمليات سيتم توفير السنانير للاستبدال.
2. على الرغم من وجود العديد من مكتبات شبكات الطرف الثالث، إلا أن تركيزها مختلف. هناك مكتبات TCP وUDP تُستخدم لتطوير التطبيقات، وهناك أيضًا مكتبات ترغب في تضمين الكون بأكمله، وهناك أيضًا مكتبات تنفذ مكدس بروتوكول الشبكة بالكامل في طبقة التطبيق، لذلك في الواقع هذه المنطقة ليست موحدة.
3. إذا دخلت مجموعة من مكتبات الشبكة إلى المعيار في المستقبل، فسوف أقوم باستبدالها.
س: لماذا لا نستخدم لغة C++ فقط كإطار عمل؟
ج: 1. عندما تمت كتابة مجموعة التعليمات البرمجية هذه، لم يكن C++ 20 قد ظهر بعد، وكان حل coroutine الأكثر نضجًا نسبيًا هو coroutine المكدس، ويمكن القيام بذلك باستخدام لغة C عن طريق استدعاء واجهة برمجة تطبيقات النظام الأساسي المقابلة.
2. تم تعزيز الوظائف التي سيتم تنفيذها بواسطة هذا النوع من إطار العمل، وتم تعزيز دورة حياة الموارد من خلال العملية، ويكفي فقط تنفيذها في لغة C النقية (كان هناك إصدار تم تنفيذه في C++ من قبل، و كان الكود أكثر تعقيدًا)
3. إذا تم استدعاء المكتبة الديناميكية بواسطة وحدات أخرى، فإنها لا تزال بحاجة إلى إغلاق الواجهة في لغة C
4. فئات C++ المصدرة معدية، ولم يتم توحيد ABI
س: هل يمكن الاستمرار في تطوير طبقة الأعمال باستخدام لغة C النقية؟
ج: لا يُنصح بذلك بشدة، لأن كتابة العمليات والاستثناءات غير المتزامنة التي يتم طرحها في وحدات مكتوبة بلغات عالية المستوى تجعل توقيت تدمير الموارد غير مؤكد في هذا الوقت، فمن الصعب للغاية التحكم يدويًا في الموارد باستخدام لغة C النقية يجب عليك استخدام لغة ذات مستوى أعلى للتعامل مع هذه الأشياء، على سبيل المثال، يمكنك استخدام لغة C++ لتطوير كود أعمال عالي المستوى، ويمكن لآلية RAII الخاصة بها ضمان تحرير الموارد المقابلة.
س: إذا كنت أرغب في تحويل "رد الاتصال" للمشروع القديم إلى "كوروتين"، فهل يمكنني فقط استبدال جزء المجدول بنقطة الاتصال المقابلة في رمز العمل؟
ج: الأمر ليس بهذه البساطة. الأول هو مشكلة عبء العمل، بالإضافة إلى ذلك، سواء كان ذلك في نموذج رد اتصال أو نموذج كوروتين، فإن الجوهر هو إصدار طلب وانتظار النتيجة خلال هذه الفترة هي مشكلة يجب حلها ويجب دراستها بعناية. إذا كان مؤشرًا خامًا، فيمكن القول تقريبًا أنه لا يمكن تحويله إذا تم استخدامه في المشروع تعمل وسائل مثل std::shared_ptr على إطالة دورة حياة المتغيرات، لذلك سيكون تحويلها إلى إصدار "مكدس كوروتين" أقل صعوبة. إذا كنت تريد التحويل إلى كوروتين C++ 20، فإن عبء العمل ضخم يعد بمثابة إعادة كتابة المشروع (لأن coroutines المكدسة لديها اختراق قوي للكود) ، لذلك يوصى بعدم تحويل المشاريع القديمة.
س: لماذا لا يُسمح حاليًا بترحيل coroutine إلى سلاسل رسائل مختلفة للتنفيذ؟
ج: يمكن إجراء ترحيل coroutines بسهولة، ولكن السبب وراء عدم توفيره هو
1. المهام التي يتم تنفيذها بين coroutines غير مؤكدة، مما قد يتسبب في خلط io والحساب في نفس سلسلة الجدولة.
2. بعد الترحيل، قد يتم تشغيل نفس عملية coroutine على سلاسل رسائل مختلفة. في هذه الحالة، يجب عليك التأكد من أن التعليمات البرمجية الخاصة بك لا تعتمد على أي متغيرات محلية لسلسلة الرسائل، ولكن لا يمكنك التأكد من أن مكتبة الطرف الثالث لا تستخدم المتغيرات المحلية لسلسلة الرسائل. .
س: هل سيتعطل برنامج asan عند التجميع والتشغيل؟
ج: 1. إذا كنت تستخدم coroutine المكدس الافتراضي لإطار العمل، فمن المؤكد أنها ليست مشكلة في التعليمات البرمجية، يمكنك ضبط حجم مكدس coroutine المكدس في ملف تكوين العقدة (عند تمكين ASAN، سيتم استهلاك مساحة مكدس كبيرة نسبيًا. لذلك هناك احتمال انفجار المكدس)
2. لا تدعم ASAN بشكل كامل واجهة برمجة تطبيقات coroutine المكدسة (ucontext) في بيئة Unix، على الرغم من أن واجهة برمجة تطبيقات ucontext coroutine قد تم تكييفها مع ASAN في كود الاستخدام، إلا أنها لا تزال غير قادرة على ضمان عدم وجود مشاكل في التشغيل في ASAN بنسبة 100٪. البيئة (حتى الآن جيدة جدا)
3. في بعض توزيعات Linux الأحدث، إذا قامت ASAN بإخراج AddressSanitizer: DEADLYSIGNAL بشكل لا نهائي، فاضبط Sudo sysctl vm.mmap_rnd_bits=28 لحل المشكلة.
المهام:
1. ليس لدي الوقت لكتابة وثائق مفصلة.
2. تقديم الدعم لكتابة منطق الأعمال بلغة البرمجة النصية