كيف يمكنك تقليل عدد المواضيع المستخدمة في تطبيق خادم TCP؟

StackOverflow https://stackoverflow.com/questions/32198

سؤال

أنا أبحث عن أي إستراتيجيات يستخدمها الأشخاص عند تنفيذ تطبيقات الخادم التي تخدم طلبات عميل TCP (أو UDP):أنماط التصميم، وتقنيات التنفيذ، وأفضل الممارسات، وما إلى ذلك.

لنفترض لأغراض هذا السؤال أن الطلبات طويلة الأمد نسبيًا (عدة دقائق) وأن حركة المرور حساسة للوقت، لذلك لا يكون هناك أي تأخير مقبول في الرد على الرسائل.كما نقوم أيضًا بخدمة الطلبات المقدمة من العملاء وإجراء اتصالاتنا الخاصة مع الخوادم الأخرى.

النظام الأساسي الخاص بي هو .NET، ولكن نظرًا لأن التقنية الأساسية هي نفسها بغض النظر عن النظام الأساسي، فأنا مهتم برؤية الإجابات لأي لغة.

هل كانت مفيدة؟

المحلول

يتمثل النهج الحديث في الاستفادة من نظام التشغيل لتعدد إرسال العديد من مآخذ الشبكة لك، مما يحرر تطبيقك لمعالجة الاتصالات النشطة مع حركة المرور فقط.

كلما قمت بفتح مأخذ توصيل يتم ربطه مع محدد.يمكنك استخدام مؤشر ترابط واحد لاستقصاء هذا المحدد.عندما تصل البيانات، سيشير المحدد إلى المقبس النشط، وتقوم بتسليم هذه العملية إلى مؤشر ترابط فرعي وتستمر في الاستقصاء.

بهذه الطريقة تحتاج فقط إلى مؤشر ترابط لكل عملية متزامنة.المقابس المفتوحة ولكنها خاملة لن تربط الخيط.

نصائح أخرى

سيكون النهج الأكثر تعقيدًا هو استخدام منافذ إكمال الإدخال والإخراج.(Windows) مع منافذ إكمال IO تتركها لنظام التشغيل لإدارة الاقتراع ، مما يتيح لها استخدام مستوى عالٍ للغاية من التحسين مع دعم برنامج التشغيل NIC.في الأساس، لديك قائمة انتظار لعمليات الشبكة التي يديرها نظام التشغيل، وتوفر وظيفة رد اتصال يتم استدعاؤها عند اكتمال العملية.يشبه إلى حد ما DMA (القرص الصلب) ولكن للشبكة.

كتب Len Holgate سلسلة رائعة حول منافذ إكمال الإدخال والإخراج منذ بضع سنوات على Codeproject:http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

ووجدت مقالًا عن منافذ إكمال IO لـ .NET (لم تقرأها رغم ذلك)http://www.codeproject.com/KB/cs/managediocp.aspx

أود أيضًا أن أقول إنه من السهل استخدام منافذ الإكمال مقارنةً بمحاولة كتابة بديل قابل للتطوير.المشكلة هي أنها متوفرة فقط على NT (2000، XP، Vista)

إذا كنت تستخدم C++ وWin32 مباشرةً، فأنا أقترح عليك أن تقرأ عن منافذ الإدخال/الإخراج وإكمال الإدخال/الإخراج المتداخلة.لدي إطار عمل عميل/خادم مجاني لـ C++، وIOCP، مع كود مصدر كامل، انظر هنا لمزيد من التفاصيل.

نظرًا لأنك تستخدم ‎.Net، فيجب أن تفكر في استخدام طرق المقبس غير المتزامنة بحيث لا تحتاج إلى وجود مؤشر ترابط لكل اتصال؛هناك عدة روابط من منشور مدونتي هذا والتي قد تكون نقاط بداية مفيدة: http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html (بعض أفضل الروابط موجودة في التعليقات على المنشور الأصلي!)

يوم سعيد،

سأبدأ بالنظر إلى الاستعارة التي تريد استخدامها لإطار عمل مؤشر الترابط الخاص بك.

ربما يكون "المتابع الرئيسي" حيث يستمع الخيط للطلبات الواردة وعندما يأتي طلب جديد يقوم بالعمل ويبدأ الخيط التالي في التجمع في الاستماع للطلبات الواردة.

أو تجمع سلاسل الرسائل حيث يستمع نفس مؤشر الترابط دائمًا للطلبات الواردة ثم يمرر الطلبات إلى مؤشر الترابط التالي المتاح في تجمع سلاسل الرسائل.

قد ترغب في زيارة مفاعل قسم Ace Components للحصول على بعض الأفكار.

هث.

هتافات ، روب

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top