الخيط الافتراضي
في برمجة الحاسوب ، الخيط الافتراضي هو خيط تتم إدارته بواسطة مكتبة وقت التشغيل أو الآلة الافتراضية (VM) ويتم جعله يشبه خيط النواة بالنسبة للتعليمات البرمجية التي يتم تنفيذها عليه، مع الحاجة إلى موارد أقل بكثير من الأخير.
تتيح الخيوط الافتراضية تنفيذ عشرات الملايين من المهام والأحداث الاستباقية على حاسوب استهلاكي من فئة 2021، [ 1 ] مقارنةً ببضعة آلاف من خيوط نظام التشغيل . [ 2 ] يُعدّ التنفيذ الاستباقي [ 3 ] مهمًا لتحسين الأداء من خلال التوازي وسرعة الاستجابة الاستباقية لعشرات الملايين من الأحداث.
تُسبب البنى السابقة التي لا تكون استباقية أو ليست كذلك دائمًا، مثل الروتينات الفرعية أو الخيوط الخضراء أو Node.js أحادي الخيوط إلى حد كبير ، تأخيرات في الاستجابة للأحداث غير المتزامنة مثل كل طلب وارد في تطبيق الخادم. [ 4 ]
تعريف
الخيوط الافتراضية استباقية
- من المهم لأداء الاستجابة أن يكون الخيط الافتراضي قادرًا على التفاعل مع الأحداث دون تدخل المبرمج أو قبل الانتهاء من المهمة الحالية.
- يتطلب الاستباق معرفة البرمجة متعددة الخيوط لتجنب عمليات الكتابة الممزقة، وتضارب البيانات، وعمليات الكتابة غير المرئية بواسطة الخيوط الأخرى.
يمكن للخيوط الافتراضية أن تتجاوز وحدات التنفيذ لجميع المعالجات والأنوية.
- وهذا يسمح باستغلال أفضل للأجهزة المتاحة.
- تستخدم لغة Go (منذ الإصدار 1.18) قوائم انتظار الخيوط الافتراضية لكل وحدة تنفيذ . توجد خيوط افتراضية إضافية غير مخصصة لوحدة تنفيذ، ويمكن لوحدة تنفيذ أن تستولي على خيوط افتراضية من وحدة تنفيذ أخرى. [ 5 ]
لا تتطلب الخيوط الافتراضية أي تدخلات من المبرمج، سواءً كانت عملية تنازل أو ما شابهها.
- يبدو أن الخيوط الافتراضية تعمل بشكل مستمر حتى تعود أو تتوقف عند قفل التزامن.
- على عكس الروتينات الفرعية، إذا كان خيط افتراضي في حلقة لا نهائية، فإنه لا يحجب البرنامج. يستمر التنفيذ مع زيادة في حمل وحدة المعالجة المركزية، حتى لو كان عدد الخيوط المتكررة أكبر من وحدات التنفيذ المتاحة.
يمكن أن يصل عدد الخيوط الافتراضية إلى عشرات الملايين من خلال عرض مجموعات صغيرة غالبًا ما تتم إدارتها
- وهذا يسمح بوجود عدد أكبر بكثير من الخيوط مقارنةً بما يمكن تحقيقه باستخدام خيوط نظام التشغيل.
- يمكن للغة Go 1.18 تشغيل 15 مليون خيط افتراضي على جهاز كمبيوتر من الفئة الاستهلاكية لعام 2021، أي ما يعادل حوالي 350 ألف خيط لكل غيغابايت من الذاكرة الرئيسية. ويتحقق ذلك بفضل وجود مكدس قابل لتغيير الحجم، لا يتجاوز حجمه 3 كيلوبايت، ضمن الروتينات الفرعية (goroutines).
يمكن تخصيص الخيوط الافتراضية بسرعة
- لأن تخصيص الخيط الافتراضي لا يتطلب سوى القليل من النفقات الإضافية بالإضافة إلى تخصيص الذاكرة، فيمكن تخصيصها بسرعة كبيرة.
- يؤدي التسارع الأسرع إلى تقليل الحاجة إلى مجموعات من الخيوط التي تم إطلاقها مسبقًا لتلبية الزيادات المفاجئة في حركة المرور.
تتشارك الخيوط الافتراضية الذاكرة مثل خيوط نظام التشغيل
- مثل خيوط نظام التشغيل، تتشارك الخيوط الافتراضية الذاكرة عبر العملية، وبالتالي يمكنها مشاركة كائنات الذاكرة والوصول إليها بحرية مع مراعاة التزامن.
- بعض البنى أحادية الخيوط، مثل محرك V8 ECMAScript المستخدم بواسطة Node.js، لا تقبل بسهولة البيانات التي لم يخصصها الخيط المحدد، مما يتطلب استخدام أنواع بيانات خاصة بدون نسخ عند مشاركة البيانات بين الخيوط.
توفر الخيوط الافتراضية التوازي مثل خيوط نظام التشغيل
- التوازي يعني تنفيذ تعليمات متعددة في نفس الوقت، مما يؤدي عادةً إلى زيادة كبيرة في الأداء.
- يختلف هذا عن التزامن الأبسط، حيث تقوم وحدة تنفيذ واحدة بتنفيذ عدة خيوط مشتركة على فترات زمنية قصيرة. يجعل تقسيم الوقت كل خيط يبدو وكأنه يعمل باستمرار. مع أن التزامن أسهل في التنفيذ والبرمجة، إلا أنه لا يُحسّن الأداء.
تحفيز
تتميز خوادم جافا ببنية برمجية واسعة النطاق تستهلك الكثير من الذاكرة، مما يسمح لعشرات من خيوط نظام التشغيل المجمعة بتنفيذ آلاف الطلبات في الثانية بشكل استباقي دون استخدام خيوط افتراضية. ويكمن مفتاح الأداء هنا في تقليل زمن الاستجابة الأولي في معالجة الخيوط وتقليل الوقت الذي تكون فيه خيوط نظام التشغيل متوقفة. [ 6 ]
تزيد الخيوط الافتراضية من إمكانية التزامن بشكل كبير، بينما يظل التوازي الفعلي محدودًا بوحدات التنفيذ المتاحة وتقنية خطوط الأنابيب التي توفرها المعالجات وأنوية المعالجات الحالية. في عام 2021، كانت أجهزة الكمبيوتر الاستهلاكية توفر عادةً توازيًا يصل إلى عشرات وحدات التنفيذ المتزامنة. [ 7 ] ولزيادة الأداء من خلال التوازي، يجب أن تستخدم بيئة تشغيل اللغة جميع مكونات الأجهزة المتاحة، [ 8 ] وألا تكون أحادية الخيوط أو أن تتضمن ميزات تزامن شاملة مثل قفل المفسر العام .
تُحقق الخيوط الافتراضية الزيادة الهائلة في عدد العناصر القابلة للاستباق بفضل إدارة وقت تشغيل اللغة لمكدسات الخيوط القابلة لتغيير الحجم. [ 9 ] وتكون هذه المكدسات أصغر حجمًا من مكدسات خيوط نظام التشغيل. ويتناسب الحد الأقصى لعدد الخيوط الممكنة دون تبديل الذاكرة مع حجم الذاكرة الرئيسية. [ 10 ]
لدعم الخيوط الافتراضية بكفاءة، يجب إعادة كتابة بيئة تشغيل اللغة بشكل كبير لمنع استدعاءات الحظر من إعاقة خيط نظام التشغيل المُخصص لتنفيذ خيط افتراضي [ 11 ] ولإدارة مكدسات الخيوط. [ 12 ] ومن الأمثلة على تحديث بيئة تشغيل موجودة لتتوافق مع الخيوط الافتراضية مشروع Loom في جافا . [ 13 ] ومن الأمثلة على اللغات الجديدة المصممة للخيوط الافتراضية لغة Go. [ 14 ]
تعقيد
نظراً لأن الخيوط الافتراضية توفر التوازي، فإن المبرمج يحتاج إلى أن يكون ماهراً في البرمجة متعددة الخيوط والتزامن.
نظرًا لأنّ الخيط الافتراضي المُعطّل يُعطّل خيط نظام التشغيل الذي يشغله حاليًا، يجب بذل جهد كبير أثناء التشغيل للتعامل مع استدعاءات النظام المُعطّلة. عادةً، يُستخدم خيط من مجموعة خيوط نظام التشغيل الاحتياطية لتنفيذ الاستدعاء المُعطّل للخيط الافتراضي، وذلك لضمان عدم تعطيل خيط نظام التشغيل الذي كان قيد التنفيذ في البداية.
تتطلب إدارة مكدس الخيوط الافتراضية عناية في الرابط وتوقعات قصيرة لمتطلبات مساحة المكدس الإضافية.
التطبيقات
متصفح جوجل كروم
تُستخدم الخيوط الافتراضية لتسلسل عمليات الإدخال/الإخراج الفردية، وهي متاحة للمطورين الذين يقومون بتوسيع المتصفح. عند تنفيذ خيط افتراضي، يمكنه الانتقال إلى خيط نظام تشغيل مختلف. [ 15 ]
يذهب
أصبحت goroutines في Go استباقية مع Go 1.4 في عام 2014 وهي تطبيق بارز للخيوط الافتراضية.
جافا
قدّمت لغة جافا ميزة الخيوط الافتراضية الاستباقية في عام 2023 مع الإصدار 21، مع وجود قيد يتمثل في أن أي كود يعمل على خيط افتراضي ويستخدم كتلًا متزامنة أو استدعاءات أصلية سيرتبط بخيط نظام التشغيل الخاص به. [ 16 ] وقد تم إصلاح هذا القيد في الإصدار 24 من جافا. [ 17 ]
استخدامات أخرى للمصطلح
أشارت شركة Intel [ 18 ] في عام 2007 إلى تقنية تحسين خاصة بمترجم Intel باسم الخيوط الافتراضية.
انظر أيضاً
مراجع
- ↑ روديل، هارالد (2022-03-19). "التوازي الافتراضي الهائل" .
- ↑ بايلدونغ (2022-01-02). "الحد الأقصى لعدد الخيوط لكل عملية في لينكس | بايلدونغ على لينكس" . www.baeldung.com . تم الاطلاع عليه بتاريخ 2022-03-30 .
- ↑ "ملاحظات إصدار Go 1.14 - لغة برمجة Go" . go.dev . تم الاطلاع عليه بتاريخ 30-03-2022 .
- ↑ Node.js. "لا تعيق حلقة الأحداث (أو مجموعة العمال)" . Node.js. تم الاسترجاع في 30-03-2022 .
- ↑ لو، جينتشي (22 يوليو 2021). "نموذج الخيوط في جافا وروتين جولانج الفرعي" . ميديوم . تم الاسترجاع في 5 أبريل 2022 .
- ↑ "مبادئ التعامل مع آلاف الاتصالات في جافا باستخدام نيتي - أداء دي زون" . dzone.com . تم الاطلاع عليه بتاريخ 30-03-2022 .
- ↑ "MacBook Pro 14 بوصة وMacBook Pro 16 بوصة" . أبل . تم الاطلاع عليه بتاريخ 30 مارس 2022 .
- ↑ "الأسئلة الشائعة (FAQ) - لغة البرمجة Go" . go.dev . تم الاطلاع عليه بتاريخ 30-03-2022 .
- ↑ "مسودة JEP: الخيوط الافتراضية (معاينة)" . openjdk.java.net . تم الاطلاع عليه بتاريخ 30-03-2022 .
- ↑ روديل، هارالد (2022-03-22). "الحد الأقصى لعدد الخيوط الافتراضية في لغة Go" .
- ↑ شتشوكوكسكي، دينيس (18 مارس 2020). "الفرق بين الخيوط والخيوط الافتراضية في جافا | بايلدونغ" . www.baeldung.com . تاريخ الاسترجاع: 30 مارس 2022 .
- ↑ "لماذا يمكنك امتلاك ملايين من الروتينات الفرعية (Goroutines) ولكن آلافًا فقط من سلاسل جافا (Java Threads) ؟ " rcoh.me. 2018-04-12 . تم الاطلاع عليه بتاريخ 2022-03-30 .
- ↑ "الرئيسية - الرئيسية - ويكي OpenJDK" . wiki.openjdk.java.net . تم الاطلاع عليه بتاريخ 30-03-2022 .
- ↑ "لغة البرمجة Go" . go.dev . 22-03-2022 . تم الاطلاع عليه بتاريخ 30-03-2022 .
- ↑ "الخيوط والمهام في متصفح كروم" . chromium.googlesource.com . تم الاطلاع عليه بتاريخ 2022-04-05 .
- ↑ "الخيوط الافتراضية" . مركز مساعدة أوراكل . تم الاطلاع عليه بتاريخ 10-09-2024 .
- ↑ "JEP 491: مزامنة الخيوط الافتراضية بدون تثبيت" . OpenJDK . تم الاسترجاع في 30-03-2025 .
- ↑ "مجلة إنتل للتكنولوجيا" (ملف PDF) .
روابط خارجية
- الخيوط (الحوسبة)
- المحاكاة الافتراضية
