بنناجح
المرحلة 1: مقدمة: نظام التشغيل بيعمل إيه؟ · الدرس 2 من 6 · 20 دقيقة

CPU واحد لمئات البرامج

السيرفر عنده 4 Cores، وعليه 300 Process شغالين. كل واحد فيهم بيتصرف كأن الـ CPU بتاعه لوحده. الدرس ده بيوريك الخدعة: تقسيم الوقت، والـ Context Switch، والفرق بين الآلية اللي بتبدّل بين البرامج والسياسة اللي بتقرر مين يشتغل.

في الدرس ده هتتعلم
  • تشوف عدد الـ Processes الحقيقي على جهازك وتقارنه بعدد الـ Cores
  • تفهم الـ Time Sharing والـ Context Switch
  • تفرّق بين الـ Mechanism والـ Policy
  • تقرا الـ Load Average وتفهم معناه

1. اعدّ بنفسك

Terminal
$ nproc                 # عدد الـ CPU cores اللي نظام التشغيل شايفها
4
$ ps -e --no-headers | wc -l     # عدد الـ Processes الشغالة دلوقتي
312
$ cat /proc/loadavg
0.84 1.12 1.05 2/1203 48211

4 Cores و 312 Process. ولو فتحت top هتلاقي إن أغلبهم في حالة S (Sleeping): مستنيين حاجة (Request على الشبكة، ضغطة زرار، ملف). وفي أي لحظة، عدد صغير بس هو اللي عايز الـ CPU فعلاً. بس حتى العدد الصغير ده ممكن يبقى أكبر من عدد الـ Cores، وكل واحد فيهم لازم يحس إنه شغال.

2. الخدعة: تقسيم الوقت

زي مدرّس واحد بيصحح ورق 30 طالب: بدل ما يخلّص ورقة واحدة كاملة وباقي الطلاب مستنيين، بيصحح سؤال من كل ورقة بالدور. محدش فيهم بيخلص أسرع، بس كلهم شايفين إن ورقتهم بتتحرك.

بس عشان يوقف برنامج ويرجعله بعدين من نفس النقطة، لازم يحفظ كل حاجة البرنامج كان شغال بيها: مكانه في الكود، وقيم الـ Registers، ومين الملفات اللي فاتحها. وده اسمه Context Switch.

الـ CPU بيتنقل بين برنامجينجرّب بنفسك
في الداتابيزCPU شغال على—PC—الوقت0ms
Process A · php-fpm⏱Process B · gzip backup
  1. يحسب صفحة الـ Dashboard…شغال1
  2. ⏰ Timer Interruptعدّى 4ms
  3. Context Switch: احفظ A ← رجّع Bميكروثواني
  4. 4يضغط بلوك من ملف الـ Backup…شغال
  5. ⏰ Timer Interruptعدّى 4ms
  6. Context Switch: احفظ B ← رجّع A
  7. يكمّل الصفحة من 0x4f10…شغال7
▶

دوس ▶ شغّل، أو امشي خطوة خطوة بالأسهم.

الـ CPU مش بيتقسم بالمساحة، بيتقسم بالوقت. والـ Timer Interrupt هو اللي بيرجّع التحكم لنظام التشغيل، حتى لو البرنامج مش عايز يسيب.

3. الآلية والسياسة

في اللي فات فيه سؤالين مختلفين خالص:

السؤال مثال
Mechanism (آلية) إزاي أبدّل من برنامج لبرنامج؟ الـ Timer Interrupt، وحفظ الـ Registers ورجوعها
Policy (سياسة) مين يشتغل دلوقتي؟ ولكام وقت؟ الأولوية للبرنامج التفاعلي؟ ولا للي استنى أكتر؟ ولا بالعدل لكل واحد؟

فصل الاتنين عن بعض فكرة تصميم بتتكرر في نظم التشغيل كلها: نفس الآلية بتشتغل مع سياسات كتير. وفي Linux، الـ Scheduler الافتراضي (CFS، وبعده EEVDF من Linux 6.6) هو السياسة، وتقدر تأثر عليه من بره:

Terminal
# شغّل الـ Backup بأولوية أقل، عشان مايضايقش الـ php-fpm اللي بيخدم الزوار
$ nice -n 19 gzip -9 big-backup.sql

# أو غيّر أولوية Process شغالة فعلاً (رقمها 48211)
$ renice -n 10 -p 48211

والـ Scheduling ليه مرحلة كاملة في الكورس، لأن السؤال “مين يشتغل دلوقتي؟” أصعب بكتير مما يبان.

4. الـ Load Average

الأرقام التلاتة الأولى في /proc/loadavg (أو أول سطر في top و uptime) هي متوسط عدد الـ Processes اللي عايزة CPU (شغالة أو مستنية دورها) في آخر دقيقة، و 5 دقايق، و 15 دقيقة.

الـ Load على 4 Cores معناه
حوالي 1 Core واحد مشغول في المتوسط، والباقي فاضي
حوالي 4 كل الـ Cores مشغولة، ومحدش مستني كتير
حوالي 12 كل Core عليه 3 Processes عايزين يشتغلوا: كل واحد بياخد تلت الوقت بس، والطلبات بتبطأ

ملحوظة خاصة بـ Linux: الـ Load كمان بيعدّ الـ Processes المستنية I/O من الديسك (حالة D)، فممكن يبقى عالي والـ CPU فاضي لو الديسك بطيء.

الـ Load Average = طول الطابور قدام الـ CPU. قارنه دايماً بعدد الـ Cores، مش برقم ثابت.

5. أسئلة

فكّر في إجابتك الأول، وبعدين افتح السؤال.

01إزاي سيرفر عليه 4 Cores بيشغّل مئات الـ Processes؟

بالـ Time Sharing: نظام التشغيل بيدّي كل Process الـ CPU فترة قصيرة وبعدين يبدّل لغيرها بالدور، والتبديل سريع فكلهم يبانوا شغالين. وكمان أغلب الـ Processes أصلاً نايمة مستنية I/O ومش عايزة CPU.

02يعني إيه Context Switch؟

إن نظام التشغيل يوقف Process ويحفظ حالتها (الـ Registers ومكانها في الكود)، ويرجّع حالة Process تانية عشان تكمّل من مكان ما وقفت. ليه تكلفة صغيرة، فلو حصل كتير جداً بيضيّع وقت الـ CPU.

03إيه اللي بيمنع برنامج فيه while(true) من إنه يحتكر الـ CPU؟

الـ Timer Interrupt: نظام التشغيل بيظبط Timer في الـ Hardware قبل ما يدّي الـ CPU لأي برنامج، ولما يضرب الـ CPU بيرجع للـ Kernel غصب عن البرنامج، والـ Kernel يقرر يكمّل معاه ولا يدّي غيره.

04الفرق بين Mechanism و Policy؟

الـ Mechanism هو إزاي بتعمل الحاجة، زي إزاي بتبدّل بين الـ Processes. الـ Policy هي القرار، زي مين يشتغل دلوقتي ولكام وقت. فصلهم بيخلّي نفس الآلية تشتغل مع سياسات مختلفة.

05الـ Load Average بتاع السيرفر 8، والسيرفر عليه 8 Cores. ده كويس ولا وحش؟

في الحدود: كل الـ Cores مشغولة تقريباً من غير طابور كبير. لو زاد عن 8 باستمرار يبقى فيه Processes مستنية دورها والطلبات بتبطأ. وفي Linux خد بالك إن الرقم بيعدّ كمان اللي مستني الديسك، فبص على %wa في top.

علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.