سؤال

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

هذا جيد وجيد (رائع في الواقع). ولكن كيف يتم تنفيذ خيوط إرلانج بالتوازي في بيئة متعددة المعالجة؟ من المؤكد أنهم يجب أن يتم تعيينهم بطريقة ما إلى خيوط kernel من أجل تنفيذها على النوى المنفصلة؟

على افتراض أن هذا هو الحال ، كيف يتم ذلك؟ هل تم تعيين العديد من العمليات خفيفة الوزن إلى خيط kernel واحد؟

أم أن هناك طريقة أخرى حول هذه المشكلة؟

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

المحلول

الجواب يعتمد على VM المستخدم:

1) غير SMP: هنالك جدولة واحدة (موضوع OS) ، الذي ينفذ جميع عمليات Erlang ، مأخوذة من مجموعة من العمليات القابلة للتشغيل (أي أولئك الذين لم يتم حظرهم بواسطة EG receive)

2) SMP: هناك جدولين ك (مؤشرات الترابط OS ، K عادة ما يكون عدد من نوى وحدة المعالجة المركزية) ، والتي تنفذ عمليات Erlang من قائمة انتظار العملية المشتركة. إنها قائمة انتظار FIFO بسيطة (مع أقفال للسماح بالوصول المتزامن من مؤشرات الترابط OS المتعددة).

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

لمزيد من المعلومات، راجع هذا المستند أعدها كينيث لوندين ، إريكسون AB ، لمؤتمر مستخدم Erlang ، ستوكهولم ، 13 نوفمبر 2008.

نصائح أخرى

أريد أن أملك الإجابات السابقة.

Erlang ، أو بالأحرى نظام تشغيل Erlang (ERTS) ، يضعف عدد الجدولين (مؤشرات الترابط OS) وعدد Runqueues إلى عدد عناصر المعالجة على النظام الأساسي الخاص بك. هذا هو المعالجات النوى أو مؤشرات ترابط الأجهزة. يمكنك تغيير هذه الإعدادات في وقت التشغيل باستخدام:

erlang:system_flag(schedulers_online, NP) -> PrevNP

لا تحتوي عمليات Erlang على أي تقارب لأي جدولة حتى الآن. المنطق الموازنة بين العمليات بين الجدولين يتبع قاعدتين. 1) سيسرق جدولة الجوع العمل من جدولة أخرى. 2) يتم إعداد مسارات الترحيل لدفع العمليات من المجدولين مع الكثير من العمليات إلى المجدول مع عمل أقل. يتم ذلك لضمان الإنصاف في عدد التخفيض (وقت التنفيذ) لكل عملية.

ومع ذلك ، يمكن قفل الجداول لعناصر معالجة محددة. هذا لم يتم بشكل افتراضي. للسماح لـ erts بإجراء استخدام التقارب الأساسي:

erlang:system_flag(scheduler_bind_type, default_bind) -> PrevBind

يمكن العثور على العديد من أنواع الربط الأخرى في الوثائق. يمكن أن يؤدي استخدام التقارب إلى تحسين الأداء بشكل كبير في مواقف الحمل الثقيلة! خاصة في حالات الخلاف عالية القفل. أيضا ، لا يمكن لـ Linux kernel التعامل مع الفصائل على أقل تقدير. إذا كان لديك HyperThreads على النظام الأساسي الخاص بك ، فيجب عليك استخدام هذه الميزة في Erlang.

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

أود إضافة بعض المدخلات إلى ما تم وصفه في الإجابة المقبولة.

Erlang Scheduler هو الجزء الأساسي من نظام وقت تشغيل Erlang ويوفر تجريده وتنفيذه لمفهوم العمليات الخفيفة على قمة مؤشرات ترابط OS.

يتم تشغيل كل جدولة ضمن مؤشر ترابط OS واحد. عادةً ما يكون هناك العديد من المحدودين مثل وحدة المعالجة المركزية (CORES) على الأجهزة HE (وهي قابلة للتكوين على الرغم من أنها لا تجلب قيمة كبيرة عندما يتجاوز عدد المجدولين عدد النوى للأجهزة). قد يتم أيضًا تكوين النظام بأن الجدولة لن يقفز بين مؤشرات ترابط OS.

الآن ، عندما يتم إنشاء عملية Erlang ، فإن مسؤولية ERTS والجدولة بالكامل لإدارة دورة الحياة واستهلاك الموارد وكذلك بصمة الذاكرة وما إلى ذلك.

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

أود أن أوصي بنشر مدونة رائع حول هذا الموضوع من قبل Jesper Louis Andersen http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html

كما الإجابة المختصرة: لا تعد عمليات Erlang مؤشرات ترابط OS ولا تقوم بتخطيطها مباشرة. إن جدولة Erlang هي ما يعمل على مؤشرات ترابط OS ويوفرون تنفيذًا ذكيًا لعمليات إرلانج أكثر دقة تخفي تلك التفاصيل وراء عيون المبرمجين.

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