خيط أخضر
في برمجة الحاسوب ، يُعرف الخيط الأخضر بأنه خيط تتم جدولته بواسطة مكتبة وقت التشغيل أو الآلة الافتراضية (VM) بدلاً من نظام التشغيل الأساسي (OS) نفسه. تحاكي الخيوط الخضراء بيئات متعددة الخيوط دون الاعتماد على أي من قدرات نظام التشغيل الأصلية، وتُدار في مساحة المستخدم بدلاً من مساحة النواة ، مما يُمكّنها من العمل في بيئات لا تدعم الخيوط بشكل أصلي. [ 1 ]
أصل الكلمة
يشير مصطلح Green Threads إلى اسم مكتبة الخيوط الأصلية للغة برمجة Java (التي صدرت في الإصدار 1.1 ، ثم تم التخلي عنها في الإصدار 1.3 لصالح الخيوط الأصلية). وقد صممها فريق The Green Team في شركة Sun Microsystems . [ 2 ]
تاريخ
كانت الخيوط الخضراء متاحة لفترة وجيزة في جافا بين عامي 1997 و 2000.
تتشارك الخيوط الخضراء خيط نظام تشغيل واحد من خلال التزامن التعاوني، ولذلك لا يمكنها تحقيق مكاسب في أداء التوازي مثل خيوط نظام التشغيل. وتتمثل الميزة الرئيسية للروتينات الفرعية والخيوط الخضراء في سهولة التنفيذ.
أداء
في المعالجات متعددة النوى ، تستطيع تطبيقات الخيوط الأصلية توزيع العمل تلقائيًا على عدة معالجات، بينما لا تستطيع تطبيقات الخيوط الخضراء ذلك عادةً. [ 1 ] [ 3 ] يمكن بدء الخيوط الخضراء بسرعة أكبر بكثير على بعض الأجهزة الافتراضية. أما على الحواسيب أحادية المعالج، فلم يُحدد النموذج الأكثر كفاءة بشكل واضح حتى الآن.
أظهرت الاختبارات المعيارية على أجهزة الكمبيوتر التي تعمل بنظام تشغيل نواة لينكس الإصدار 2.2 (الذي صدر في عام 1999) ما يلي: [ 4 ]
- تتفوق الخيوط الخضراء بشكل ملحوظ على الخيوط الأصلية لنظام لينكس في تنشيط الخيوط ومزامنتها .
- تتمتع الخيوط الأصلية لنظام Linux بأداء أفضل قليلاً في عمليات الإدخال/الإخراج (I/O) وعمليات تبديل السياق .
عندما يُنفّذ خيطٌ أخضر استدعاء نظامٍ مُعطِّل، لا يتم تعطيل هذا الخيط فحسب، بل يتم تعطيل جميع الخيوط داخل العملية. [ 5 ] لتجنب هذه المشكلة، يجب أن تستخدم الخيوط الخضراء عمليات إدخال/إخراج غير مُعطِّلة أو عمليات إدخال/إخراج غير متزامنة ، على الرغم من إمكانية تقليل التعقيد المتزايد على جانب المستخدم إذا قامت الآلة الافتراضية التي تُنفِّذ الخيوط الخضراء بإنشاء عمليات إدخال/إخراج مُحدَّدة (مخفية عن المستخدم) لكل عملية إدخال/إخراج.
توجد أيضًا آليات تسمح باستخدام الخيوط الأصلية وتقلل من عبء تنشيط الخيوط ومزامنتها:
- تعمل مجموعات الخيوط على تقليل تكلفة إنشاء خيط جديد عن طريق إعادة استخدام عدد محدود من الخيوط. [ 6 ]
- يمكن للغات التي تستخدم الآلات الافتراضية والخيوط الأصلية استخدام تحليل الهروب لتجنب مزامنة كتل التعليمات البرمجية عند عدم الحاجة إليها. [ 7 ]
الخيوط الخضراء في آلة جافا الافتراضية
في جافا 1.1 ، كانت الخيوط الخضراء هي نموذج الخيوط الوحيد المستخدم في آلة جافا الافتراضية (JVM)، [ 8 ] على الأقل في نظام سولاريس . ونظرًا لوجود بعض القيود على الخيوط الخضراء مقارنةً بالخيوط الأصلية، فقد تخلت الإصدارات اللاحقة من جافا عنها لصالح الخيوط الأصلية. [ 9 ] [ 10 ]
يُستثنى من ذلك جهاز Squawk الافتراضي ، الذي يجمع بين نظام تشغيل للأجهزة منخفضة الطاقة وجهاز جافا الافتراضي. وهو يستخدم الخيوط الخضراء لتقليل استخدام التعليمات البرمجية الأصلية ، ولدعم ترحيل وحداته المعزولة.
Kilim [ 11 ] [ 12 ] و Quasar [ 13 ] [ 14 ] هما مشروعان مفتوحا المصدر يقومان بتنفيذ الخيوط الخضراء على الإصدارات اللاحقة من JVM عن طريق تعديل بايت كود Java الذي ينتجه مترجم Java (يدعم Quasar أيضًا Kotlin و Clojure ).
الخيوط الخضراء بلغات أخرى
توجد بعض لغات البرمجة الأخرى التي تُطبّق ما يُعادل الخيوط الخضراء بدلاً من الخيوط الأصلية. أمثلة:
- في لغة C لأنظمة POSIX ،
makecontextتوفر هذه الميزة خيوطًا تعاونية خفيفة الوزن. وهي غير مدرجة في مواصفات POSIX.1-2008 نظرًا للاختلافات بين الأنظمة. - يستخدم مخطط الدجاج خيوطًا خفيفة الوزن على مستوى المستخدم تعتمد على استمرارات من الدرجة الأولى [ 15 ]
- Common Lisp [ 16 ]
- يدعم CPython بشكل أصلي asyncio منذ الإصدار 3.4، وهناك تطبيقات بديلة مثل greenlet و eventlet و gevent و PyPy [ 17 ]
- توفر الكريستال الألياف [ 18 ]
- يوفر D الألياف المستخدمة للإدخال/الإخراج غير المتزامن [ 19 ]
- Dyalog APL يطلق عليها اسم الخيوط [ 20 ]
- إرلانج [ 21 ]
- تُنفذ لغة Go ما يسمى بالروتينات الفرعية [ 22 ]
- هاسكل [ 22 ]
- تستخدم جوليا الخيوط الخضراء لمهامها .
- ليمبو [ 23 ]
- تستخدم لغة Lua الروتينات الفرعية للتزامن. كما توفر Lua 5.2 دلالات روتينية فرعية حقيقية بلغة C من خلال الدوال
lua_yieldkوlua_callkوlua_pcallk. وتتيح إضافة CoCo دلالات روتينية فرعية حقيقية بلغة C للغة Lua 5.1. - توفر لغة Nim عمليات الإدخال/الإخراج غير المتزامنة والروتينات الفرعية
- يدعم OCaml ، منذ الإصدار 5.0، الخيوط الخضراء من خلال وحدة Domainslib.Task
- لغة أوكام ، التي تفضل مصطلح العملية بدلاً من الخيط نظراً لأصولها في التواصل بين العمليات المتسلسلة
- يدعم بيرل الخيوط الخضراء من خلال الكوروتينات
- يدعم PHP الخيوط الخضراء من خلال الألياف والروتينات الفرعية
- Racket (تتوفر الخيوط الأصلية أيضًا من خلال Places [ 24 ] )
- روبي قبل الإصدار 1.9 [ 25 ]
- تطبيق SML/NJ للتعلم الآلي المتزامن
- Smalltalk (معظم اللهجات: Squeak ، VisualWorks، GNU Smalltalk ، إلخ.)
- يدعم Stackless Python إما تعدد المهام الاستباقي أو تعدد المهام التعاوني من خلال الخيوط الدقيقة (تسمى tasklets ). [ 26 ]
- تحتوي لغة Tcl على روتينات فرعية وحلقة أحداث [ 27 ]
تحتوي آلة إرلانج الافتراضية على ما يُمكن تسميته بالعمليات الخضراء - وهي تُشبه عمليات نظام التشغيل (لا تُشارك الحالة كما تفعل الخيوط) ولكنها مُنفذة ضمن نظام تشغيل إرلانج (erts). تُسمى هذه العمليات أحيانًا بالخيوط الخضراء ، ولكنها تختلف اختلافًا كبيرًا عن الخيوط الخضراء القياسية.
في حالة GHC Haskell، يحدث تبديل السياق عند أول تخصيص بعد مهلة زمنية قابلة للتكوين. كما يمكن تشغيل خيوط GHC على خيط واحد أو أكثر من خيوط نظام التشغيل خلال فترة عملها (توجد علاقة متعددة الأطراف بين خيوط GHC وخيوط نظام التشغيل)، مما يسمح بالتوازي على أجهزة المعالجة المتعددة المتناظرة ، دون إنشاء خيوط نظام تشغيل أكثر تكلفة من اللازم للتشغيل على عدد النوى المتاحة.
لا تحسب معظم الآلات الافتراضية لـ Smalltalk خطوات التقييم؛ ومع ذلك، لا يزال بإمكان الآلة الافتراضية مقاطعة الخيط قيد التنفيذ بناءً على إشارات خارجية (مثل انتهاء صلاحية المؤقتات، أو توفر الإدخال/الإخراج). عادةً ما تُستخدم جدولة التناوب الدوري بحيث تُنفذ عملية ذات أولوية عالية تستيقظ بانتظام مقاطعة المشاركة الزمنية بشكل فعال .
[ [( تأخير بالمللي ثانية: 50 ) انتظر ] كرر ] forkAt: معالج ذو أولوية إدخال/إخراج عاليةتعتمد بعض التطبيقات الأخرى، مثل QKS Smalltalk، على تقنية المشاركة الزمنية. وعلى عكس معظم تطبيقات الخيوط الخضراء، يدعم QKS أيضًا منع انعكاس الأولوية .
الاختلافات في الخيوط الافتراضية في آلة جافا الافتراضية
تم تقديم الخيوط الافتراضية كميزة تجريبية في Java 19 [ 28 ] وتم تثبيتها في Java 21. [ 29 ] أهم الاختلافات بين الخيوط الافتراضية والخيوط الخضراء هي:
- تتعايش الخيوط الافتراضية مع خيوط النظام الأساسية الحالية (غير الافتراضية) ومجموعات الخيوط.
- تحمي الخيوط الافتراضية تجريدها:
- على عكس الخيوط الخضراء، فإن النوم على خيط افتراضي لا يحجب خيط الناقل الأساسي.
- يتم التقليل من أهمية التعامل مع المتغيرات المحلية للخيط، ويُقترح استخدام القيم ذات النطاق كبديل أخف وزنًا. [ 30 ]
- يمكن تعليق واستئناف الخيوط الافتراضية بتكلفة منخفضة، وذلك بالاستفادة من دعم JVM للفئة الخاصة
jdk.internal.vm.Continuation. - تتعامل الخيوط الافتراضية مع المكالمات المحظورة عن طريق إلغاء التحميل بشفافية من خيط الناقل حيثما أمكن ذلك، وإلا فإنها تعوض ذلك عن طريق زيادة عدد خيوط النظام الأساسي.
انظر أيضاً
مراجع
- 1 2 سينتيس، توني (13 أبريل 2001). "أربعة للأجيال" . جافا وورلد . مؤرشف من الأصل في 15 يوليو 2020. تم الاسترجاع في 14 يوليو 2020.
تعمل الخيوط الخضراء، وهي الخيوط التي توفرها آلة جافا الافتراضية (JVM)، على مستوى المستخدم، مما يعني أن آلة جافا الافتراضية هي التي تنشئ هذه الخيوط وتجدولها بنفسها. لذلك، لا تقوم نواة نظام التشغيل بإنشائها أو جدولتها. بدلاً من ذلك، يرى نظام التشغيل الأساسي آلة جافا الافتراضية كخيط واحد فقط. تُثبت الخيوط الخضراء عدم كفاءتها لعدة أسباب. أولاً، لا يمكن للخيوط الخضراء الاستفادة من نظام متعدد المعالجات (...) وبالتالي، فإن خيوط آلة جافا الافتراضية محصورة في العمل ضمن خيط آلة جافا الافتراضية الوحيد الذي يعمل داخل معالج واحد.
{{cite web}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط ) - ↑ "تقنية جافا: السنوات الأولى" . java.sun.com . 22-12-2014. مؤرشف من الأصل بتاريخ 30-05-2008.
- ↑ ما الفرق بين الخيوط "الخضراء" والخيوط "الأصلية"؟ jguru.com . 2000-09-06 . تم الاطلاع عليه في 2009-06-01 .
في الأجهزة متعددة المعالجات، يمكن للخيوط الأصلية تشغيل أكثر من خيط واحد في وقت واحد عن طريق تخصيص خيوط مختلفة لمعالجات مختلفة. أما الخيوط الخضراء فتُشغَّل على معالج واحد فقط.
- ↑ "تقييم الأداء المقارن لخيوط جافا للتطبيقات المدمجة: خيط لينكس مقابل خيط جرين". CiteSeerX 10.1.1.8.9238 .
- ↑ ستالينغز، ويليام (2008). أنظمة التشغيل، المبادئ الداخلية ومبادئ التصميم . نيوجيرسي: برنتيس هول. ص 171. ISBN 9780136006329.
- ↑ سيجر، نيك (22 يوليو 2011). "التزامن في JRuby" . إنجن يارد . مؤرشف من الأصل في 30 يناير 2014. تم الاسترجاع في 26 يناير 2013.
بالنسبة للأنظمة التي تتعامل مع كميات كبيرة من البريد الإلكتروني، قد لا يكون هذا النهج البسيط فعالاً. تتطلب الخيوط الأصلية تكلفة تهيئة أعلى واستهلاكًا أكبر للذاكرة مقارنةً بالخيوط الخضراء، لذا لا يدعم JRuby عادةً أكثر من 10000 خيط تقريبًا. وللتغلب على هذه المشكلة، يمكننا استخدام مجمع خيوط.
- ↑ غوتز، برايان (18 أكتوبر 2005). "نظرية وتطبيق جافا: تحسينات التزامن في موستانج" . آي بي إم . تم الاطلاع عليه بتاريخ 26 يناير 2013 .
- ↑ "خيوط جافا في بيئة سولاريس - الإصدارات السابقة" . شركة أوراكل . تم الاطلاع عليه بتاريخ 26 يناير 2013.
ونتيجةً لذلك، ظهرت عدة مشاكل: لم تتمكن تطبيقات جافا من التفاعل مع تطبيقات المعالجات المتعددة الموجودة في بيئة سولاريس، ولم تتمكن خيوط جافا من العمل بالتوازي على المعالجات المتعددة، ولم يتمكن تطبيق جافا متعدد المعالجات من الاستفادة من التزامن الحقيقي لنظام التشغيل لتحسين أداء التطبيقات سواءً على المعالجات الأحادية أو المتعددة. ولزيادة أداء التطبيقات بشكل ملحوظ، تم استبدال مكتبة الخيوط الخضراء بخيوط سولاريس الأصلية لجافا على منصة سولاريس 2.6؛ وتم اعتماد هذا التغيير في منصتي سولاريس 7 وسولاريس 8.
- ↑ "الخيوط: خضراء أم أصلية" . مجموعة SCO . تم الاطلاع عليه بتاريخ 26 يناير 2013.
يمكن أن يكون التحسن في الأداء الناتج عن استخدام الخيوط الأصلية على جهاز متعدد المعالجات هائلاً. على سبيل المثال، باستخدام معيار أداء اصطناعي حيث تقوم خيوط جافا بمعالجة البيانات بشكل مستقل عن بعضها البعض، يمكن تحقيق تحسن في السرعة الإجمالية بمقدار ثلاثة أضعاف على جهاز متعدد المعالجات بأربعة أنوية.
- ↑ "الخيوط: الأخضر أم الأصلي" . codestyle.org. مؤرشف من الأصل بتاريخ 16 يناير 2013. تم الاطلاع عليه بتاريخ 26 يناير 2013.
يُسبب تتبع حالات الخيوط والتبديل بينها عبئًا كبيرًا على معالجة JVM، لذا تم إيقاف وضع الخيوط الأخضر وإزالته من تطبيقات Java الحديثة.
- ↑ "kilim" . GitHub . تم الاسترجاع في 2016-06-09 .
- ↑ "Kilim" . www.malhar.net . تم الاطلاع عليه بتاريخ 2016-06-09 .
- ↑ "كود Quasar على GitHub" . GitHub .
- ↑ "الكون الموازي" . مؤرشف من الأصل بتاريخ 22 ديسمبر 2015. تم الاطلاع عليه بتاريخ 6 ديسمبر 2015 .
- ↑ "مخطط الدجاج" . تم الاطلاع عليه بتاريخ 5 نوفمبر 2017 .
- ↑ "thezerobit/green-threads" . GitHub . تم الاسترجاع في 2016-04-08 .
- ↑ "ميزات Stackless على مستوى التطبيق - وثائق PyPy 4.0.0" . تم الاطلاع عليه بتاريخ 6 ديسمبر 2015 .
- ↑ "التزامن: GitBook" . crystal-lang.org . تم الاطلاع عليه بتاريخ 2018-04-03 .
- ↑ "Fibers - Dlang Tour" . tour.dlang.org . تم الاطلاع عليه بتاريخ 2022-05-02 .
- ↑ "الخيوط: نظرة عامة" . مساعدة Dyalog APL 17.0 . تم الاطلاع عليه بتاريخ 14-12-2018 .
الخيط هو
سلسلة
من عمليات التنفيذ في مساحة عمل APL.
- ↑ @joeerl (23 يونيو 2018). "تتم محاكاة عمليات Erlang في آلة Erlang الافتراضية، مثل سلاسل Green - نحن نحبها لأن هذا يبسط العديد من المشاكل..." ( تغريدة ) - عبر تويتر .
- 1 2 "Go and Dogma" . research!rsc . تم الاسترجاع في 14 يناير 2017. على
سبيل المثال، تحتاج كل من Go و Haskell إلى نوع من "الخيوط الخضراء"، لذلك هناك تحديات وقت تشغيل مشتركة أكثر مما قد تتوقع.
- ↑ "لغة برمجة ليمبو" . www.vitanuova.com . تم الاطلاع عليه بتاريخ 1 أبريل 2019 .
- ↑ "أماكن Racket" . تم الاطلاع عليه بتاريخ 13 أكتوبر 2011.
تُمكّن الأماكن من تطوير برامج متوازية تستفيد من الأجهزة ذات المعالجات المتعددة أو النوى أو خيوط المعالجة. المكان هو مهمة متوازية تُعتبر فعليًا نسخة منفصلة من آلة Racket الافتراضية.
- ↑ "المعالجة المتعددة في مترجم روبي الخاص بـ MRI | BugFactory" . تم الاطلاع عليه بتاريخ 18-06-2024 .
- ↑ "Stackless.com: حول Stackless" . مؤرشف من الأصل بتاريخ 27 فبراير 2012. تم الاطلاع عليه بتاريخ 27 أغسطس 2008.
يتضمن النظام مُجدولًا دوريًا. يمكن استخدامه لجدولة المهام إما بشكل تعاوني أو استباقي.
- ↑ "حلقة أحداث Tcl" . تم الاطلاع عليه بتاريخ 6 ديسمبر 2015 .
- ↑ "JEP 425: الخيوط الافتراضية (معاينة)" . تم الاطلاع عليه بتاريخ 25-01-2024 .
- ↑ "JEP 444: الخيوط الافتراضية" . تم الاطلاع عليه بتاريخ 25-01-2024 .
- ↑ "JEP 464: القيم المحددة النطاق (معاينة ثانية)" . تم الاطلاع عليه بتاريخ 25-01-2024 .
روابط خارجية
- " أربعةٌ خالدة "، مقالٌ من مجلة JavaWorld حول الخيوط الخضراء
- الأسئلة الشائعة حول الخيوط الخضراء في جافا
- الخيوط (الحوسبة)
- جافا (منصة برمجية)
