مقدمة
المعالجات في وقتنا الحالي (مثل intel و amd) تحوي عدة انوية (cores)، كمثال معالج intel cor I7 8th يحوي 8 انوية اي يمكنك تخيل هذا المعالج ك 8 معالجات صغيرة في شريحة واحدة.
لذا سنتعرف بهذا المقال على ماهية الthread وما علاقته ب cores المعالج وكيف تتعامل لغات البرمجة معهم وانواع لغات البرمجة (من ناحية الserver side).
حيث ستكون في نهاية المقال قادرا على تحديد لغة البرمجة التي تحتاجها في مشروعك وفهم الية عملها لبناء مشروع افضل.
ماهو الthread؟
كما تكلمنا اعلاه اصبحت المعالجات الان تحوي عدة cores بداخلها وهذا يعتبر امر رائع!
حيث ان هذا هو السبب الذي جعل بامكاننا تشغيل عدة تطبيقات في الوقت نفسه على جهازنا ! اما بالنسبة للthread فهو المسلك الذي يوصل بين العملية المراد تنفيذها والمعالج (بمعنى اخر هو مكان يتم به تشغيل الكود)، وكل coreيمكن ان ينتج له thread(كمثال اذا فتحت برنامج واتس اب و فيس بوك في نفس الوقت سيعمل كل منهم على thread منفصل)، وهكذا ظهر مفهوم الmulti threads ! وهذا موضوع اخر عميق يمكننا التكلم عنه لاحقا حيث انه يحوي مفاهيم مثل الmany to one multi thread typeوغيرهم التي تدخلنا لعالم نظم التشغيل !
الmulti threaded server
كما ترى في الصورة اعلاه، اغلبية لغات البرمجة تتعامل مع الblocking codesبهذا الشكل، حيث ان اغلبيتهم تعمل بنظام الmulti threads حيث انه اذا فرضنا وجود سيرفر فيه بيانات للمستخدمين ودخل 10 مستخدمين ليأخذو بياناتهم فالسيرفر سيفتح thread خاص بكل مستخدم لارسال الطلبات واستلام الردود بهذا المسلك الخاص به ويكون هذا سريعا حيث انه يتعامل مع المعالج بمسلك كامل لوحده، اذا هذا ممتاز! صحيح؟ حسنا ليس دائما.
C10K Problem
في عام 1999 حدثت مشكلة مع مهندس برمجيات يدعى Dan Kegel، والذي كان يعمل على خادم FTP لشركة Simtel، ماحدث وقتها انه لاول مرة في تاريخه يأتي 10 الاف طلب في نفس الوقت الي الخادم ما ادى لسقوطه حيث ان المستخدمين الجديدين لم يستطيعوا الحصول على threadلهم، طبعا .. بالنهاية انت تتعامل مع threads في معالج في سيرفر والسيرفر باضخم حالاته سيكون محدود الموارد.
هذا ما ادى لنقلهم من استخدام threaded servers مثل apache الى استخدام event-driven serversمثل node.
حسنا هل هذا يعني ان هذا الاسلوب سيئ؟ ايضا ليس دائما.كل مشكلة لها حل وكل مشروع له اسلوبه في العمل، حيث انه الان تم تطوير لغات البرمجة ليصبح هناك قدرة على حل هذه المشاكل.
انواع لغات البرمجة (بناء على تعاملها مع الthreads في الserver)
- تعمل ك threaded servers(multi threads): والتي تعطي لكل مستخدم مسلك يعمل به وتعتبر بطبيعتها قوية في التعامل مع المعالج.
- تعمل ك event-driven servers(single thread): والتي تستخدم مسلك لكل المستخدمين وتعتبر بطبيعتها قوية في التعامل مع الشبكات (network multi requests).
الthread pool و node js
الthread pool هو نفس ما تكلمت عنه ونفس صورة البوست لكن ب threadsمحددين، مثل node jsبطبيعتها افتراضيا تحوي 4 threads في الthread pool الذي بالنسبة ل node js يديره الlibuv ويمكن تكبيره بحدود معينة (سنتكلم عنها لاحقا).
ما يعني انه لا يمكن فتح اكثر من ذلك مسالك، وانه سيتم تقسيم الطلبات الزائدة على هذه المسالك بالتساوي.
وهذا ما يعني ايضا ان node js تعتبر CPU insensitiveلانها single threaded(حيث انها تتعامل مع عمليات الI/O بشكل تسلسلي في مسلك واحد يتم ادارته من قبل الevent loopوlibuvاما ال4 threads التي تكلمنا عنهم ف هم ما تدعمهم هذه اللغة من نظام التشغيل الذي هو سيديرهم)، وسنشرح عن هذا الموضوع وكيف تم تحسينه لتصبح قادرا على انشاء CPU sensitive app باستخدام node js وكيف تم التعامل معه قريبا.
الخاتمة
عالم نظم التشغيل والمعالجات عالم كبير وشيق ومهم.
و ان فهم كيفية عمل لغات البرمجة واخذ فكرة مبدأية عن عمل الthreads سيفتح لك افاق كبيرة في مجال البرمجة بالاخص التعامل مع الhardware.
حيث اذا كنت مثلا تخطط لبناء نظام تحكم ب روبوت ف هناك عمليات ستحتاج لنظام عمل معين ستنجزها بشكل افضل عندما تفهم كيف تعمل نواة لغة البرمجة مع المعالج.
وبنفس الطريقة سيكون الوضع عندما تنشئ مشروعا يتعامل مع قواعد البيانات والانترنت.