لو فاتك درس ال threads فى ال os تعالى افتكره فى الثريد ده 😅
عشوائيات ال threads
اى operating system فيه scheduler
و عشان تفهم ازاى ال schedulers بتشتغل لازم تبقى عارف ان preemptive او ممكن تقول عليه non-deterministic و ده معناه ان لما OS Scheduler ياخد قرار احنا مش عندنا مقدرة نتنبأ بالقرار كل ال instructions ليها نفس الاحتمالات
دلوقتى لما تيجى تشغل برنامج ال OS هيخلق Process ممكن تفكر فيها على انها container للبرنامج بتاعك فيه كل الحاجات اللى البرنامج هيحتاجها
عشوائيات ال threads
اى operating system فيه scheduler
و عشان تفهم ازاى ال schedulers بتشتغل لازم تبقى عارف ان preemptive او ممكن تقول عليه non-deterministic و ده معناه ان لما OS Scheduler ياخد قرار احنا مش عندنا مقدرة نتنبأ بالقرار كل ال instructions ليها نفس الاحتمالات
دلوقتى لما تيجى تشغل برنامج ال OS هيخلق Process ممكن تفكر فيها على انها container للبرنامج بتاعك فيه كل الحاجات اللى البرنامج هيحتاجها
فى حاجتين مهمين جدا بتحصل عليهم اى process
الحاجة الأولى هى ال memory و بتاخدها على حسب ال OS architecture ال process بتبقى فاكراها memory حقيقية بس هى virtual
و الحاجة التانية هى ال main thread و لما بتموت ال process بيحصلها shutdown
الحاجة الأولى هى ال memory و بتاخدها على حسب ال OS architecture ال process بتبقى فاكراها memory حقيقية بس هى virtual
و الحاجة التانية هى ال main thread و لما بتموت ال process بيحصلها shutdown
ال main thread بتمثل path of execution
و فكر فيها كدة انت بتكتب كود الكود بيتحول ل machine code اللى بتترجم فى الآخر ل machine instructions
و طبعاً ال instructions دى بتتنفذ فى linear fashion حتى ال jump instruction
و من لازم تشوف الصورة كاملة ان الوظيفة الرئيسية لل main thread انها تدير ال linear path و ده كمان اللى بتشوفه فى ال stat trace
هتلاقى ان كل program counter بيوريك ايه اللى حصل بالظبط فى تنفيذ ال instruction على مستوى ال hardware كمان
و فكر فيها كدة انت بتكتب كود الكود بيتحول ل machine code اللى بتترجم فى الآخر ل machine instructions
و طبعاً ال instructions دى بتتنفذ فى linear fashion حتى ال jump instruction
و من لازم تشوف الصورة كاملة ان الوظيفة الرئيسية لل main thread انها تدير ال linear path و ده كمان اللى بتشوفه فى ال stat trace
هتلاقى ان كل program counter بيوريك ايه اللى حصل بالظبط فى تنفيذ ال instruction على مستوى ال hardware كمان
و من هنا نتأكد ان ال schedulers مش مهتمة بال processes بس مهتمة بال path of execution
عشان كدة ال scheduler بياخد كل instruction و يشغلها على core لحد ما يقرر ان يوقفها
و فى اللحظة دى بيعمل context switching و بيشغل process تانية بسلطاتها و بابا غنوجها
زى ما انتوا شايفين كدة ان الموضوع مكلف جدا و ال context switching غالى جدا
عشان كدة ال scheduler بياخد كل instruction و يشغلها على core لحد ما يقرر ان يوقفها
و فى اللحظة دى بيعمل context switching و بيشغل process تانية بسلطاتها و بابا غنوجها
زى ما انتوا شايفين كدة ان الموضوع مكلف جدا و ال context switching غالى جدا
غير انه كمان لازم يعمل save for current state قبل ما يعمل context switching عشان لما يرجعها تشتغل تانى تشتغل من المكان اللى المفروض تشتغل منه.
المشكلة دى فضلت موجودة لحد ٢٠٠٤ لما ظهر ال multi core و ظهر مصطلح اى the less is more
و بعد لما ظهر ال multi core ظهرت مشكلة تانية و هى ان فى cores بتبقى idle حتى لو لأجزاء من الف من الثانية
ولما ظهرت ال golang بال concurrency model بتاعها قدرت انها تتغلب على المشكلة دى بأفضل طريقة ممكنة
و ان شاء الله نبقى نتكلم عنها فى ثريد تانى
أنا طبعا بحاول اقفل الموضوع قفلة شيك عشان هو فعلا موضوع كبير و محتاج وقت بس أهى دردشة لذيذة
المشكلة دى فضلت موجودة لحد ٢٠٠٤ لما ظهر ال multi core و ظهر مصطلح اى the less is more
و بعد لما ظهر ال multi core ظهرت مشكلة تانية و هى ان فى cores بتبقى idle حتى لو لأجزاء من الف من الثانية
ولما ظهرت ال golang بال concurrency model بتاعها قدرت انها تتغلب على المشكلة دى بأفضل طريقة ممكنة
و ان شاء الله نبقى نتكلم عنها فى ثريد تانى
أنا طبعا بحاول اقفل الموضوع قفلة شيك عشان هو فعلا موضوع كبير و محتاج وقت بس أهى دردشة لذيذة
جاري تحميل الاقتراحات...