منع تجويع الخيط – أفضل الممارسات


أنا أبحث عن مزيد من المعلومات حول كيفية منع تجويع/حظر/سباق سلاسل الرسائل في تطبيق أو خدمة يمكنها تشغيل ما يصل إلى 200 مؤشر ترابط في وقت واحد عبر معالجات/مراكز متعددة.

توضح معظم الأمثلة التي وجدتها عبر الإنترنت كيفية التنسيق بين 3 أو 4 سلاسل كحد أقصى وأخطط لتطبيق يحتوي على المئات.

لقد قمت بإنشاء تطبيقات قامت بتشغيل ما يصل إلى 30 سلسلة رسائل، ولكن عندما تجاوزت ذلك أشعر بالقلق من عدم حصول بعض المواضيع على أي وقت لوحدة المعالجة المركزية ناهيك عن المزامنة.

أين يمكنني العثور على بعض المقالات والمدونات الجيدة حقًا؟
ما هي أفضل الكتب في هذا الموضوع؟
هناك الكثير من الكتب والمقالات حول هذا الموضوع، وأنا أبحث عن أكثر المعلومات إفادة وتعليمية ولكن لا يتم تقديمها بلغة هندسية تفوق فهمي.

هي موضع تقدير جميع الاقتراحات.

الحل 1

هناك الكثير من السيناريوهات التي يجب تغطيتها لذا من المستحيل الإجابة على سؤالك.

لكن استخدام مؤشرات ترابط أكثر نشاطًا من عدد النوى عادةً ما يؤدي إلى نتائج عكسية. يمكنك الاستفادة من استخدام سلاسل عمليات أكثر من عدد النوى فقط إذا كانت معظم سلاسل العمليات ترغب عادةً في وضع السكون، على سبيل المثال من خلال انتظار بعض عمليات الإدخال/الإخراج مثل استدعاء recv() الذي يتلقى البيانات من الشبكة. حتى في هذه الحالة، فأنت تريد التحكم بشكل فعال في عدد سلاسل العمليات التي يتم تنفيذها بالتوازي، لذا فإن بدء 200 سلسلة سلاسل على أمل أن *يرغب* 4 منها فقط في العمل بالتوازي إذا كان لديك 4 مراكز ليس ممارسة جيدة.

إذا كان عليك تشغيل 200 مهمة متوازية نشطة طوال الوقت، فمن الأفضل أن تقوم بإنشاء نفس عدد سلاسل العمليات فقط مثل عدد النوى وتقسيم المهام إلى مهام صغيرة. يمكنك تنفيذ هذه المهام الصغيرة على سلاسل العمليات الخاصة بك بأي ترتيب تريده عن طريق وضعها في قائمة انتظار المهام التي تقوم سلاسل العمليات الخاصة بك بسحبها منها واحدًا تلو الآخر. هذا بالفعل قريب من امتلاك برنامج جدولة خاص بك. إحدى التقنيات التي غالبًا ما تؤدي إلى حل أكثر تعقيدًا من سابقتها هي استخدام الخيوط الخضراء/الكوروتينات (واجهة برمجة تطبيقات ucontext POSIX المهملة في بعض توزيعات Linux وواجهة برمجة تطبيقات الألياف على النوافذ).

باستخدام الخيوط الخضراء، يمكنك تقسيم سلسلة رسائل إلى العديد من الخيوط الخضراء وتقوم بمهام التبديل/التعاون بين هذه الخيوط الخضراء بشكل صريح في مساحة المستخدم. لنفترض أن لديك 4 النوى. ثم يمكنك بدء 4 سلاسل رسائل، وإذا قمت بتقسيم كل سلسلة إلى 100 سلسلة رسائل خضراء، فسيكون لديك 400 سلسلة رسائل خضراء ولكن 4 منها فقط يتم تنفيذها بالتوازي في أي وقت محدد ويمكنك كتابة المجدول الخاص بك لأنك تتحكم في ذلك مهمة التبديل بين المواضيع الخضراء.

الكتابة على سبيل المثال لخادم ويب باستخدام سلاسل رسائل خضراء لها الفائدة التالية: يمكن أن يستخدم رمز عمليات التنفيذ العادية متعددة الخيوط وغير المتزامنة/الخضراء نفس كود servlet إذا تمت كتابته بشكل جيد (لأنه يمكنك وضع مهمة التبديل في التنفيذ الخاص بك بخلاف ذلك استدعاءات وظائف الحظر مثل وظائف القراءة/الكتابة للمقبس وتنفيذ نفس استدعاءات وظائف الحظر في الوضع متعدد مؤشرات الترابط تستدعي في الواقع الوظائف المكافئة لنظام التشغيل الحظر).

コメント

タイトルとURLをコピーしました