تعريف الـ Thread
– الثريد “Thread” بإختصار هو “خيط” أو سلسلة من الأوامر البرمجية. سنعتبر مجازاً بأن الأمر البرمجي يمثل سطر واحد من كود لبرنامج معين.
–∎–∎–∎–∎–∎–∎–∎–∎–
– المسؤول عن تشغيل هذا الخيط من الأوامر البرمجية هو الـ CPU “وحدة المعالجة المركزية”.
– يحتوي أي برنامج على ثريد واحد على الأقل، ويسمى الثريد الرئيسي main thread. في لغة الجافا مثلاً، دالة main تحتوي على مجموعة من الأوامر البرمجية اللتي ينفذها الـ CPU على الـ main thread عند تشغيل البرنامج.
– عند إحتواء البرنامج على أكثر من ثريد، فإن نظام التشغيل OS يقوم بجدولة الـ CPU للعمل على تنفيذ الأوامر الموجودة في “الثريدات”. وتختلف الطريقة بحسب مواصفات جهاز الحاسب المشغل ونظام التشغيل.
– لو كان الجهاز يحتوي على CPU واحد فقط، فإن نظام التشغيل يجبر هذا الـ CPU بالعمل على تنفيذ الأوامر الموجودة بالثريدات بشكل متزامن “concurrently”. مثال: لدينا 3 ثريدات، كيف يقوم الـ CPU بتنفيذها؟ في الحقيقة، تختلف الطريقة المتبعة من نظام تشغيل إلى آخر ولكن أغلب الأنظمة الحديثة تتبع طريقة round-robin algorithm، وتعتمد هذه الطريقة على المساواة في الأوقات المعطاة لكل ثريد time slices. الشكل التالي يوضح الطريقة (بإفتراض كل ثريد يحتوي على 4 أوامر برمجية):
∎–∎-………………-∎–∎
………∎–∎-………………-∎–∎
………………∎–∎-………………-∎–∎
كما يُلاحظ في الشكل السابق، قام نظام التشغيل بجدولة الـ CPU على جميع الثريدات لتشغيلها جميعاً بشكل متزامن. قام الـ CPU بتنفيذ أمرين من الثريد الأولى ثم قام بالانتقال “context-switching” إلى الثريد الثانية وقام بتنفيذ أمرين، ثم انتقل إلى الثريد الثالثة وقام بتنفيذ أمرين أيضاً، ثم عاد إلى الثريد الأولى ونفذ أمرين … وهكذا. في الحقيقة، ليس هناك طريقة ثابتة متبعة من قبل أنظمة التشغيل لتنفيذ الثريدات. في المثال السابق مثلاً، ربما سيقوم نظام التشغيل بتنفيذ الثريد الأول كاملاً ثم ينتقل إلى البقية. ربما أيضاً يقوم بتنفيذ الثريد الثاني أو الثالث قبل البقية. حتى أن الترتيب أيضاً سيختلف مع كل مرة تقوم فيها بتشغيل البرنامج. الترتيب غير مهم في أغلب الحالات، ولكن إن لزم ترتيبها، توجد عدة طرق للتحكم بالترتيب، ومنها جعل ثريد معين بأولوية أعلى للتنفيذ، أو تشغيل ثريد معين عند الانتهاء من تنفيذ ثريد آخر.
– عندما يحتوي جهاز الحاسب على أكثر من CPU واحد، أو يحتوي الـ CPU الواحد على عدة أنوية “cores”، يتم التنفيذ بشكل متوازي “in parallel”. لنطبق المثال السابق ولكن هذه المرة مع وجود CPU ثنائي النواة:
∎–∎–∎–∎………
∎–∎-………-∎–∎
………∎–∎–∎–∎
مع وجود CPU ثنائي النواة، زادت سرعة التنفيذ إلى الضعف (قل زمن التنفيذ إلى النصف)! أيضاً، الترتيب هنا مجهول ومتغير ويختلف في كل مرة يتم فيها تشغيل البرنامج.
– لنأخذ مثال بسيط لتتضح الصورة بشكل أكبر:
أ/ مطعم يقدم وجبات سريعة. يوجد به عامل واحد فقط يقوم بتقديم الطعام إلى الزبائن. الزبائن عادةً يقفون في صف واحد وكل واحد ينتظر دوره. هذا مثال لجهاز حاسب (مطعم) به CPU واحد (العامل) وثريد وحدة من الأوامر البرمجية (صف واحد من الزبائن).
ب/ مطعم يوجد به عامل واحد مشابه للمطعم السابق، ولكن هذه المرة الزبائن يقفون على 3 صفوف والعامل يقوم بخدمة الصفوف الثلاثة بأسلوب الـ round-robin. هذا مثال لجهاز حاسب (مطعم) به CPU واحد (العامل) و 3 ثريدات من الأوامر البرمجية (3 صفوف من الزبائن).
ج/ مطعم يوجد به عاملان، والزبائن تقف في 3 صفوف. هذا مثال لجهاز حاسب (مطعم) به 2 من الـ CPU أو CPU ثنائي النواة (العاملان) و3 ثريدات من الأوامر البرمجية (3 صفوف من الزبائن). هنا الإنتاجية ستزيد.
– ملحوظة أخيرة وهي بأن نظام التشغيل يحتوي على الآلاف من الثريدات ونظام التشغيل يقوم بجدولة الـ CPUs المتوفرة لتنفيذها، وليس برنامجك وحده من يتم خدمته من قبل الـ CPUs.
التعليقات (7)
أضف تعليقك
أداة البحث
التصنيفات
- أمن معلومات (1)
- برمجة (7)
جزاكم الله كل خير على إثراء المحتوى العربي الشرح جميل جدا كنت في حاجته
مشكور جدا علي الشرح السهل الواضح
ارجو ان تخخص مقال لعمليات التحويل في الجافا
from int to String
from String to int
جميل الشرح وطريقتك في إيصال الفكرة جميل وسهل، اسأل الله أن يبارك فيك ولك.
لدي سؤال: هل ينفع استخدام ميزة تعدد المسارات في vb.nrt مثلاً على cpu واحد وغير متعدد الأنوية ؟
ملحوظة: يوجد موقع اسمه أكاديمية حسوب لو يتم إضافة نسخة من المقالات هنالك حتى تصل لشريحة أكبر وينتفع الناس بالعلم.
استمر أخي فؤاد فإن مدونتك ومقالاتك تستحق القراءة.
الله يعطيك الصحه والعافيه
السلام عليكم ورحمة الله وبركاته
لو سمحتم اريد حل هذا السؤال
كيف استفيد من الثريدات كمبرمج
جزاكم الله خيراً، شرح سهل ومُبسط