netpoll
netpoll في Go هو آلية الإدخال/الإخراج متعددة المسارات الأساسية التي تنفذها بيئة تشغيل Go، وهي تمكّن Go من تحقيق خدمات شبكية عالية الأداء باستخدام نموذج برمجة متزامن بسيط (كوروتين واحد لكل اتصال). جوهرها هو الدمج العميق بين استدعاءات نظام الإدخال/الإخراج متعددة المسارات (مثل epoll في Linux) وجدولة الكوروتينات في Go.
مقارنة بين Netpoll و GoNet الأصلي
- عدد الكوروتينات Go Net: كوروتين واحد تحت كل اتصال.
NetPoll: اتصالات متعددة تحت كوروتين واحد.
- ضغط تبديل سياق الكوروتين Go Net: ضغط تبديل عالٍ عند التزامن العالي. لأن GoNet له كوروتين واحد لكل اتصال، وعندما يكون عدد الكوروتينات كبيرًا يكون التبديل متكررًا.
NetPoll: ضغط تبديل منخفض عند التزامن العالي. لأن NetPoll يتشارك عدة اتصالات في كوروتين واحد، وعدد التبديلات قليل.
- استهلاك الذاكرة: Go Net: استهلاك الذاكرة مرتبط إيجابًا بعدد الاتصالات، وعند التزامن العالي قد يسبب انفجار عدد الكوروتينات ضغطًا على الذاكرة.
NetPoll: تخصيص مسبق لل buffers، وإنشاء تجمع buffers.
- طريقة التفعيل Go Net: يستخدم التفعيل الحافي ET. قراءة البيانات دفعة واحدة، تنفيذ بسيط.
NetPoll: يستخدم التفعيل الأفقي LT. لا يحتاج تخصيص ذاكرة كبيرة مسبقًا ك buffer للبيانات.
- دعم تجمع buffer المشترك بين النواة وطبقة المستخدم، توفير نسخة بيانات واحدة. Go Net: غير مدعوم.
NetPoll: مدعوم. يدير تجمع Buffer ويُسلِّمه للمستخدم مباشرة، توفير نسخة واحدة.
- سيناريوهات الاستخدام Go Net: سيناريوهات بسيطة ذات تزامن منخفض
NetPoll: سيناريوهات عالية التزامن منخفضة الكمون
أفكار تصميم netpoll
البنية الأساسية مكتبة الشبكة الأصلية مطورة بناءً على وضع epoll lt، والبنية الأساسية كما في الصورة:

استخدام الكوروتين يوجد تجمع كائنات poll، كل كائن poll يحتوي على epoll ويقابله كوروتين منفصل. عدد الكوروتينات يساوي عدد كائنات poll، وكل كائن poll يمكنه مراقبة عدة واصفات ملفات fd.
منطق القراءة والكتابة I/O
- كل كائن poll يبدأ كوروتينًا لاستطلاع أحداث القراءة والكتابة على epoll الحالي باستمرار
- كل epoll يرتبط بعدة fd، وكل fd يرتبط بـ Buffer.
- عند سماع حدث قابل للقراءة من fd، تُقرأ البيانات إلى Buffer.
- استطلاع ومعالجة بيانات Buffer باستمرار، وعند اكتمال قراءة البيانات، يُبلِغ تجمع الكوروتينات GoPoll لتنفيذ منطق المعالجة اللاحق
- التفاعل مع استدعاءات نظام النواة يتحكم فيه netpoll بالكامل، وقراءة وكتابة Conn في طبقة المستخدم هي فقط操作 الـ Buffer المشترك.
المزايا والعيوب المزايا: قدرة دعم التزامن العالي أقوى.
- (1) استطلاع ومعالجة بيانات Buffer، لا توجد حالة عدم معالجة البيانات.
- (2) كوروتين واحد يقابل عدة اتصالات، حتى لو كانت الاتصالات كثيرة جدًا، فإن تكلفة تبديل وجدولة الموارد ليست كبيرة.
- (3) دعم الـ buffer المشترك بين المستخدم والنواة، تقليل عملية نسخ بيانات واحدة، رفع الكفاءة.
العيوب: يحتاج احتلال ذاكرة أكثر.
