Ahmed Aljaberi
Ahmed Aljaberi

@ahmed_aljabri

14 تغريدة 47 قراءة Jul 23, 2020
هل استخدام الTheading او الThreads في برامجي جيد ؟ هل يسرعها حقيقة ؟ هل كلما استخدمت Threads أكثر كلما كان برنامجي أسرع ؟ ماهو العدد الأقصى Threads التي يمكنني استخدامها في برنامجي ؟ ماهو الThread اصلاً ؟؟ و ما إجابة السؤال في التغريدة السابقة؟
( سلسلة )
لتشغيل أي برنامج نحتاج إلى ذاكرة و إلى معالج , انظمة التشغيل قامت بعمل Virtualization ( خلقت وهماً ) بأن اعطت كل برنامج ذاكرة ( مساحة ) و معالج ( زمن ) خاص به ,
مساحته الخاصة من الذاكرة كـ Process
و وقته من المعالج كـ Thread
بهذا اصبحت البرامج تتعامل مع هذه الProcess ككمبيوترها الخاص بها وحدها. بحيث لو اخفقت احد البرامج الأخرى فلن تتأثر بذلك. فالProcess و بداخلها الThreads الهدف الاساسي منها هي عزل البرامج عن بعضها بحيث لا تؤثر على بعضها و "يعلّق" الكمبيوتر فتعطيه الثبات لا السرعة كما يعتقد البعض.
لما ظهرت المعالجات ذوات الأنوية Cores افادت الThreads ببعض السرعة من حيث وزعت العمل على 4 او 8 معالجات اصغر بدل المعالج الواحد الكبير. لكن هذه ميزة ليست مجانية فهناك تكاليف من الذاكرة و السرعة.
في ويندوز مثلاً و لل.net على وجه الخصوص كل Thread جديد يأخذ حوالي 1 ميجابايت من الذاكرة و يعطيك لحد حوالي 1500 او اكثر بقليل threads للProcess الواحدة إلى أن تستنفذ ذاكرة الProcess. و تظهر رسالة Out of Memory. هذا يختلف من جهاز لجهاز. لأبسط اكثر:
اولاً تصميم الكمبيوتر و تصميم نظم التشغيل و اللغات تعتمد على افكار منطقية و حلول بسيطة مأخوذة من عالمنا الواقعي, لا يوجد سحر. هذه بعض الأمثلة لنفهم الThreads:
قبل انظمة التشغيل , كان الكمبيوترات لها مستخدم واحد فقط هو المشغل و كان المبرمجين يقدمون برامجهم عبر حجز مواعيد مسبقة قد تأخذ شهوراً لأن الكمبيوتر ينهي فقط برنامج واحد في كل مرة . لكن مع ظهور انظمة التشغيل اختلف الأمر.
تخيل أن لديك معاملة بها 8 اوراق تريد تخليصها و تقف في طابور واحد فيه 10 مراجعين و شباك لموظف واحد "نفسية" و لك الحق ان ترفع يدك بورقة واحدة فقط في كل مرة ليأخذها الموظف و يعالجها. لوحصلت مشكلة مع احد المراجعين فيسطردكم الموظف جميعاً.
قدرة الموظف ان يأخذ ورقة ورقة منكم هذه بفضل تقنية الContext Switches اصبح الموظف ياخذ من كل مراجع ورقة واحدة فقط و لا يحق للمراجع ان يقدم اكثر من ورقة في نفس الوقت او في نفس الround
عندما ظهرت تقنية الThreading و الProcess اصبح بأمكان كل مراجع ان يرفع في نفس الوقت ورقتين او ثلاث او اكثر , لكن هذا سياخذ نفس الوقت في معالجة كل ورقة. ماحصل فقط هو ان الموظف اصبح اكثر تفهماً و عندما تحدث مشكلة مع احد المراجعين يطرده وحده و ليس الكل.
لكن عندما ظهرت المعالجات ذات الأنوية cores كانت بمثابة اضافة موظفين اضافيين ليخدموا المراجعين. اصبح تخليص المعاملات اسرع , اذا موظفين اثنين سيكون نصف الوقت و اذا اربعة ربع الوقت. لكن ماالذي يحدث لو رفعت اوراقك الثمانية في نفس الوقت و ليس هناك سوى 4 موظفين ؟!
ستعود للحالة السابقة بأن على احد الموظفين ان يعالج ورقتين بدل واحدة و بهذا لن يقل الوقت اكثر من ربع الوقت الذي تحدثنا عنه. فالThread ليست حل مثالي لزيادة سرعة البرامج و يجب التعامل معها بحذر , الخلاصة :
ا
اذا لديك كمبيوتر فيه 8 انوية و اردت تسريع برنامجك فانشيء ثمانية Threads لا اكثر. اي لا تتعدى عدد الCores في معالج الجهاز. و تذكر ان الThread عبارة عن وقت على المعالج , يكلف كهرباء ( بطارية اللابتوب) و يزيد حرارة المعالج و في نفس الوقت يستهلك الذاكرة كما ذكرت في البداية. طيب؟
غداً سأكتب عن المزامنة و الAsync و الذي هو مجرد Thread لكن مستخدم بطريقة صحيحة يُدار عن طريق نظام التشغيل ستكون هذه سلسلة الغد بإذن الله و نجيب بها ايضاً على سؤال الnodejs في التغريدة السابقة و نكتشف بعض دهاليز الويندوز و نشير للمقابل في لينكس و ماك.
و دمتم.

جاري تحميل الاقتراحات...