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

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

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

الفوائد والجوانب السلبية لـ Work Stealing

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

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

تطبيقات Work Stealing

تحتوي العديد من لغات البرمجة على أوقات تشغيل يمكنها جدولة العمل مباشرة على معالجات مخصصة. على سبيل المثال، يمكن للغة برمجة Cilk ووقت تشغيل Rust Tokio والمكتبة المتوازية للمهام الصافية القيام بذلك. بدلاً من ذلك، قد يكون نظام التشغيل مسؤولاً عن جدولة وقت المعالج الفعلي. مع البرنامج ببساطة إضافة المهام إلى مجموعة من “خيوط العاملين”، والتي هي نفسها مجدولة من قبل نظام التشغيل.

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

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

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

الخلاصة

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